Skip to content

Commit 5f7847b

Browse files
committed
Opprettet eget interface for regler
1 parent 86ba9e6 commit 5f7847b

File tree

8 files changed

+189
-84
lines changed

8 files changed

+189
-84
lines changed

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt

+3-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import no.nav.paw.arbeidssokerregisteret.RequestScope
77
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.navAnsattTilgangFakta
88
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.tokenXPidFakta
99
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.*
10-
import no.nav.paw.arbeidssokerregisteret.application.regler.standardTilgangsregel
11-
import no.nav.paw.arbeidssokerregisteret.application.regler.tilgangsReglerIPrioritertRekkefolge
10+
import no.nav.paw.arbeidssokerregisteret.application.regler.TilgangsRegler
1211
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
1312
import no.nav.paw.arbeidssokerregisteret.services.AutorisasjonService
1413
import no.nav.paw.arbeidssokerregisteret.services.PersonInfoService
@@ -32,7 +31,7 @@ class RequestValidator(
3231
} else {
3332
emptySet()
3433
}
35-
return tilgangsReglerIPrioritertRekkefolge.evaluer(defaultRegel = standardTilgangsregel, autentiseringsFakta)
34+
return TilgangsRegler.evaluer(autentiseringsFakta)
3635
}
3736

3837
context(RequestScope)
@@ -45,8 +44,7 @@ class RequestValidator(
4544
.flatMap { tilgangsResultat ->
4645
val person = personInfoService.hentPersonInfo(identitetsnummer.verdi)
4746
val opplysning = person?.let { genererPersonFakta(it) } ?: setOf(DomeneOpplysning.PersonIkkeFunnet)
48-
reglerForInngangIPrioritertRekkefolge.evaluer(
49-
defaultRegel = standardInngangsregel,
47+
InngangsRegler.evaluer(
5048
opplysning + tilgangsResultat.opplysning
5149
)
5250
}

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/regler/TilgangsRegler.kt

+28-25
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,37 @@ import no.nav.paw.arbeidssokerregisteret.application.*
44
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.*
55
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning
66

7-
val tilgangsReglerIPrioritertRekkefolge: List<Regel> = listOf(
8-
AnsattHarTilgangTilBruker(
9-
AuthOpplysning.AnsattTilgang,
10-
vedTreff = ::grunnlagForGodkjenning
11-
),
12-
IkkeAnsattOgForhaandsgodkjentAvAnsatt(
13-
DomeneOpplysning.ErForhaandsgodkjent,
14-
AuthOpplysning.IkkeAnsatt,
15-
vedTreff = ::skalAvises
16-
),
17-
EndreEgenBruker(
18-
AuthOpplysning.SammeSomInnloggetBruker,
19-
AuthOpplysning.IkkeAnsatt,
20-
vedTreff = ::grunnlagForGodkjenning
21-
),
22-
EndreForAnnenBruker(
23-
AuthOpplysning.IkkeSammeSomInnloggerBruker,
24-
vedTreff = ::skalAvises
25-
),
26-
AnsattIkkeTilgangTilBruker(
27-
AuthOpplysning.AnsattIkkeTilgang,
7+
object TilgangsRegler: Regler {
8+
override val regler: List<Regel> = listOf(
9+
AnsattHarTilgangTilBruker(
10+
AuthOpplysning.AnsattTilgang,
11+
vedTreff = ::grunnlagForGodkjenning
12+
),
13+
IkkeAnsattOgForhaandsgodkjentAvAnsatt(
14+
DomeneOpplysning.ErForhaandsgodkjent,
15+
AuthOpplysning.IkkeAnsatt,
16+
vedTreff = ::skalAvises
17+
),
18+
EndreEgenBruker(
19+
AuthOpplysning.SammeSomInnloggetBruker,
20+
AuthOpplysning.IkkeAnsatt,
21+
vedTreff = ::grunnlagForGodkjenning
22+
),
23+
EndreForAnnenBruker(
24+
AuthOpplysning.IkkeSammeSomInnloggerBruker,
25+
vedTreff = ::skalAvises
26+
),
27+
AnsattIkkeTilgangTilBruker(
28+
AuthOpplysning.AnsattIkkeTilgang,
29+
vedTreff = ::skalAvises
30+
)
31+
)
32+
33+
override val standardRegel: Regel = IkkeTilgang(
2834
vedTreff = ::skalAvises
2935
)
30-
)
3136

32-
val standardTilgangsregel = IkkeTilgang(
33-
vedTreff = ::skalAvises
34-
)
37+
}
3538

3639
sealed interface AuthRegelId: RegelId
3740

apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/TilgansReglerTest.kt

+3-8
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,12 @@ import no.nav.paw.arbeidssokerregisteret.application.*
99
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.AnsattTilgang
1010
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.IkkeAnsatt
1111
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning
12-
import no.nav.paw.arbeidssokerregisteret.application.regler.AnsattHarTilgangTilBruker
13-
import no.nav.paw.arbeidssokerregisteret.application.regler.IkkeAnsattOgForhaandsgodkjentAvAnsatt
14-
import no.nav.paw.arbeidssokerregisteret.application.regler.standardTilgangsregel
15-
import no.nav.paw.arbeidssokerregisteret.application.regler.tilgangsReglerIPrioritertRekkefolge
12+
import no.nav.paw.arbeidssokerregisteret.application.regler.*
1613

1714
class TilgansReglerTest : FreeSpec({
1815
"eval av tilgang skal gi" - {
1916
"ugydlig request ved IKKE_ANSATT kombinert med GODKJENT_AV_ANSATT" {
20-
val resultat = tilgangsReglerIPrioritertRekkefolge.evaluer(
21-
standardTilgangsregel,
17+
val resultat = TilgangsRegler.evaluer(
2218
setOf(
2319
IkkeAnsatt,
2420
DomeneOpplysning.ErForhaandsgodkjent
@@ -28,8 +24,7 @@ class TilgansReglerTest : FreeSpec({
2824
resultat.value.opplysning shouldContainAll listOf(IkkeAnsatt, DomeneOpplysning.ErForhaandsgodkjent)
2925
}
3026
"lovlig kombinasjon av ANSATT og FORHANDSGODKJENT_AV_ANSATT" {
31-
val resultat = tilgangsReglerIPrioritertRekkefolge.evaluer(
32-
standardTilgangsregel,
27+
val resultat = TilgangsRegler.evaluer(
3328
setOf(
3429
AnsattTilgang,
3530
DomeneOpplysning.ErForhaandsgodkjent
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package no.nav.paw.arbeidssokerregisteret.testdata
2+
3+
import io.kotest.common.runBlocking
4+
import io.ktor.http.*
5+
import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.AarsakTilAvvisning
6+
import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.ApiRegelId
7+
import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.Feil
8+
import no.nav.paw.arbeidssokerregisteret.*
9+
import no.nav.paw.arbeidssokerregisteret.application.IkkeBosattINorgeIHenholdTilFolkeregisterloven
10+
import no.nav.paw.arbeidssokerregisteret.intern.v1.Avvist
11+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Bruker
12+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.BrukerType
13+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Opplysning
14+
import no.nav.paw.kafkakeygenerator.client.KafkaKeysClient
15+
import no.nav.paw.pdl.graphql.generated.hentperson.Foedsel
16+
import no.nav.paw.pdl.graphql.generated.hentperson.Person
17+
import no.nav.paw.pdl.graphql.generated.hentperson.UtenlandskAdresse
18+
import org.apache.kafka.clients.producer.ProducerRecord
19+
import java.time.Instant
20+
import java.time.ZoneId
21+
import java.time.format.DateTimeFormatter
22+
import java.util.*
23+
import no.nav.paw.arbeidssoekerregisteret.api.startstopp.models.Opplysning as ApiOpplysning
24+
25+
data object NorskBrukerBosattISverigeUnder18aar : TestCase {
26+
val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
27+
.withZone(ZoneId.systemDefault())
28+
val yearFormatter = DateTimeFormatter.ofPattern("yyyy")
29+
.withZone(ZoneId.systemDefault())
30+
override val id = "12345678909"
31+
override val person = Person(
32+
foedsel = Instant.now().let { dato ->
33+
Foedsel(
34+
dateFormatter.format(dato),
35+
yearFormatter.format(dato).toInt()
36+
).list()
37+
},
38+
statsborgerskap = "NOR".statsborgerskap(),
39+
opphold = emptyList(),
40+
folkeregisterpersonstatus = ikkeBosatt.folkeregisterpersonstatus(),
41+
bostedsadresse = bostedsadresse(
42+
utenlandskAdresse = UtenlandskAdresse(landkode = "SWE")
43+
),
44+
innflyttingTilNorge = emptyList(),
45+
utflyttingFraNorge = "2017-01-02".utflytting()
46+
)
47+
48+
override val configure: TestCaseBuilder.() -> Unit = {
49+
authToken = mockOAuth2Server.personToken(id)
50+
}
51+
52+
override val producesHttpResponse: HttpStatusCode = HttpStatusCode.Forbidden
53+
override val producesError: Feil = Feil(
54+
melding = IkkeBosattINorgeIHenholdTilFolkeregisterloven.beskrivelse,
55+
feilKode = Feil.FeilKode.AVVIST,
56+
aarsakTilAvvisning = AarsakTilAvvisning(
57+
beskrivelse = IkkeBosattINorgeIHenholdTilFolkeregisterloven.beskrivelse,
58+
regel = ApiRegelId.IKKE_BOSATT_I_NORGE_I_HENHOLD_TIL_FOLKEREGISTERLOVEN,
59+
detaljer = listOf(
60+
ApiOpplysning.ER_UNDER_18_AAR,
61+
ApiOpplysning.HAR_UTENLANDSK_ADRESSE,
62+
ApiOpplysning.HAR_REGISTRERT_ADRESSE_I_EU_EOES,
63+
ApiOpplysning.SISTE_FLYTTING_VAR_UT_AV_NORGE,
64+
ApiOpplysning.ER_NORSK_STATSBORGER,
65+
ApiOpplysning.ER_EU_EOES_STATSBORGER,
66+
ApiOpplysning.IKKE_ANSATT,
67+
ApiOpplysning.SAMME_SOM_INNLOGGET_BRUKER,
68+
ApiOpplysning.INGEN_INFORMASJON_OM_OPPHOLDSTILLATELSE,
69+
ApiOpplysning.IKKE_BOSATT
70+
)
71+
)
72+
)
73+
74+
override fun producesRecord(
75+
kafkaKeysClient: KafkaKeysClient
76+
) = ProducerRecord(
77+
"any",
78+
runBlocking { kafkaKeysClient.getIdAndKey(id).key },
79+
Avvist(
80+
hendelseId = UUID.randomUUID(),
81+
id = runBlocking { kafkaKeysClient.getIdAndKey(id).id },
82+
identitetsnummer = id,
83+
metadata = no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Metadata(
84+
tidspunkt = Instant.now(),
85+
kilde = "paw-arbeidssokerregisteret-api-start-stopp-perioder",
86+
utfoertAv = Bruker(
87+
id = id,
88+
type = BrukerType.SLUTTBRUKER
89+
),
90+
aarsak = "any",
91+
tidspunktFraKilde = null
92+
),
93+
opplysninger = setOf(
94+
Opplysning.ER_UNDER_18_AAR,
95+
Opplysning.IKKE_BOSATT,
96+
Opplysning.ER_EU_EOES_STATSBORGER,
97+
Opplysning.HAR_UTENLANDSK_ADRESSE,
98+
Opplysning.HAR_REGISTRERT_ADRESSE_I_EU_EOES,
99+
Opplysning.SISTE_FLYTTING_VAR_UT_AV_NORGE,
100+
Opplysning.IKKE_ANSATT,
101+
Opplysning.SAMME_SOM_INNLOGGET_BRUKER,
102+
Opplysning.INGEN_INFORMASJON_OM_OPPHOLDSTILLATELSE,
103+
Opplysning.ER_NORSK_STATSBORGER
104+
)
105+
)
106+
)
107+
}

apps/utgang-pdl/src/main/kotlin/no/nav/paw/arbeidssoekerregisteret/utgang/pdl/kafka/ScheduleAvsluttPerioder.kt

+2-7
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,8 @@ private fun List<HentPersonBolkResult>.processResultsV2(
148148
.map { hendelseOpplysningTilDomeneOpplysninger(it) as no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning }
149149
.toSet()
150150

151-
val opplysningerEvaluering = reglerForInngangIPrioritertRekkefolge.evaluer(
152-
defaultRegel = standardInngangsregel,
153-
domeneOpplysninger
154-
)
155-
val pdlEvaluering = reglerForInngangIPrioritertRekkefolge.evaluer(
156-
defaultRegel = standardInngangsregel,
157-
genererPersonFakta(person.toPerson())
151+
val opplysningerEvaluering = InngangsRegler.evaluer(domeneOpplysninger)
152+
val pdlEvaluering = InngangsRegler.evaluer(genererPersonFakta(person.toPerson())
158153
)
159154

160155
val erForhaandsgodkjent = hendelseOpplysninger.contains(Opplysning.FORHAANDSGODKJENT_AV_ANSATT)

domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt

+37-35
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,42 @@ package no.nav.paw.arbeidssokerregisteret.application
22

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

5-
val reglerForInngangIPrioritertRekkefolge: List<Regel> = listOf(
6-
IkkeFunnet(
7-
PersonIkkeFunnet,
8-
vedTreff = ::skalAvises
9-
),
10-
Doed(
11-
ErDoed,
12-
vedTreff = ::skalAvises
13-
),
14-
Savnet(
15-
ErSavnet,
16-
vedTreff = ::skalAvises
17-
),
18-
ForhaandsgodkjentAvAnsatt(
19-
ErForhaandsgodkjent,
20-
vedTreff = ::grunnlagForGodkjenning
21-
),
22-
Under18Aar(
23-
ErUnder18Aar,
24-
BosattEtterFregLoven,
25-
vedTreff = ::muligGrunnlagForAvvisning
26-
),
27-
UkjentAlder(
28-
UkjentFoedselsaar,
29-
UkjentFoedselsdato,
30-
vedTreff = ::muligGrunnlagForAvvisning
31-
),
32-
Over18AarOgBosattEtterFregLoven(
33-
ErOver18Aar,
34-
BosattEtterFregLoven,
35-
vedTreff = ::grunnlagForGodkjenning
5+
object InngangsRegler: Regler {
6+
override val regler: List<Regel> = listOf(
7+
IkkeFunnet(
8+
PersonIkkeFunnet,
9+
vedTreff = ::skalAvises
10+
),
11+
Doed(
12+
ErDoed,
13+
vedTreff = ::skalAvises
14+
),
15+
Savnet(
16+
ErSavnet,
17+
vedTreff = ::skalAvises
18+
),
19+
ForhaandsgodkjentAvAnsatt(
20+
ErForhaandsgodkjent,
21+
vedTreff = ::grunnlagForGodkjenning
22+
),
23+
Under18Aar(
24+
ErUnder18Aar,
25+
BosattEtterFregLoven,
26+
vedTreff = ::muligGrunnlagForAvvisning
27+
),
28+
UkjentAlder(
29+
UkjentFoedselsaar,
30+
UkjentFoedselsdato,
31+
vedTreff = ::muligGrunnlagForAvvisning
32+
),
33+
Over18AarOgBosattEtterFregLoven(
34+
ErOver18Aar,
35+
BosattEtterFregLoven,
36+
vedTreff = ::grunnlagForGodkjenning
37+
)
3638
)
37-
)
3839

39-
val standardInngangsregel = IkkeBosattINorgeIHenholdTilFolkeregisterloven(
40-
vedTreff = ::muligGrunnlagForAvvisning
41-
)
40+
override val standardRegel: Regel = IkkeBosattINorgeIHenholdTilFolkeregisterloven(
41+
vedTreff = ::muligGrunnlagForAvvisning
42+
)
43+
}

domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,12 @@ fun Regel.evaluer(samletOpplysning: Iterable<Opplysning>): Boolean = opplysninge
2121
* Evaluerer en liste med regler mot en liste med opplysninger. Returnerer første regel som evalueres til sann,
2222
* eller defaultRegel om ingen regler evalueres til sann.
2323
*/
24-
fun List<Regel>.evaluer(
25-
defaultRegel: Regel,
24+
fun Regler.evaluer(
2625
opplysninger: Iterable<Opplysning>
2726
): Either<Problem, GrunnlagForGodkjenning> =
28-
filter { regel -> regel.evaluer(opplysninger) }
27+
regler.filter { regel -> regel.evaluer(opplysninger) }
2928
.map { regel -> regel.vedTreff(opplysninger) }
30-
.firstOrNull() ?: defaultRegel.vedTreff(opplysninger)
29+
.firstOrNull() ?: standardRegel.vedTreff(opplysninger)
3130

3231
fun domeneOpplysningTilHendelseOpplysning(opplysning: DomeneOpplysning): HendelseOpplysning =
3332
when (opplysning) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package no.nav.paw.arbeidssokerregisteret.application
2+
3+
interface Regler {
4+
val regler: List<Regel>
5+
val standardRegel: Regel
6+
}

0 commit comments

Comments
 (0)