Skip to content

Commit 8c3265a

Browse files
committed
Legg til API for å hente syoveileder for bruker
1 parent f1ea4bf commit 8c3265a

File tree

11 files changed

+183
-0
lines changed

11 files changed

+183
-0
lines changed

.nais/dev.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ spec:
6161
rules:
6262
- application: veilarboppfolging
6363
namespace: poao
64+
- application: syfooversiktsrv
65+
namespace: teamsykefravr
6466
inbound:
6567
rules:
6668
- application: rpa-medlemskap-og-avgift
@@ -85,6 +87,10 @@ spec:
8587
value: "http://veilarboppfolging.poao/veilarboppfolging/api"
8688
- name: OPPFOLGING_SCOPE
8789
value: "dev-gcp:poao:veilarboppfolging"
90+
- name: SYFO_URL
91+
value: "http://syfooversiktsrv.teamsykefravr/syfooversiktsrv/api"
92+
- name: SYFO_SCOPE
93+
value: "dev-gcp:teamsykefravr:syfooversiktsrv"
8894
- name: NOM_URL
8995
value: "https://nom-api.intern.dev.nav.no"
9096
- name: NOM_SCOPE

.nais/prod.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ spec:
6161
rules:
6262
- application: veilarboppfolging
6363
namespace: poao
64+
- application: syfooversiktsrv
65+
namespace: teamsykefravr
6466
inbound:
6567
rules:
6668
- application: rpa-medlemskap-og-avgift
@@ -85,6 +87,10 @@ spec:
8587
value: "http://veilarboppfolging.poao/veilarboppfolging/api"
8688
- name: OPPFOLGING_SCOPE
8789
value: "prod-gcp:poao:veilarboppfolging"
90+
- name: SYFO_URL
91+
value: "http://syfooversiktsrv.teamsykefravr/syfooversiktsrv/api"
92+
- name: SYFO_SCOPE
93+
value: "prod-gcp:teamsykefravr:syfooversiktsrv"
8894
- name: NOM_URL
8995
value: "https://nom-api.intern.nav.no"
9096
- name: NOM_SCOPE

src/main/kotlin/no/nav/Application.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import no.nav.api.kontonummer.configureKontonummerRegisterRoutes
1111
import no.nav.api.oppfolging.configureOppfolgingRoutes
1212
import no.nav.api.pdl.configurePdlRoutes
1313
import no.nav.api.skrivestotte.configureSkrivestotteRoutes
14+
import no.nav.api.syfo.configureSyfoRoutes
1415
import no.nav.api.utbetalinger.configureUtbetalingerRoutes
1516
import no.nav.plugins.*
1617

@@ -39,6 +40,7 @@ fun startApplication(
3940
configureDigdirRoutes(services.digdirService)
4041
configureSkrivestotteRoutes(services.skrivestotteService)
4142
configureUtbetalingerRoutes(services.utbetalingerService)
43+
configureSyfoRoutes(services.syfoService)
4244
}
4345
}
4446
}

src/main/kotlin/no/nav/Consumers.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import no.nav.api.oppfolging.Nom
88
import no.nav.api.oppfolging.OppfolgingClient
99
import no.nav.api.pdl.PdlClient
1010
import no.nav.api.skrivestotte.SkrivestotteClient
11+
import no.nav.api.syfo.SyfoClient
1112
import no.nav.api.utbetalinger.UtbetalingerClient
1213
import no.nav.common.client.nom.NomClient
1314
import no.nav.common.token_client.builder.AzureAdTokenClientBuilder
@@ -19,6 +20,7 @@ interface Consumers {
1920
val tokenclient: MachineToMachineTokenClient
2021
val oboTokenClient: OnBehalfOfTokenClient
2122
val oppfolgingClient: OppfolgingClient
23+
val syfoClient: SyfoClient
2224
val nom: NomClient
2325
val skrivestotteClient: SkrivestotteClient
2426
val pdlClient: PdlClient
@@ -45,6 +47,7 @@ class ConsumersImpl(
4547
.buildMachineToMachineTokenClient()
4648

4749
override val oppfolgingClient: OppfolgingClient = OppfolgingClient(env.oppfolgingUrl, oboTokenClient.bindTo(env.oppfolgingScope))
50+
override val syfoClient: SyfoClient = SyfoClient(env.syfoUrl, oboTokenClient.bindTo(env.syfoScope))
4851
override val nom: NomClient = Nom(env.nomUrl, tokenclient.bindTo(env.nomScope)).client
4952
override val skrivestotteClient: SkrivestotteClient = SkrivestotteClient(env.skrivestotteUrl)
5053
override val pdlClient: PdlClient = PdlClient(env.pdlUrl, oboTokenClient.bindTo(env.pdlScope))

src/main/kotlin/no/nav/Env.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ interface Env {
1212
val jwksUrl: String
1313
val oppfolgingUrl: String
1414
val oppfolgingScope: DownstreamApi
15+
val syfoUrl: String
16+
val syfoScope: DownstreamApi
1517
val nomUrl: String
1618
val nomScope: DownstreamApi
1719
val pdlUrl: String
@@ -34,6 +36,8 @@ class EnvImpl : Env {
3436
override val jwksUrl: String = getRequiredConfig("AZURE_OPENID_CONFIG_JWKS_URI")
3537
override val oppfolgingUrl: String = getRequiredConfig("OPPFOLGING_URL")
3638
override val oppfolgingScope: DownstreamApi = getRequiredConfig("OPPFOLGING_SCOPE").toDownstreamApi()
39+
override val syfoUrl: String = getRequiredConfig("SYFO_URL")
40+
override val syfoScope: DownstreamApi = getRequiredConfig("SYFO_SCOPE").toDownstreamApi()
3741
override val nomUrl: String = getRequiredConfig("NOM_URL")
3842
override val nomScope: DownstreamApi = getRequiredConfig("NOM_SCOPE").toDownstreamApi()
3943
override val pdlUrl: String = getRequiredConfig("PDL_URL")

src/main/kotlin/no/nav/Services.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import no.nav.api.digdir.DigdirService
77
import no.nav.api.oppfolging.OppfolgingService
88
import no.nav.api.pdl.PdlService
99
import no.nav.api.skrivestotte.SkrivestotteService
10+
import no.nav.api.syfo.SyfoService
1011
import no.nav.api.utbetalinger.UtbetalingerService
1112

1213
interface Services {
1314
val oppfolgingService: OppfolgingService
15+
val syfoService: SyfoService
1416
val skrivestotteService: SkrivestotteService
1517
val digdirService: DigdirService
1618
val pdlService: PdlService
@@ -28,6 +30,7 @@ class ServicesImpl(
2830
consumers.oppfolgingClient,
2931
consumers.nom,
3032
)
33+
override val syfoService = SyfoService(consumers.syfoClient, consumers.nom)
3134
override val skrivestotteService = SkrivestotteService(consumers.skrivestotteClient)
3235
override val digdirService = DigdirService(consumers.digdirClient)
3336
override val pdlService = PdlService(consumers.pdlClient)
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package no.nav.api.syfo
2+
3+
import io.ktor.client.*
4+
import io.ktor.client.call.*
5+
import io.ktor.client.engine.okhttp.*
6+
import io.ktor.client.request.*
7+
import io.ktor.http.*
8+
import kotlinx.serialization.Serializable
9+
import no.nav.utils.*
10+
11+
class SyfoClient(
12+
private val syfoUrl: String,
13+
private val oboTokenProvider: BoundedOnBehalfOfTokenClient,
14+
) {
15+
@Serializable
16+
class PersonIdentValue(
17+
val value: String,
18+
)
19+
20+
@Serializable
21+
class SyfoTildeling(
22+
val personIdent: PersonIdentValue,
23+
val tildeltVeilederIdent: String?,
24+
val tildeltenhet: String?,
25+
)
26+
27+
private val client =
28+
HttpClient(OkHttp) {
29+
installContentNegotiationAndIgnoreUnknownKeys()
30+
engine {
31+
addInterceptor(XCorrelationIdInterceptor())
32+
addInterceptor(
33+
LoggingInterceptor(
34+
name = "isyfooversikt",
35+
callIdExtractor = { getCallId() },
36+
),
37+
)
38+
addInterceptor(
39+
HeadersInterceptor {
40+
mapOf(
41+
"Nav-Consumer-Id" to navConsumerId,
42+
)
43+
},
44+
)
45+
}
46+
}
47+
48+
suspend fun hentSyfoVeileder(
49+
fnr: String,
50+
token: String,
51+
): SyfoTildeling? =
52+
externalServiceCall {
53+
val response =
54+
client.get("$syfoUrl/v2/persontildeling/personer/single") {
55+
header("nav-personident", fnr)
56+
header("Authorization", "Bearer ${oboTokenProvider.exchangeOnBehalfOfToken(token)}")
57+
}
58+
when (response.status) {
59+
HttpStatusCode.NoContent -> null
60+
HttpStatusCode.OK -> response.body()
61+
else -> error("Ukjent status code: ${response.status}")
62+
}
63+
}
64+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package no.nav.api.syfo
2+
3+
import io.bkbn.kompendium.core.metadata.PostInfo
4+
import io.bkbn.kompendium.core.plugin.NotarizedRoute
5+
import io.ktor.http.*
6+
import io.ktor.server.response.*
7+
import io.ktor.server.routing.*
8+
import no.nav.api.CommonModels
9+
import no.nav.models.FnrRequest
10+
import no.nav.models.deserializeFnr
11+
import no.nav.utils.getJWT
12+
import kotlin.reflect.typeOf
13+
14+
fun Route.configureSyfoRoutes(syfoService: SyfoService) {
15+
route("syfo/veileder") {
16+
install(NotarizedRoute()) {
17+
post = ApiV1.veileder
18+
}
19+
post {
20+
val payload = call.getJWT()
21+
val fnr = call.deserializeFnr() ?: return@post call.respond(HttpStatusCode.BadRequest)
22+
val veileder = syfoService.hentVeileder(fnr, payload)
23+
call.respond(veileder ?: HttpStatusCode.NoContent)
24+
}
25+
}
26+
}
27+
28+
private object ApiV1 {
29+
val veileder =
30+
PostInfo.builder {
31+
summary("Brukers sykefraværsoppfølgingveileder")
32+
description("Hentes fra isyfo")
33+
request {
34+
requestType(typeOf<FnrRequest>())
35+
description("Brukers ident")
36+
}
37+
response {
38+
responseType(typeOf<SyfoService.Veileder>())
39+
responseCode(HttpStatusCode.OK)
40+
description("Navn og ident til brukers veileder dersom bruker er tildelt veileder")
41+
}
42+
tags("Syfo")
43+
canRespond(CommonModels.standardResponses)
44+
}
45+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package no.nav.api.syfo
2+
3+
import kotlinx.serialization.Serializable
4+
import no.nav.common.client.nom.NomClient
5+
import no.nav.common.types.identer.NavIdent
6+
import no.nav.utils.externalServiceCall
7+
8+
class SyfoService(
9+
private val syfoClient: SyfoClient,
10+
private val nom: NomClient,
11+
) {
12+
@Serializable
13+
class Veileder(
14+
val ident: String,
15+
val fornavn: String,
16+
val etternavn: String,
17+
)
18+
19+
suspend fun hentVeileder(
20+
fnr: String,
21+
token: String,
22+
): Veileder? =
23+
externalServiceCall {
24+
val veileder = syfoClient.hentSyfoVeileder(fnr, token)
25+
veileder
26+
?.tildeltVeilederIdent
27+
?.let { nom.finnNavn(NavIdent(it)) }
28+
?.let {
29+
Veileder(
30+
ident = it.navIdent.get(),
31+
fornavn = it.fornavn,
32+
etternavn = it.etternavn,
33+
)
34+
}
35+
}
36+
}

src/test/kotlin/no/nav/mock/MockConsumers.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import no.nav.api.oppfolging.OppfolgingClient
2626
import no.nav.api.pdl.PdlClient
2727
import no.nav.api.skrivestotte.SkrivestotteClient
2828
import no.nav.api.skrivestotte.SkrivestotteClient.*
29+
import no.nav.api.syfo.SyfoClient
2930
import no.nav.api.utbetalinger.UtbetalingerClient
3031
import no.nav.api.utbetalinger.utbetalinger
3132
import no.nav.common.client.nom.NomClient
@@ -41,6 +42,7 @@ object MockConsumers : Consumers {
4142
override val tokenclient = tokenClientMock
4243
override val oboTokenClient = oboTokenClientMock
4344
override val oppfolgingClient = oppfolgingClientMock
45+
override val syfoClient = syfoClientMock
4446
override val kontonummerRegister = kontonummerRegisterMock
4547
override val nom: NomClient = nomClientMock
4648
override val skrivestotteClient = skrivestotteClientMock
@@ -73,6 +75,16 @@ private val oppfolgingClientMock =
7375
)
7476
}
7577

78+
private val syfoClientMock =
79+
mockOf<SyfoClient> { client ->
80+
coEvery { client.hentSyfoVeileder(any(), any()) } returns
81+
SyfoClient.SyfoTildeling(
82+
personIdent = SyfoClient.PersonIdentValue("10108000398"),
83+
tildeltVeilederIdent = "Z123456",
84+
tildeltenhet = "4403",
85+
)
86+
}
87+
7688
private val kontonummerRegisterMock =
7789
mockOf<KontonummerRegister> { kontonummerRegister ->
7890
coEvery { kontonummerRegister.hentKontonummer(any(), any(), any()) } returns

0 commit comments

Comments
 (0)