Skip to content

Commit 3d59405

Browse files
authored
Merge pull request #15 from navikt/veileder_navn
Veiledernavn
2 parents e0a400d + ce8ab2d commit 3d59405

14 files changed

+127
-22
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ $ select * from person_oversikt_status;
4242
Run `./gradlew clean shadowJar`
4343

4444
#### Local Env variables
45-
Make a copy of `localEnvForTests.json` with the name `localEnv.json` and set the variables. This file ignored by giti.
46-
Rememeber to set the correct path in Environment.kt: `const val localEnvironmentPropertiesPath = "./src/main/resources/localEnv.json"`
45+
Make a copy of `localEnvForTests.json` with the name `localEnv.json` and set the variables. This file ignored by git.
46+
Remember to set the correct path in Environment.kt: `const val localEnvironmentPropertiesPath = "./src/main/resources/localEnv.json"`
4747

4848
#### Creating a docker image
4949
Creating a docker image should be as simple as `docker build -t syfooversiktsrv .`

src/main/kotlin/no/nav/syfo/Environment.kt

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ fun getEnvironment(): Environment {
2323
getEnvVar("JWKKEYS_URL", "https://login.microsoftonline.com/common/discovery/keys"),
2424
getEnvVar("JWT_ISSUER"),
2525
getEnvVar("SYFOTILGANGSKONTROLL_URL", "http://syfo-tilgangskontroll"),
26+
getEnvVar("SYFOVEILEDER_URL", "http://syfoveileder"),
2627
getEnvVar("DATABASE_NAME", "syfooversiktsrv"),
2728
getEnvVar("SYFOOVERSIKTSRV_DB_URL"),
2829
getEnvVar("MOUNT_PATH_VAULT"),
@@ -43,6 +44,7 @@ data class Environment(
4344
val jwkKeysUrl: String,
4445
val jwtIssuer: String,
4546
val syfotilgangskontrollUrl: String,
47+
val syfoveilederUrl: String,
4648
val databaseName: String,
4749
val syfooversiktsrvDBURL: String,
4850
val mountPathVault: String,

src/main/kotlin/no/nav/syfo/SyfooversiktApplication.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,8 @@ fun Application.serverModule() {
263263
val httpClient = HttpClient(Apache, config)
264264

265265
val personTildelingService = PersonTildelingService(database)
266-
val personoversiktStatusService = PersonoversiktStatusService(database)
266+
val veilederConsumer = VeilederConsumer(env.syfoveilederUrl, httpClient)
267+
val personoversiktStatusService = PersonoversiktStatusService(database, veilederConsumer)
267268
val tilgangskontrollConsumer = TilgangskontrollConsumer(env.syfotilgangskontrollUrl, httpClient)
268269

269270
routing {

src/main/kotlin/no/nav/syfo/personstatus/PersonOversiktStatusAksesseringQueries.kt

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ fun ResultSet.toPersonOversiktStatus(): PersonOversiktStatus =
134134
PersonOversiktStatus(
135135
veilederIdent = getString("tildelt_veileder"),
136136
fnr = getString("fnr"),
137+
veileder = null,
137138
enhet = getString("tildelt_enhet"),
138139
motebehovUbehandlet = getObject("motebehov_ubehandlet") as Boolean?,
139140
moteplanleggerUbehandlet = getObject("moteplanlegger_ubehandlet") as Boolean?

src/main/kotlin/no/nav/syfo/personstatus/PersonOversiktStatusApi.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ fun Route.registerPersonoversiktApi(
3131
val enhet: String = call.parameters["enhet"]?.takeIf { validateEnhet(it) }
3232
?: throw IllegalArgumentException("Enhet mangler")
3333

34-
val harTilgangTilEnhet = tilgangskontrollConsumer.harVeilederTilgangTilEnhet(enhet, getTokenFromCookie(call.request.cookies))
34+
val harTilgangTilEnhet = tilgangskontrollConsumer.harVeilederTilgangTilEnhet(enhet, token)
3535

3636
if (harTilgangTilEnhet) {
3737
val personListe: List<PersonOversiktStatus> = personoversiktStatusService
38-
.hentPersonoversiktStatusTilknyttetEnhet(enhet)
38+
.hentPersonoversiktStatusTilknyttetEnhet(enhet, token)
3939
.filter { tilgangskontrollConsumer.harVeilederTilgangTilPerson(it.fnr, token) }
4040

4141
when {
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
11
package no.nav.syfo.personstatus
22

3+
import kotlinx.coroutines.*
34
import no.nav.syfo.db.DatabaseInterface
5+
import no.nav.syfo.personstatus.domain.PersonOversiktStatus
46

5-
class PersonoversiktStatusService(private val database: DatabaseInterface) {
7+
class PersonoversiktStatusService(
8+
private val database: DatabaseInterface,
9+
private val veilederConsumer: VeilederConsumer
10+
) {
11+
12+
suspend fun hentPersonoversiktStatusTilknyttetEnhet(enhet: String, token: String) = database.hentPersonerTilknyttetEnhet(enhet)
13+
.filter { it.motebehovUbehandlet == true || it.moteplanleggerUbehandlet == true }
14+
.map { personOversiktStatus -> leggTilVeilederNavn(personOversiktStatus, token) }
15+
16+
17+
suspend fun leggTilVeilederNavn(personOversiktStatus: PersonOversiktStatus, token: String): PersonOversiktStatus {
18+
if (personOversiktStatus.veilederIdent != null) {
19+
personOversiktStatus.veileder = veilederConsumer.hentNavn(personOversiktStatus.enhet, personOversiktStatus.veilederIdent, token)
20+
}
21+
return personOversiktStatus
22+
}
623

7-
fun hentPersonoversiktStatusTilknyttetEnhet(enhet: String) = database.hentPersonerTilknyttetEnhet(enhet)
8-
.filter { it.motebehovUbehandlet == true || it.moteplanleggerUbehandlet == true}
924
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package no.nav.syfo.personstatus
2+
3+
import io.ktor.client.request.*
4+
import io.ktor.client.HttpClient
5+
import io.ktor.http.ContentType
6+
import no.nav.syfo.personstatus.domain.Veileder
7+
8+
class VeilederConsumer(
9+
private val endpointUrl: String,
10+
private val client: HttpClient
11+
) {
12+
val cache = HashMap<String, ArrayList<Veileder>>()
13+
14+
suspend fun hentNavn(enhet: String, ident: String, token: String): Veileder? {
15+
val veiledere = cache[enhet] ?: hentVeilederNavn(enhet, token).also { cache[enhet] = it }
16+
return veiledere.find { it.ident == ident }
17+
}
18+
19+
//TODO: finn/lag avansert cache som kan cache i én dag
20+
suspend fun hentVeilederNavn(enhet: String, token: String): ArrayList<Veileder> {
21+
val veiledere = client.get<ArrayList<Veileder>>(getSyfoVeilederUrl("/veiledere/enhet/$enhet")) {
22+
accept(ContentType.Application.Json)
23+
headers {
24+
append("Authorization", "Bearer $token")
25+
}
26+
}
27+
return veiledere
28+
}
29+
30+
private fun getSyfoVeilederUrl(path: String): String {
31+
return "$endpointUrl/syfoveileder/api$path"
32+
}
33+
}

src/main/kotlin/no/nav/syfo/personstatus/domain/PersonOversiktStatus.kt

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package no.nav.syfo.personstatus.domain
22

33
data class PersonOversiktStatus(
44
val veilederIdent: String?,
5+
var veileder: Veileder?,
56
val fnr: String,
67
val enhet: String,
78
val motebehovUbehandlet: Boolean?,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.nav.syfo.personstatus.domain
2+
3+
data class Veileder(
4+
val ident: String,
5+
val fornavn: String,
6+
val etternavn: String,
7+
val enhetNr: String,
8+
val enhetNavn: String)

src/main/kotlin/no/nav/syfo/tilgangskontroll/MidlertidigTilgangsKontroll.kt

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ val veilederIdenterMedTilgang = arrayListOf(
3333
val utviklereMedTilgangIPreProd = arrayListOf(
3434
"Z990197", // - John Martin
3535
"Z992300", // - Erik
36+
"Z992668", // - Kristian
37+
"Z990243", // - June
3638
"G153334", // - Solveig-1
3739
"Z990573", // - Solveig-2
3840
"Z992668" // - Kristian

src/main/resources/localEnvForTests.json

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"jwkKeysUrl": "https://login.microsoftonline.com/common/discovery/keys",
77
"jwtIssuer": "https://sts.windows.net/XXXXXXXX/",
88
"syfotilgangskontrollUrl": "http://localhost:8080",
9+
"syfoveilederUrl": "http://localhost:8080",
910
"databaseName": "syfooversiktsrv",
1011
"syfooversiktsrvDBURL": "url",
1112
"mountPathVault": "mountpath",

src/test/kotlin/no/nav/syfo/KafkaITSpek.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ object KafkaITSpek : Spek({
4242
jwtIssuer = "",
4343
aadDiscoveryUrl = "",
4444
syfotilgangskontrollUrl = "",
45-
clientid = ""
45+
clientid = "",
46+
syfoveilederUrl = ""
4647
)
4748

4849
fun Properties.overrideForTest(): Properties = apply {

src/test/kotlin/no/nav/syfo/personstatus/PersonoversiktStatusApiSpek.kt

+51-13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import no.nav.syfo.personstatus.domain.*
2727
import no.nav.syfo.testutil.*
2828
import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_FNR
2929
import no.nav.syfo.testutil.UserConstants.NAV_ENHET
30+
import no.nav.syfo.testutil.UserConstants.VEILEDER_ETTERNAVN
31+
import no.nav.syfo.testutil.UserConstants.VEILEDER_FORNAVN
3032
import no.nav.syfo.testutil.UserConstants.VEILEDER_ID
3133
import no.nav.syfo.tilgangskontroll.TilgangskontrollConsumer
3234
import org.amshove.kluent.shouldEqual
@@ -54,6 +56,10 @@ object PersonoversiktStatusApiSpek : Spek({
5456
client
5557
)
5658
val oversiktHendelseService = OversiktHendelseService(database)
59+
val veilederConsumer = VeilederConsumer(
60+
env.syfoveilederUrl,
61+
clientVeileder
62+
)
5763

5864
afterGroup {
5965
database.stop()
@@ -73,7 +79,7 @@ object PersonoversiktStatusApiSpek : Spek({
7379
}
7480

7581
application.routing {
76-
registerPersonoversiktApi(tilgangskontrollConsumer, PersonoversiktStatusService(database))
82+
registerPersonoversiktApi(tilgangskontrollConsumer, PersonoversiktStatusService(database, veilederConsumer))
7783
}
7884

7985
beforeEachTest {
@@ -129,12 +135,14 @@ object PersonoversiktStatusApiSpek : Spek({
129135
call.request.cookies[cookies]
130136
}) {
131137
response.status() shouldEqual HttpStatusCode.OK
132-
val returnertVerdig = objectMapper.readValue<List<PersonOversiktStatus>>(response.content!!)[0]
133-
returnertVerdig.veilederIdent shouldEqual tilknytning.veilederIdent
134-
returnertVerdig.fnr shouldEqual oversiktHendelse.fnr
135-
returnertVerdig.enhet shouldEqual oversiktHendelse.enhetId
136-
returnertVerdig.motebehovUbehandlet shouldEqual true
137-
returnertVerdig.moteplanleggerUbehandlet shouldEqual null
138+
val personOversiktStatus = objectMapper.readValue<List<PersonOversiktStatus>>(response.content!!)[0]
139+
personOversiktStatus.veilederIdent shouldEqual tilknytning.veilederIdent
140+
personOversiktStatus.fnr shouldEqual oversiktHendelse.fnr
141+
personOversiktStatus.enhet shouldEqual oversiktHendelse.enhetId
142+
personOversiktStatus.motebehovUbehandlet shouldEqual true
143+
personOversiktStatus.moteplanleggerUbehandlet shouldEqual null
144+
personOversiktStatus.veileder?.fornavn shouldEqual VEILEDER_FORNAVN
145+
personOversiktStatus.veileder?.etternavn shouldEqual VEILEDER_ETTERNAVN
138146
}
139147
}
140148

@@ -156,12 +164,14 @@ object PersonoversiktStatusApiSpek : Spek({
156164
call.request.cookies[cookies]
157165
}) {
158166
response.status() shouldEqual HttpStatusCode.OK
159-
val returnertVerdig = objectMapper.readValue<List<PersonOversiktStatus>>(response.content!!)[0]
160-
returnertVerdig.veilederIdent shouldEqual tilknytning.veilederIdent
161-
returnertVerdig.fnr shouldEqual oversiktHendelse.fnr
162-
returnertVerdig.enhet shouldEqual oversiktHendelse.enhetId
163-
returnertVerdig.motebehovUbehandlet shouldEqual null
164-
returnertVerdig.moteplanleggerUbehandlet shouldEqual true
167+
val personOversiktStatus = objectMapper.readValue<List<PersonOversiktStatus>>(response.content!!)[0]
168+
personOversiktStatus.veilederIdent shouldEqual tilknytning.veilederIdent
169+
personOversiktStatus.fnr shouldEqual oversiktHendelse.fnr
170+
personOversiktStatus.enhet shouldEqual oversiktHendelse.enhetId
171+
personOversiktStatus.motebehovUbehandlet shouldEqual null
172+
personOversiktStatus.moteplanleggerUbehandlet shouldEqual true
173+
personOversiktStatus.veileder?.fornavn shouldEqual VEILEDER_FORNAVN
174+
personOversiktStatus.veileder?.etternavn shouldEqual VEILEDER_ETTERNAVN
165175
}
166176
}
167177

@@ -228,5 +238,33 @@ private val client = HttpClient(MockEngine) {
228238
}
229239
}
230240

241+
@InternalAPI
242+
private val clientVeileder = HttpClient(MockEngine) {
243+
val baseUrl = env.syfoveilederUrl
244+
engine {
245+
addHandler { request ->
246+
when (request.url.fullUrl) {
247+
"$baseUrl/syfoveileder/api/veiledere/enhet/$NAV_ENHET" -> {
248+
val responseHeaders = headersOf("Content-Type" to listOf(ContentType.Application.Json.toString()))
249+
respond(ByteReadChannel((
250+
"[{\"ident\":\"Z999999\",\"fornavn\":\"$VEILEDER_FORNAVN\"," +
251+
"\"etternavn\":\"$VEILEDER_ETTERNAVN\",\"enhetNr\":\"$NAV_ENHET\",\"enhetNavn\":\"NAV X-FILES\"}]"
252+
253+
)
254+
.toByteArray(Charsets.UTF_8)), HttpStatusCode.OK, responseHeaders)
255+
}
256+
else -> error("Unhandled ${request.url.fullUrl}")
257+
}
258+
}
259+
}
260+
install(JsonFeature) {
261+
serializer = JacksonSerializer {
262+
registerKotlinModule()
263+
registerModule(JavaTimeModule())
264+
configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
265+
}
266+
}
267+
}
268+
231269
private val Url.hostWithPortIfRequired: String get() = if (port == protocol.defaultPort) host else hostWithPort
232270
private val Url.fullUrl: String get() = "${protocol.name}://$hostWithPortIfRequired$fullPath"

src/test/kotlin/no/nav/syfo/testutil/UserConstants.kt

+2
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ object UserConstants {
66
const val NAV_ENHET = "0330"
77
const val NAV_ENHET_2 = "0331"
88
const val VEILEDER_ID = "Z999999"
9+
const val VEILEDER_FORNAVN = "Dana"
10+
const val VEILEDER_ETTERNAVN = "Scully"
911
}

0 commit comments

Comments
 (0)