Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .nais/dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ spec:
rules:
- application: veilarboppfolging
namespace: poao
- application: syfooversiktsrv
namespace: teamsykefravr
inbound:
rules:
- application: rpa-medlemskap-og-avgift
Expand All @@ -85,6 +87,10 @@ spec:
value: "http://veilarboppfolging.poao/veilarboppfolging/api"
- name: OPPFOLGING_SCOPE
value: "dev-gcp:poao:veilarboppfolging"
- name: SYFO_URL
value: "http://syfooversiktsrv.teamsykefravr/syfooversiktsrv/api"
- name: SYFO_SCOPE
value: "dev-gcp:teamsykefravr:syfooversiktsrv"
- name: NOM_URL
value: "https://nom-api.intern.dev.nav.no"
- name: NOM_SCOPE
Expand Down
6 changes: 6 additions & 0 deletions .nais/prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ spec:
rules:
- application: veilarboppfolging
namespace: poao
- application: syfooversiktsrv
namespace: teamsykefravr
inbound:
rules:
- application: rpa-medlemskap-og-avgift
Expand All @@ -85,6 +87,10 @@ spec:
value: "http://veilarboppfolging.poao/veilarboppfolging/api"
- name: OPPFOLGING_SCOPE
value: "prod-gcp:poao:veilarboppfolging"
- name: SYFO_URL
value: "http://syfooversiktsrv.teamsykefravr/syfooversiktsrv/api"
- name: SYFO_SCOPE
value: "prod-gcp:teamsykefravr:syfooversiktsrv"
- name: NOM_URL
value: "https://nom-api.intern.nav.no"
- name: NOM_SCOPE
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/no/nav/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import no.nav.api.kontonummer.configureKontonummerRegisterRoutes
import no.nav.api.oppfolging.configureOppfolgingRoutes
import no.nav.api.pdl.configurePdlRoutes
import no.nav.api.skrivestotte.configureSkrivestotteRoutes
import no.nav.api.syfo.configureSyfoRoutes
import no.nav.api.utbetalinger.configureUtbetalingerRoutes
import no.nav.plugins.*

Expand Down Expand Up @@ -39,6 +40,7 @@ fun startApplication(
configureDigdirRoutes(services.digdirService)
configureSkrivestotteRoutes(services.skrivestotteService)
configureUtbetalingerRoutes(services.utbetalingerService)
configureSyfoRoutes(services.syfoService)
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/kotlin/no/nav/Consumers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import no.nav.api.oppfolging.Nom
import no.nav.api.oppfolging.OppfolgingClient
import no.nav.api.pdl.PdlClient
import no.nav.api.skrivestotte.SkrivestotteClient
import no.nav.api.syfo.SyfoClient
import no.nav.api.utbetalinger.UtbetalingerClient
import no.nav.common.client.nom.NomClient
import no.nav.common.token_client.builder.AzureAdTokenClientBuilder
Expand All @@ -19,6 +20,7 @@ interface Consumers {
val tokenclient: MachineToMachineTokenClient
val oboTokenClient: OnBehalfOfTokenClient
val oppfolgingClient: OppfolgingClient
val syfoClient: SyfoClient
val nom: NomClient
val skrivestotteClient: SkrivestotteClient
val pdlClient: PdlClient
Expand All @@ -45,6 +47,7 @@ class ConsumersImpl(
.buildMachineToMachineTokenClient()

override val oppfolgingClient: OppfolgingClient = OppfolgingClient(env.oppfolgingUrl, oboTokenClient.bindTo(env.oppfolgingScope))
override val syfoClient: SyfoClient = SyfoClient(env.syfoUrl, oboTokenClient.bindTo(env.syfoScope))
override val nom: NomClient = Nom(env.nomUrl, tokenclient.bindTo(env.nomScope)).client
override val skrivestotteClient: SkrivestotteClient = SkrivestotteClient(env.skrivestotteUrl)
override val pdlClient: PdlClient = PdlClient(env.pdlUrl, oboTokenClient.bindTo(env.pdlScope))
Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/no/nav/Env.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ interface Env {
val jwksUrl: String
val oppfolgingUrl: String
val oppfolgingScope: DownstreamApi
val syfoUrl: String
val syfoScope: DownstreamApi
val nomUrl: String
val nomScope: DownstreamApi
val pdlUrl: String
Expand All @@ -34,6 +36,8 @@ class EnvImpl : Env {
override val jwksUrl: String = getRequiredConfig("AZURE_OPENID_CONFIG_JWKS_URI")
override val oppfolgingUrl: String = getRequiredConfig("OPPFOLGING_URL")
override val oppfolgingScope: DownstreamApi = getRequiredConfig("OPPFOLGING_SCOPE").toDownstreamApi()
override val syfoUrl: String = getRequiredConfig("SYFO_URL")
override val syfoScope: DownstreamApi = getRequiredConfig("SYFO_SCOPE").toDownstreamApi()
override val nomUrl: String = getRequiredConfig("NOM_URL")
override val nomScope: DownstreamApi = getRequiredConfig("NOM_SCOPE").toDownstreamApi()
override val pdlUrl: String = getRequiredConfig("PDL_URL")
Expand Down
3 changes: 3 additions & 0 deletions src/main/kotlin/no/nav/Services.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import no.nav.api.digdir.DigdirService
import no.nav.api.oppfolging.OppfolgingService
import no.nav.api.pdl.PdlService
import no.nav.api.skrivestotte.SkrivestotteService
import no.nav.api.syfo.SyfoService
import no.nav.api.utbetalinger.UtbetalingerService

interface Services {
val oppfolgingService: OppfolgingService
val syfoService: SyfoService
val skrivestotteService: SkrivestotteService
val digdirService: DigdirService
val pdlService: PdlService
Expand All @@ -28,6 +30,7 @@ class ServicesImpl(
consumers.oppfolgingClient,
consumers.nom,
)
override val syfoService = SyfoService(consumers.syfoClient, consumers.nom)
override val skrivestotteService = SkrivestotteService(consumers.skrivestotteClient)
override val digdirService = DigdirService(consumers.digdirClient)
override val pdlService = PdlService(consumers.pdlClient)
Expand Down
64 changes: 64 additions & 0 deletions src/main/kotlin/no/nav/api/syfo/SyfoClient.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package no.nav.api.syfo

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.engine.okhttp.*
import io.ktor.client.request.*
import io.ktor.http.*
import kotlinx.serialization.Serializable
import no.nav.utils.*

class SyfoClient(
private val syfoUrl: String,
private val oboTokenProvider: BoundedOnBehalfOfTokenClient,
) {
@Serializable
class PersonIdentValue(
val value: String,
)

@Serializable
class SyfoTildeling(
val personIdent: PersonIdentValue,
val tildeltVeilederIdent: String?,
val tildeltenhet: String?,
)

private val client =
HttpClient(OkHttp) {
installContentNegotiationAndIgnoreUnknownKeys()
engine {
addInterceptor(XCorrelationIdInterceptor())
addInterceptor(
LoggingInterceptor(
name = "isyfooversikt",
callIdExtractor = { getCallId() },
),
)
addInterceptor(
HeadersInterceptor {
mapOf(
"Nav-Consumer-Id" to navConsumerId,
)
},
)
}
}

suspend fun hentSyfoVeileder(
fnr: String,
token: String,
): SyfoTildeling? =
externalServiceCall {
val response =
client.get("$syfoUrl/v2/persontildeling/personer/single") {
header("nav-personident", fnr)
header("Authorization", "Bearer ${oboTokenProvider.exchangeOnBehalfOfToken(token)}")
}
when (response.status) {
HttpStatusCode.NoContent -> null
HttpStatusCode.OK -> response.body()
else -> error("Ukjent status code: ${response.status}")
}
}
}
45 changes: 45 additions & 0 deletions src/main/kotlin/no/nav/api/syfo/SyfoRoutes.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package no.nav.api.syfo

import io.bkbn.kompendium.core.metadata.PostInfo
import io.bkbn.kompendium.core.plugin.NotarizedRoute
import io.ktor.http.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import no.nav.api.CommonModels
import no.nav.models.FnrRequest
import no.nav.models.deserializeFnr
import no.nav.utils.getJWT
import kotlin.reflect.typeOf

fun Route.configureSyfoRoutes(syfoService: SyfoService) {
route("syfo/veileder") {
install(NotarizedRoute()) {
post = ApiV1.veileder
}
post {
val payload = call.getJWT()
val fnr = call.deserializeFnr() ?: return@post call.respond(HttpStatusCode.BadRequest)
val veileder = syfoService.hentVeileder(fnr, payload)
call.respond(veileder ?: HttpStatusCode.NoContent)
}
}
}

private object ApiV1 {
val veileder =
PostInfo.builder {
summary("Brukers sykefraværsoppfølgingveileder")
description("Hentes fra isyfo")
request {
requestType(typeOf<FnrRequest>())
description("Brukers ident")
}
response {
responseType(typeOf<SyfoService.Veileder>())
responseCode(HttpStatusCode.OK)
description("Navn og ident til brukers veileder dersom bruker er tildelt veileder")
}
tags("Syfo")
canRespond(CommonModels.standardResponses)
}
}
36 changes: 36 additions & 0 deletions src/main/kotlin/no/nav/api/syfo/SyfoService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package no.nav.api.syfo

import kotlinx.serialization.Serializable
import no.nav.common.client.nom.NomClient
import no.nav.common.types.identer.NavIdent
import no.nav.utils.externalServiceCall

class SyfoService(
private val syfoClient: SyfoClient,
private val nom: NomClient,
) {
@Serializable
class Veileder(
val ident: String,
val fornavn: String,
val etternavn: String,
)

suspend fun hentVeileder(
fnr: String,
token: String,
): Veileder? =
externalServiceCall {
val veileder = syfoClient.hentSyfoVeileder(fnr, token)
veileder
?.tildeltVeilederIdent
?.let { nom.finnNavn(NavIdent(it)) }
?.let {
Veileder(
ident = it.navIdent.get(),
fornavn = it.fornavn,
etternavn = it.etternavn,
)
}
}
}
12 changes: 12 additions & 0 deletions src/test/kotlin/no/nav/mock/MockConsumers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import no.nav.api.oppfolging.OppfolgingClient
import no.nav.api.pdl.PdlClient
import no.nav.api.skrivestotte.SkrivestotteClient
import no.nav.api.skrivestotte.SkrivestotteClient.*
import no.nav.api.syfo.SyfoClient
import no.nav.api.utbetalinger.UtbetalingerClient
import no.nav.api.utbetalinger.utbetalinger
import no.nav.common.client.nom.NomClient
Expand All @@ -41,6 +42,7 @@ object MockConsumers : Consumers {
override val tokenclient = tokenClientMock
override val oboTokenClient = oboTokenClientMock
override val oppfolgingClient = oppfolgingClientMock
override val syfoClient = syfoClientMock
override val kontonummerRegister = kontonummerRegisterMock
override val nom: NomClient = nomClientMock
override val skrivestotteClient = skrivestotteClientMock
Expand Down Expand Up @@ -73,6 +75,16 @@ private val oppfolgingClientMock =
)
}

private val syfoClientMock =
mockOf<SyfoClient> { client ->
coEvery { client.hentSyfoVeileder(any(), any()) } returns
SyfoClient.SyfoTildeling(
personIdent = SyfoClient.PersonIdentValue("10108000398"),
tildeltVeilederIdent = "Z123456",
tildeltenhet = "4403",
)
}

private val kontonummerRegisterMock =
mockOf<KontonummerRegister> { kontonummerRegister ->
coEvery { kontonummerRegister.hentKontonummer(any(), any(), any()) } returns
Expand Down
2 changes: 2 additions & 0 deletions src/test/kotlin/no/nav/mock/MockEnv.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ object MockEnv : Env {
override val kontonummerRegisterScope = DownstreamApi.parse("::")
override val oppfolgingUrl: String = ""
override val oppfolgingScope: DownstreamApi = DownstreamApi.parse("::")
override val syfoUrl: String = ""
override val syfoScope: DownstreamApi = DownstreamApi.parse("::")
override val nomUrl: String = ""
override val nomScope: DownstreamApi = DownstreamApi.parse("::")
override val pdlUrl: String = ""
Expand Down