Skip to content

Commit

Permalink
Refactoring after comments (PR#76) change from AktorId to fnr, re…
Browse files Browse the repository at this point in the history
…move logs, throw IOException instead of send empty string as query parameter, use Kotest, and send nonNullable variables instead of using !!. And more diverse refactoring.
  • Loading branch information
MalazAlkoj committed Sep 24, 2024
1 parent 9f89c9d commit 52eba8f
Show file tree
Hide file tree
Showing 15 changed files with 134 additions and 134 deletions.
1 change: 0 additions & 1 deletion src/main/kotlin/no/nav/syfo/aareg/AaregClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ class AaregClient(
) {
companion object {
private val LOG = LoggerFactory.getLogger(AaregClient::class.java)
const val NAV_CONSUMER_TOKEN_HEADER = "Nav-Consumer-Token"
const val NAV_PERSONIDENT_HEADER = "Nav-Personident"
}

Expand Down
12 changes: 9 additions & 3 deletions src/main/kotlin/no/nav/syfo/aareg/Arbeidsforhold.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package no.nav.syfo.aareg

import java.io.Serializable
import java.util.Date

data class Arbeidsforhold(
var ansettelsesperiode: Ansettelsesperiode? = null,
var ansettelsesperiode: Ansettelsesperiode = Ansettelsesperiode(
periode = Periode(Date().toString(), null)
),
var antallTimerForTimeloennet: List<AntallTimerForTimeloennet>? = null,
var arbeidsavtaler: List<Arbeidsavtale>? = null,
var arbeidsavtaler: List<Arbeidsavtale> = emptyList(),
var arbeidsforholdId: String? = null,
var arbeidsgiver: OpplysningspliktigArbeidsgiver? = null,
var arbeidsgiver: OpplysningspliktigArbeidsgiver = OpplysningspliktigArbeidsgiver(
organisasjonsnummer = "",
type = OpplysningspliktigArbeidsgiver.Type.Organisasjon
),
var arbeidstaker: Person? = null,
var innrapportertEtterAOrdningen: Boolean = false,
var navArbeidsforholdId: Int = 0,
Expand Down
1 change: 0 additions & 1 deletion src/main/kotlin/no/nav/syfo/aareg/Periode.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package no.nav.syfo.aareg

import java.io.Serializable

@Suppress("SerialVersionUIDInSerializableClass")
data class Periode(
var fom: String,
var tom: String? = null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package no.nav.syfo.aareg.service

import no.nav.security.token.support.core.api.ProtectedWithClaims
import no.nav.security.token.support.core.context.TokenValidationContextHolder
import no.nav.syfo.aareg.model.Stilling
import no.nav.syfo.auth.tokenx.TokenXUtil
import no.nav.syfo.auth.tokenx.TokenXUtil.TokenXIssuer.TOKENX
import no.nav.syfo.auth.tokenx.TokenXUtil.fnrFromIdportenTokenX
import no.nav.syfo.brukertilgang.BrukertilgangService
import no.nav.syfo.logger
import no.nav.syfo.util.NAV_PERSONIDENT_HEADER
import no.nav.syfo.util.fodselsnummerInvalid
import org.springframework.beans.factory.annotation.Value
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType.APPLICATION_JSON_VALUE
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
Expand All @@ -19,19 +26,40 @@ import java.time.LocalDate
@ProtectedWithClaims(issuer = TOKENX, claimMap = ["acr=Level4", "acr=idporten-loa-high"], combineWithOr = true)
@RequestMapping(value = ["/api/v1/arbeidsforhold"])
class ArbeidsforholdController(
private val contextHolder: TokenValidationContextHolder,
private val arbeidsforholdService: ArbeidsforholdService,
private val brukertilgangService: BrukertilgangService,
@Value("\${oppfolgingsplan.frontend.client.id}")
private val oppfolgingsplanClientId: String,
) {
private val log = logger()

@ResponseBody
@GetMapping(produces = [APPLICATION_JSON_VALUE])
fun getArbeidstakersStillingerForOrgnummer(
@RequestHeader(NAV_PERSONIDENT_HEADER) aktorId: String,
@RequestHeader(NAV_PERSONIDENT_HEADER) fnr: String,
@RequestParam date: LocalDate,
@RequestParam orgnummer: String
): ResponseEntity<List<Stilling>> {
val stillinger = arbeidsforholdService.arbeidstakersStillingerForOrgnummer(aktorId, date, orgnummer)
stillinger.forEach { log.info("Stilling: {${it.orgnummer}, ${it.fom}, ${it.tom}, ${it.yrke}, ${it.prosent}") }
return ResponseEntity.ok(stillinger)
val innloggetFnr = TokenXUtil.validateTokenXClaims(contextHolder, oppfolgingsplanClientId)
.fnrFromIdportenTokenX()
.value
return if (fodselsnummerInvalid(fnr)) {
log.error("Ugyldig fnr ved henting av person")
ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.build()
} else {
if (!brukertilgangService.tilgangTilOppslattIdent(innloggetFnr, fnr)) {
log.error("Ikke tilgang til person: Bruker spør om noen andre enn seg selv eller egne ansatte")
ResponseEntity
.status(HttpStatus.FORBIDDEN)
.build()
} else {
val stillinger = arbeidsforholdService.arbeidstakersStillingerForOrgnummer(fnr, date, orgnummer)
log.info("Hentet ${stillinger.size} stillinger")
ResponseEntity.ok(stillinger)
}
}
}
}
33 changes: 16 additions & 17 deletions src/main/kotlin/no/nav/syfo/aareg/service/ArbeidsforholdService.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package no.nav.syfo.aareg.service

import no.nav.syfo.aareg.AaregClient
import no.nav.syfo.aareg.Arbeidsavtale
import no.nav.syfo.aareg.Arbeidsforhold
import no.nav.syfo.aareg.OpplysningspliktigArbeidsgiver
import no.nav.syfo.aareg.model.Stilling
import no.nav.syfo.felleskodeverk.FellesKodeverkClient
import no.nav.syfo.felleskodeverk.KodeverkKoderBetydningerResponse
import no.nav.syfo.logger
import no.nav.syfo.pdl.PdlClient
import no.nav.syfo.util.lowerCapitalize
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
import java.math.BigDecimal
import java.math.RoundingMode.HALF_UP
Expand All @@ -23,7 +22,7 @@ class ArbeidsforholdService(
private val pdlClient: PdlClient,
) {

private val log = LoggerFactory.getLogger(javaClass)
private val log = logger()
fun arbeidstakersStillingerForOrgnummer(aktorId: String, fom: LocalDate, orgnummer: String): List<Stilling> {
val fnr: String = pdlClient.fnr(aktorId)
val arbeidsforholdList: List<Arbeidsforhold> = aaregClient.arbeidsforholdArbeidstaker(fnr)
Expand All @@ -40,24 +39,24 @@ class ArbeidsforholdService(
return try {
aaregClient.arbeidsforholdArbeidstaker(fnr)
.filter { arbeidsforhold ->
arbeidsforhold.arbeidsgiver?.type?.equals(OpplysningspliktigArbeidsgiver.Type.Organisasjon) ?: false
arbeidsforhold.arbeidsgiver.type.equals(OpplysningspliktigArbeidsgiver.Type.Organisasjon)
}
.flatMap { arbeidsforhold ->
arbeidsforhold.arbeidsavtaler!!
.sortedWith(compareBy<Arbeidsavtale, String?>(nullsLast()) { it.gyldighetsperiode?.fom })
arbeidsforhold.arbeidsavtaler
.sortedWith(compareBy(nullsLast()) { it.gyldighetsperiode?.fom })
.map {
Stilling(
yrke = stillingsnavnFromKode(it.yrke, kodeverkBetydninger),
prosent = stillingsprosentWithMaxScale(it.stillingsprosent),
fom = beregnRiktigFom(
it.gyldighetsperiode?.fom,
arbeidsforhold.ansettelsesperiode!!.periode.fom
arbeidsforhold.ansettelsesperiode.periode.fom
),
tom = beregnRiktigTom(
it.gyldighetsperiode?.tom,
arbeidsforhold.ansettelsesperiode!!.periode.tom
arbeidsforhold.ansettelsesperiode.periode.tom
),
orgnummer = arbeidsforhold.arbeidsgiver!!.organisasjonsnummer
orgnummer = arbeidsforhold.arbeidsgiver.organisasjonsnummer
)
}
}
Expand All @@ -67,10 +66,10 @@ class ArbeidsforholdService(
}
}

fun beregnRiktigFom(gyldighetsperiodeFom: String?, ansettelsesperiodeFom: String): LocalDate {
/* Gyldighetsperiode sier noe om hvilken måned arbeidsavtalen er rapportert inn,
og starter på den 1. i måneden selv om arbeidsforholdet startet senere.
Så dersom gyldighetsperiode er før ansettelsesperioden er det riktig å bruke ansettelsesperioden sin fom.*/
fun beregnRiktigFom(gyldighetsperiodeFom: String?, ansettelsesperiodeFom: String): LocalDate {
val ansattFom = ansettelsesperiodeFom.tilLocalDate()
return if (gyldighetsperiodeFom == null || LocalDate.parse(gyldighetsperiodeFom).isBefore(ansattFom)) {
ansattFom
Expand All @@ -79,10 +78,10 @@ class ArbeidsforholdService(
}
}

fun beregnRiktigTom(gyldighetsperiodeTom: String?, ansettelsesperiodeTom: String?): LocalDate? {
/* Den siste arbeidsavtalen har alltid tom = null, selv om arbeidsforholdet er avsluttet.
Så dersom tom = null og ansettelsesperiodens tom ikke er null,
er det riktig å bruke ansettelsesperioden sin tom */
fun beregnRiktigTom(gyldighetsperiodeTom: String?, ansettelsesperiodeTom: String?): LocalDate? {
return gyldighetsperiodeTom?.tilLocalDate()
?: ansettelsesperiodeTom?.tilLocalDate()
}
Expand All @@ -95,16 +94,16 @@ class ArbeidsforholdService(
val kodeverkBetydninger = fellesKodeverkClient.kodeverkKoderBetydninger()
return arbeidsforholdListe
.filter { arbeidsforhold ->
arbeidsforhold.arbeidsgiver?.type?.equals(OpplysningspliktigArbeidsgiver.Type.Organisasjon) ?: false
arbeidsforhold.arbeidsgiver.type.equals(OpplysningspliktigArbeidsgiver.Type.Organisasjon)
}
.filter { arbeidsforhold -> arbeidsforhold.arbeidsgiver?.organisasjonsnummer.equals(orgnummer) }
.filter { arbeidsforhold -> arbeidsforhold.arbeidsgiver.organisasjonsnummer.equals(orgnummer) }
.filter { arbeidsforhold ->
arbeidsforhold.ansettelsesperiode?.periode?.tom == null ||
!arbeidsforhold.ansettelsesperiode?.periode?.tom?.tilLocalDate()
?.isBefore(fom)!!
arbeidsforhold.ansettelsesperiode.periode.tom == null ||
arbeidsforhold.ansettelsesperiode.periode.tom?.tilLocalDate()
?.isAfter(fom) ?: false
}
.flatMap { arbeidsforhold ->
arbeidsforhold.arbeidsavtaler!!
arbeidsforhold.arbeidsavtaler
}
.map { arbeidsavtale ->
Stilling(
Expand Down
7 changes: 5 additions & 2 deletions src/main/kotlin/no/nav/syfo/felleskodeverk/Beskrivelse.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package no.nav.syfo.felleskodeverk

import java.io.Serializable

@Suppress("SerialVersionUIDInSerializableClass")
data class Beskrivelse(
var tekst: String? = null,
var term: String? = null
) : Serializable
) : Serializable {
companion object {
private const val serialVersionUID = 1L
}
}
7 changes: 5 additions & 2 deletions src/main/kotlin/no/nav/syfo/felleskodeverk/Betydning.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package no.nav.syfo.felleskodeverk

import java.io.Serializable

@Suppress("SerialVersionUIDInSerializableClass")
data class Betydning(
var beskrivelser: Map<String, Beskrivelse>? = null,
var gyldigFra: String? = null,
var gyldigTil: String? = null
) : Serializable
) : Serializable {
companion object {
private const val serialVersionUID = 1L
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ class FellesKodeverkClient @Autowired constructor(
KodeverkKoderBetydningerResponse::class.java
)
metric.tellHendelse("call_felleskodeverk_success")
LOG.info("We have received response from Felles Kodeverk: $response")
response.body ?: throw RestClientException("Response body is null")
} catch (e: RestClientException) {
metric.tellHendelse("call_felleskodeverk_fail")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package no.nav.syfo.felleskodeverk

import java.io.Serializable

@Suppress("SerialVersionUIDInSerializableClass")
data class KodeverkKoderBetydningerResponse(
var betydninger: Map<String, List<Betydning>>? = null
) : Serializable
) : Serializable {
companion object {
private const val serialVersionUID = 1L
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,12 @@ class NarmesteLederClient(
): List<NarmesteLederRelasjonDTO> {
val issuerToken = TokenUtil.getIssuerToken(contextHolder, TokenXUtil.TokenXIssuer.TOKENX)
val exchangedToken = tokenDingsConsumer.exchangeToken(issuerToken, targetApp)
log.info("ExchangedToken: $exchangedToken")
try {
val response = getResponse(
fnr = ansattFnr,
accessToken = exchangedToken
)
log.info("Response from NarmesteLeder: ${response.body}")
val relasjoner = response.body ?: emptyArray()
log.info("Relasjoner: $relasjoner")
return relasjoner
.filter { it.arbeidstakerPersonIdentNumber == ansattFnr }
} catch (e: RestClientResponseException) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,9 @@ class NarmesteLederController @Autowired constructor(
val innloggetIdent = TokenXUtil.validateTokenXClaims(contextHolder, oppfolgingsplanClientId)
.fnrFromIdportenTokenX()
.value
// Henting og logging av stillinger TO be removed when we use it from where it should be used
LOG.info("Henter stillinger from ArbeidsforholdService for $innloggetIdent")
val stillinger = arbeidsforholdService.arbeidstakersStillinger(innloggetIdent)
LOG.info("Hentet alle stillinger from ArbeidsforholdService for $innloggetIdent: $stillinger")
LOG.info("Hentet alle stillinger from ArbeidsforholdService, totalt ${stillinger.size}")
val narmesteLedere = narmesteLederClient.alleLedereForSykmeldt(ansattFnr = innloggetIdent)
LOG.info("Hentet nærmeste ledere for $innloggetIdent: $narmesteLedere")
LOG.info("Hentet nærmeste ledere for $innloggetIdent: ${narmesteLedere.size}")
LOG.info("Hentet nærmeste ledere for $innloggetIdent: ${narmesteLedere.map { it.narmesteLederNavn }}")
return if (narmesteLedere.isNotEmpty()) {
ResponseEntity
.status(HttpStatus.OK)
Expand Down
20 changes: 13 additions & 7 deletions src/main/kotlin/no/nav/syfo/pdl/PdlClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service
import org.springframework.web.client.RestClientException
import org.springframework.web.client.RestClientResponseException
import org.springframework.web.client.RestTemplate
import java.io.IOException

// Lenke til relevant behandling i behandlingskatalogen:
// https://behandlingskatalog.nais.adeo.no/process/team/6a3b85e0-0e06-4f58-95bb-4318e31c4b2b/cca7c846-e5a5-4a10-bc7e-6abd6fc1b0f5
Expand All @@ -33,7 +34,8 @@ class PdlClient(
metric.tellHendelse("call_pdl")

val query = this::class.java.getResource("/pdl/hentPerson.graphql")?.readText()?.replace("[\n\r]", "")
val entity = createRequestEntity(PdlRequest(query ?: "", Variables(ident)))
?: throw IOException("Failed to load query for hentPerson.graphql")
val entity = createRequestEntity(PdlRequest(query, Variables(ident)))
try {
val pdlPerson = RestTemplate().exchange(
pdlUrl,
Expand All @@ -43,7 +45,7 @@ class PdlClient(
)

val pdlPersonReponse = pdlPerson.body!!
return if (pdlPersonReponse.errors != null && pdlPersonReponse.errors.isNotEmpty()) {
return if (!pdlPersonReponse.errors.isNullOrEmpty()) {
metric.tellHendelse("call_pdl_fail")
pdlPersonReponse.errors.forEach {
LOG.error("Error while requesting person from PersonDataLosningen: ${it.errorMessage()}")
Expand Down Expand Up @@ -78,9 +80,9 @@ class PdlClient(
metric.tellHendelse("call_pdl")
val gruppe = identType.name

val query = this::class.java.getResource("/pdl/hentIdenter.graphql")?.readText()?.replace("[\n\r]", "")
val query = getQueryString()
val entity = createRequestEntity(
PdlRequest(query ?: "", Variables(ident = ident, grupper = gruppe))
PdlRequest(query, Variables(ident = ident, grupper = gruppe))
)
val pdlIdenter = RestTemplate().exchange(
pdlUrl,
Expand All @@ -89,8 +91,8 @@ class PdlClient(
object : ParameterizedTypeReference<PdlIdenterResponse>() {}
)

val pdlIdenterReponse = pdlIdenter.body!!
if (pdlIdenterReponse.errors != null && pdlIdenterReponse.errors.isNotEmpty()) {
val pdlIdenterReponse = pdlIdenter.body
if (pdlIdenterReponse?.errors != null && pdlIdenterReponse.errors.isNotEmpty()) {
metric.tellHendelse("call_pdl_fail")
pdlIdenterReponse.errors.forEach {
LOG.error("Error while requesting $gruppe from PersonDataLosningen: ${it.errorMessage()}")
Expand All @@ -99,14 +101,18 @@ class PdlClient(
} else {
metric.tellHendelse("call_pdl_success")
try {
return pdlIdenterReponse.data?.hentIdenter?.identer?.first()?.ident!!
return pdlIdenterReponse?.data?.hentIdenter?.identer?.first()?.ident!!
} catch (e: NoSuchElementException) {
LOG.info("Error while requesting $gruppe from PDL. Empty list in hentIdenter response", e)
throw RestClientException("Error while requesting $gruppe from PDL")
}
}
}

private fun getQueryString() =
this::class.java.getResource("/pdl/hentIdenter.graphql")?.readText()?.replace("[\n\r]", "")
?: throw IOException("Failed to load query for hentIdenter.graphql")

companion object {
private val LOG = LoggerFactory.getLogger(PdlClient::class.java)
}
Expand Down
6 changes: 0 additions & 6 deletions src/main/kotlin/no/nav/syfo/util/CredentialUtil.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package no.nav.syfo.util

import java.util.Base64

fun basicCredentials(credentialUsername: String?, credentialPassword: String?): String {
return "Basic ${Base64.getEncoder().encodeToString("$credentialUsername:$credentialPassword".toByteArray())}"
}

fun bearerHeader(token: String?): String {
return "Bearer $token"
}
Loading

0 comments on commit 52eba8f

Please sign in to comment.