Skip to content

Commit

Permalink
La inn versjonerte regler, samt egne 'oppholds' regler
Browse files Browse the repository at this point in the history
  • Loading branch information
nilsmsa committed Sep 10, 2024
1 parent 0e77a2e commit 8a159e0
Show file tree
Hide file tree
Showing 13 changed files with 175 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.ktor.server.routing.*
import io.micrometer.prometheusmetrics.PrometheusConfig
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
import io.opentelemetry.api.trace.Span
import no.nav.paw.arbeidssokerregisteret.application.InngangsReglerV1
import no.nav.paw.arbeidssokerregisteret.application.OpplysningerRequestHandler
import no.nav.paw.arbeidssokerregisteret.application.StartStoppRequestHandler
import no.nav.paw.arbeidssokerregisteret.config.AuthProviders
Expand All @@ -29,7 +30,11 @@ fun main() {
logger.info("Starter ${ApplicationInfo.id}")
val applicationConfig = loadNaisOrLocalConfiguration<Config>(CONFIG_FILE_NAME)
val kafkaConfig = loadNaisOrLocalConfiguration<KafkaConfig>(KAFKA_CONFIG)
val (startStoppRequestHandler, opplysningerRequestHandler) = requestHandlers(applicationConfig, KafkaFactory(kafkaConfig))
val (startStoppRequestHandler, opplysningerRequestHandler) = requestHandlers(
config = applicationConfig,
kafkaFactory = KafkaFactory(kafkaConfig),
regler = InngangsReglerV1
)
val server = embeddedServer(
factory = Netty,
port = 8080,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.paw.arbeidssokerregisteret
import io.ktor.client.*
import no.nav.common.token_client.client.AzureAdMachineToMachineTokenClient
import no.nav.paw.arbeidssokerregisteret.application.OpplysningerRequestHandler
import no.nav.paw.arbeidssokerregisteret.application.Regler
import no.nav.paw.arbeidssokerregisteret.application.StartStoppRequestHandler
import no.nav.paw.arbeidssokerregisteret.application.RequestValidator
import no.nav.paw.arbeidssokerregisteret.config.Config
Expand All @@ -17,7 +18,11 @@ import no.nav.poao_tilgang.client.PoaoTilgangHttpClient
import org.apache.kafka.common.serialization.LongSerializer


fun requestHandlers(config: Config, kafkaFactory: KafkaFactory): Pair<StartStoppRequestHandler, OpplysningerRequestHandler> {
fun requestHandlers(
config: Config,
kafkaFactory: KafkaFactory,
regler: Regler
): Pair<StartStoppRequestHandler, OpplysningerRequestHandler> {
val clients = with(azureAdM2MTokenClient(config.naisEnv, config.authProviders.azure)) {
clientsFactory(config)
}
Expand All @@ -29,7 +34,8 @@ fun requestHandlers(config: Config, kafkaFactory: KafkaFactory): Pair<StartStopp
)
val requestValidator = RequestValidator(
autorisasjonService = AutorisasjonService(clients.poaoTilgangClient),
personInfoService = PersonInfoService(clients.pdlClient)
personInfoService = PersonInfoService(clients.pdlClient),
regler = regler
)
val startStoppRequestHandler = StartStoppRequestHandler(
hendelseTopic = config.eventLogTopic,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.paw.pdl.graphql.generated.hentperson.Person
class RequestValidator(
private val autorisasjonService: AutorisasjonService,
private val personInfoService: PersonInfoService,
private val regler: Regler
) {

context(RequestScope)
Expand Down Expand Up @@ -45,7 +46,7 @@ class RequestValidator(
.flatMap { grunnlagForGodkjentAuth ->
val person = personInfoService.hentPersonInfo(identitetsnummer.verdi)
val opplysning = person?.let { genererPersonFakta(it) } ?: setOf(DomeneOpplysning.PersonIkkeFunnet)
InngangsRegler.evaluer(
regler.evaluer(
opplysning + grunnlagForGodkjentAuth.opplysning
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import io.ktor.server.auth.*
import io.ktor.server.testing.*
import io.mockk.mockk
import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.FeilV2
import no.nav.paw.arbeidssokerregisteret.application.InngangsReglerV2
import no.nav.paw.arbeidssokerregisteret.auth.configureAuthentication
import no.nav.paw.arbeidssokerregisteret.plugins.configureHTTP
import no.nav.paw.arbeidssokerregisteret.plugins.configureSerialization
Expand Down Expand Up @@ -51,7 +52,7 @@ class ApiV2TestCaseRunner : FreeSpec({
val logger = LoggerFactory.getLogger(testCase::class.java)
"Test API V2 ${testCase::class.simpleName?.readable()}" - {
"Verifiser API V2" - {
with(initTestCaseContext()) {
with(initTestCaseContext(InngangsReglerV2)) {
"Verifiser API response" {
testApplication {
application {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.paw.arbeidssokerregisteret

import io.mockk.mockk
import no.nav.paw.arbeidssokerregisteret.application.Regler
import no.nav.paw.arbeidssokerregisteret.application.RequestValidator
import no.nav.paw.arbeidssokerregisteret.application.StartStoppRequestHandler
import no.nav.paw.arbeidssokerregisteret.intern.v1.Hendelse
Expand All @@ -23,7 +24,7 @@ data class TestCaseContext(
val startStoppRequestHandler: StartStoppRequestHandler
)

fun initTestCaseContext(): TestCaseContext {
fun initTestCaseContext(regler: Regler): TestCaseContext {
val autorisasjonService = mockk<AutorisasjonService>()
val personInfoService = mockk<PersonInfoService>()
val producer: ProducerMock<Long, Hendelse> = ProducerMock()
Expand All @@ -32,7 +33,8 @@ fun initTestCaseContext(): TestCaseContext {
hendelseTopic = "any",
requestValidator = RequestValidator(
autorisasjonService = autorisasjonService,
personInfoService = personInfoService
personInfoService = personInfoService,
regler = regler
),
producer = producer,
kafkaKeysClient = kafkaKeys
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class RequestValidatorTest : FreeSpec({
coEvery {
autorisasjonService.verifiserVeilederTilgangTilBruker(any(), any())
} returns true
val requestValidator = RequestValidator(autorisasjonService, personInfoService)
val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2)
"Når forhandsgodkjent av veileder er false" {
val tilgangskontrollresultat = with(requestScope) {
requestValidator.validerTilgang(identitsnummer)
Expand All @@ -68,7 +68,7 @@ class RequestValidatorTest : FreeSpec({
coEvery {
autorisasjonService.verifiserVeilederTilgangTilBruker(any(), any())
} returns false
val requestValidator = RequestValidator(autorisasjonService, personInfoService)
val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2)

val tilgangskontrollresultat = with(requestScope) {
requestValidator.validerTilgang(identitsnummer)
Expand All @@ -86,7 +86,7 @@ class RequestValidatorTest : FreeSpec({
path = "test"
)
val autorisasjonService: AutorisasjonService = mockk()
val requestValidator = RequestValidator(autorisasjonService, personInfoService)
val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2)
"standardbruker" {
val tilgangskontrollresultat = with(requestScope) {
requestValidator.validerTilgang(identitsnummer)
Expand All @@ -110,7 +110,7 @@ class RequestValidatorTest : FreeSpec({
"Når bruker er innlogget" - {

val autorisasjonService: AutorisasjonService = mockk()
val requestValidator = RequestValidator(autorisasjonService, personInfoService)
val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2)
"over 18 år og bosatt etter folketrygdloven" - {
val requestScope = RequestScope(
claims = ResolvedClaims()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ fun scheduleAvsluttPerioder(
pdlHentForenkletStatus: PdlHentForenkletStatus,
pdlHentPersonBolk: PdlHentPerson,
prometheusMeterRegistry: PrometheusMeterRegistry,
regler: Regler
): Cancellable = ctx.schedule(interval, PunctuationType.WALL_CLOCK_TIME) {

val logger = LoggerFactory.getLogger("scheduleAvsluttPerioder")
Expand All @@ -71,8 +72,9 @@ fun scheduleAvsluttPerioder(
emptyList()
} else {
pdlHentPersonResults.processPdlResultsV2(
chunk,
logger
regler = regler,
chunk = chunk,
logger = logger
)
}

Expand Down Expand Up @@ -186,6 +188,7 @@ fun NonEmptyList<Problem>.containsAnyOf(other: NonEmptyList<Problem>): Boolean {
}

fun List<HentPersonBolkResult>.processPdlResultsV2(
regler: Regler,
chunk: List<KeyValue<UUID, HendelseState>>,
logger: Logger
): List<EvalueringResultat> =
Expand All @@ -196,8 +199,8 @@ fun List<HentPersonBolkResult>.processPdlResultsV2(

val domeneOpplysninger = hendelseOpplysninger.toDomeneOpplysninger()

val opplysningerEvaluering = InngangsRegler.evaluer(domeneOpplysninger)
val pdlEvaluering = InngangsRegler.evaluer(genererPersonFakta(person.toPerson()))
val opplysningerEvaluering = regler.evaluer(domeneOpplysninger)
val pdlEvaluering = regler.evaluer(genererPersonFakta(person.toPerson()))

val erForhaandsgodkjent = hendelseOpplysninger.erForhaandsGodkjent()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.clients.pdl.PdlHentPerson
import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.scheduleAvsluttPerioder
import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.serdes.HendelseState
import no.nav.paw.arbeidssokerregisteret.api.v1.Periode
import no.nav.paw.arbeidssokerregisteret.application.OppholdsReglerV1
import no.nav.paw.arbeidssokerregisteret.intern.v1.Hendelse
import org.apache.kafka.streams.kstream.KStream
import org.apache.kafka.streams.kstream.Named
Expand Down Expand Up @@ -52,7 +53,8 @@ class PeriodeProcessor(
Duration.ofHours(1), // TODO: sett tilbake til ofDays(1) etter å ha sammenlignet resultater
pdlHentForenkletStatus,
pdlHentPersonBolk,
prometheusMeterRegistry
prometheusMeterRegistry,
regler = OppholdsReglerV1
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.getHendelseStateAndPe
import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.isPdlResultOK
import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.processPdlResultsV2
import no.nav.paw.arbeidssoekerregisteret.utgang.pdl.kafka.serdes.HendelseState
import no.nav.paw.arbeidssokerregisteret.application.OppholdsReglerV1
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Opplysning
import no.nav.paw.pdl.graphql.generated.hentpersonbolk.Foedsel
import no.nav.paw.pdl.graphql.generated.hentpersonbolk.HentPersonBolkResult
Expand Down Expand Up @@ -50,7 +51,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand Down Expand Up @@ -84,7 +85,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand Down Expand Up @@ -118,7 +119,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand Down Expand Up @@ -154,7 +155,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand Down Expand Up @@ -188,7 +189,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand Down Expand Up @@ -225,7 +226,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
val chunk = listOf(KeyValue(hendelseState.periodeId, hendelseState))

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldHaveSize(1)
val evalueringResultat = output.first()
Expand All @@ -248,7 +249,7 @@ class ProcessPdlResultsV2Test : FreeSpec({

val chunk = listOf<KeyValue<UUID, HendelseState>>()

val output = results.processPdlResultsV2(chunk, logger)
val output = results.processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldBeEmpty()
verify(exactly = 2) { logger.error(any()) }
Expand All @@ -274,7 +275,7 @@ class ProcessPdlResultsV2Test : FreeSpec({
)
)

val output = listOf(result).processPdlResultsV2(chunk, logger)
val output = listOf(result).processPdlResultsV2(OppholdsReglerV1, chunk, logger)

output.shouldBeEmpty()
verify { logger.error("Person er null for periodeId: $periodeId") }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package no.nav.paw.arbeidssokerregisteret.application

import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning.*

object InngangsReglerV1: Regler {
override val regler: List<Regel> = listOf(
IkkeFunnet(
PersonIkkeFunnet,
vedTreff = ::skalAvises
),
Doed(
ErDoed,
vedTreff = ::skalAvises
),
Savnet(
ErSavnet,
vedTreff = ::skalAvises
),
ForhaandsgodkjentAvAnsatt(
ErForhaandsgodkjent,
vedTreff = ::grunnlagForGodkjenning
),
Under18Aar(
ErUnder18Aar,
BosattEtterFregLoven,
vedTreff = ::muligGrunnlagForAvvisning
),
UkjentAlder(
UkjentFoedselsaar,
UkjentFoedselsdato,
vedTreff = ::muligGrunnlagForAvvisning
),
Over18AarOgBosattEtterFregLoven(
ErOver18Aar,
BosattEtterFregLoven,
vedTreff = ::grunnlagForGodkjenning
)
)

override val standardRegel: Regel = IkkeBosattINorgeIHenholdTilFolkeregisterloven(
vedTreff = ::muligGrunnlagForAvvisning
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package no.nav.paw.arbeidssokerregisteret.application
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning.*
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning

object InngangsRegler: Regler {
object InngangsReglerV2: Regler {
override val regler: List<Regel> = listOf(
IkkeFunnet(
PersonIkkeFunnet,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package no.nav.paw.arbeidssokerregisteret.application

import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning.*

object OppholdsReglerV1: Regler {
override val regler: List<Regel> = listOf(
IkkeFunnet(
PersonIkkeFunnet,
vedTreff = ::skalAvises
),
Doed(
ErDoed,
vedTreff = ::skalAvises
),
Savnet(
ErSavnet,
vedTreff = ::skalAvises
),
ForhaandsgodkjentAvAnsatt(
ErForhaandsgodkjent,
vedTreff = ::grunnlagForGodkjenning
),
Under18Aar(
ErUnder18Aar,
vedTreff = ::muligGrunnlagForAvvisning
),
UkjentAlder(
UkjentFoedselsaar,
UkjentFoedselsdato,
vedTreff = ::muligGrunnlagForAvvisning
),
Over18AarOgBosattEtterFregLoven(
ErOver18Aar,
BosattEtterFregLoven,
vedTreff = ::grunnlagForGodkjenning
),
EuEoesStatsborgerOver18Aar(
ErOver18Aar,
ErEuEoesStatsborger,
!ErNorskStatsborger,
vedTreff = ::grunnlagForGodkjenning
),
IkkeBosattINorgeIHenholdTilFolkeregisterloven(
!BosattEtterFregLoven,
ErNorskEllerTredjelandsborger,
vedTreff = ::muligGrunnlagForAvvisning
)
)

override val standardRegel: Regel = IkkeBosattINorgeIHenholdTilFolkeregisterloven(
vedTreff = ::muligGrunnlagForAvvisning
)
}
Loading

0 comments on commit 8a159e0

Please sign in to comment.