From 77ad5a9a8792c7790ff3f8b2cb1bd6c6b1a1e7b4 Mon Sep 17 00:00:00 2001 From: Martin Almvik Date: Wed, 27 Sep 2023 14:57:05 +0200 Subject: [PATCH] =?UTF-8?q?Legg=20til=20endepunkter=20for=20=C3=A5=20sende?= =?UTF-8?q?=20og=20motta=20klage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 4 + nais/dev/mock.yaml | 11 +- .../maskinporten/MaskinportenClientConfig.kt | 54 ++++-- .../innsyn/digisosapi/DokumentlagerClient.kt | 2 + .../test/DigisosApiTestClientImpl.kt | 2 + .../saksstatus/SaksStatusResponse.kt | 7 +- .../saksstatus/SaksStatusService.kt | 46 ++--- .../sosialhjelp/innsyn/domain/DigisosSoker.kt | 1 + .../sosialhjelp/innsyn/event/VedtakFattet.kt | 22 ++- .../sosialhjelp/innsyn/klage/FiksIOConfig.kt | 51 ++++++ .../innsyn/klage/FiksIoKontoConfig.kt | 32 ++++ .../innsyn/klage/KlageController.kt | 64 +++++++ .../sosialhjelp/innsyn/klage/KlageService.kt | 161 ++++++++++++++++++ .../klage/VirksomhetssertifikatConfig.kt | 32 ++++ .../innsyn/kommuneinfo/KommuneInfoClient.kt | 2 + .../sosialhjelp/innsyn/navenhet/NorgClient.kt | 27 --- .../saksoversikt/SaksOversiktController.kt | 4 +- .../innsyn/tilgang/Tilgangskontroll.kt | 24 --- .../innsyn/tilgang/pdl/PdlClient.kt | 2 - src/main/resources/application-local.yml | 47 ----- src/main/resources/application-mock-alt.yml | 20 ++- src/main/resources/application.yml | 5 + .../saksstatus/SaksStatusServiceTest.kt | 49 ++++-- .../innsyn/event/EventServiceTest.kt | 2 +- 24 files changed, 497 insertions(+), 174 deletions(-) create mode 100644 src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIOConfig.kt create mode 100644 src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIoKontoConfig.kt create mode 100644 src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageController.kt create mode 100644 src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageService.kt create mode 100644 src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/VirksomhetssertifikatConfig.kt delete mode 100644 src/main/resources/application-local.yml diff --git a/build.gradle.kts b/build.gradle.kts index a06dfe2f3..0161dcea6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,6 +31,7 @@ object Versions { const val gson = "2.10" const val log4j = "2.19.0" const val snakeyaml = "2.0" + const val fiksIO = "3.2.2" const val javaJwt = "4.3.0" const val jwksRsa = "0.22.0" @@ -126,6 +127,9 @@ dependencies { // Filformat implementation("no.nav.sbl.dialogarena:soknadsosialhjelp-filformat:${Versions.filformat}") +// Fiks IO + implementation("no.ks.fiks:fiks-io-klient-java:${Versions.fiksIO}") + // Jackson implementation("com.fasterxml.jackson.module:jackson-module-kotlin:${Versions.jackson}") diff --git a/nais/dev/mock.yaml b/nais/dev/mock.yaml index 07775323f..6f53380ef 100644 --- a/nais/dev/mock.yaml +++ b/nais/dev/mock.yaml @@ -30,6 +30,7 @@ spec: external: - host: unleash.nais.io - host: digisos.ekstern.dev.nav.no + - host: test.maskinporten.no rules: - application: sosialhjelp-mock-alt-api-mock - application: sosialhjelp-soknad-api-mock @@ -45,8 +46,16 @@ spec: requests: cpu: 10m memory: 512Mi + maskinporten: + enabled: true + scopes: + consumes: + - name: "ks:fiks" envFrom: - configmap: loginservice-idporten + - secret: innsyn-api-fiks-io-integrasjonspassord + filesFrom: + - secret: innyn-api-fiks-io-private-key env: - name: SPRING_PROFILES_ACTIVE value: "mock-alt,log-console,mock-redis" @@ -72,7 +81,7 @@ spec: value: "http://sosialhjelp-mock-alt-api-mock/sosialhjelp/mock-alt-api/well-known/tokenx" - name: TOKEN_X_CLIENT_ID value: "dev-gcp:teamdigisos:sosialhjelp-innsyn-api-mock" - - name: MASKINPORTEN_WELL_KNOWN_URL + - name: MOCK_ALT_MASKINPORTEN_WELL_KNOWN_URL value: "http://sosialhjelp-mock-alt-api-mock/sosialhjelp/mock-alt-api/well-known/maskinporten" - name: VILKAR_DOKKRAV_FAGSYSTEM_VERSJONER value: "Socio;10.1.16,mock-alt;1.0-MOCKVERSJON,Testsystemet;1.0.0" diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/app/maskinporten/MaskinportenClientConfig.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/app/maskinporten/MaskinportenClientConfig.kt index dc3f75a26..e0175390d 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/app/maskinporten/MaskinportenClientConfig.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/app/maskinporten/MaskinportenClientConfig.kt @@ -5,6 +5,7 @@ import no.nav.sosialhjelp.innsyn.utils.objectMapper import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile import org.springframework.http.client.reactive.ReactorClientHttpConnector import org.springframework.http.codec.json.Jackson2JsonDecoder import org.springframework.http.codec.json.Jackson2JsonEncoder @@ -12,22 +13,19 @@ import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.bodyToMono import reactor.netty.http.client.HttpClient -@Configuration -class MaskinportenClientConfig( - @Value("\${maskinporten_clientid}") private val clientId: String, - @Value("\${maskinporten_scopes}") private val scopes: String, - @Value("\${maskinporten_well_known_url}") private val wellKnownUrl: String, - @Value("\${maskinporten_client_jwk}") private val clientJwk: String, +sealed class MaskinportenClientConfig( + clientId: String, + scopes: String, + private val wellKnownUrl: String, + clientJwk: String, webClientBuilder: WebClient.Builder, proxiedHttpClient: HttpClient, ) { - @Bean - fun maskinportenClient(): MaskinportenClient { - return MaskinportenClient(maskinportenWebClient, maskinportenProperties, wellknown) - } + private val log by logger() + abstract fun maskinportenClient(): MaskinportenClient - private val maskinportenWebClient: WebClient = + protected val maskinportenWebClient: WebClient = webClientBuilder .clientConnector(ReactorClientHttpConnector(proxiedHttpClient)) .codecs { @@ -37,14 +35,14 @@ class MaskinportenClientConfig( } .build() - private val maskinportenProperties = MaskinportenProperties( + protected val maskinportenProperties = MaskinportenProperties( clientId = clientId, clientJwk = clientJwk, scope = scopes, wellKnownUrl = wellKnownUrl ) - private val wellknown: WellKnown + protected val wellknown: WellKnown get() = maskinportenWebClient.get() .uri(wellKnownUrl) .retrieve() @@ -52,10 +50,34 @@ class MaskinportenClientConfig( .doOnSuccess { log.info("Hentet WellKnown for Maskinporten.") } .doOnError { log.warn("Feil ved henting av WellKnown for Maskinporten", it) } .block() ?: throw RuntimeException("Feil ved henting av WellKnown for Maskinporten") +} + +@Configuration +class MaskinportenClientConfigImpl( + @Value("\${maskinporten_clientid}") clientId: String, + @Value("\${maskinporten_scopes}") scopes: String, + @Value("\${maskinporten_well_known_url}") wellKnownUrl: String, + @Value("\${maskinporten_client_jwk}") clientJwk: String, + webClientBuilder: WebClient.Builder, + proxiedHttpClient: HttpClient, +) : MaskinportenClientConfig(clientId, scopes, wellKnownUrl, clientJwk, webClientBuilder, proxiedHttpClient) { - companion object { - private val log by logger() - } + @Bean("maskinportenClient") + override fun maskinportenClient(): MaskinportenClient = MaskinportenClient(maskinportenWebClient, maskinportenProperties, wellknown) +} + +@Configuration +@Profile("!local") +class SpecialMaskinportenClientConfig( + @Value("\${special_maskinporten_clientid}") clientId: String, + @Value("\${special_maskinporten_scopes}") scopes: String, + @Value("\${special_well_known_url}") wellKnownUrl: String, + @Value("\${special_maskinporten_client_jwk}") clientJwk: String, + webClientBuilder: WebClient.Builder, + proxiedHttpClient: HttpClient, +) : MaskinportenClientConfig(clientId, scopes, wellKnownUrl, clientJwk, webClientBuilder, proxiedHttpClient) { + @Bean("specialMaskinportenClient") + override fun maskinportenClient(): MaskinportenClient = MaskinportenClient(maskinportenWebClient, maskinportenProperties, wellknown) } data class WellKnown( diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/DokumentlagerClient.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/DokumentlagerClient.kt index 3a5a6832e..84cb27c31 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/DokumentlagerClient.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/DokumentlagerClient.kt @@ -6,6 +6,7 @@ import no.nav.sosialhjelp.innsyn.app.exceptions.BadStateException import no.nav.sosialhjelp.innsyn.app.maskinporten.MaskinportenClient import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.BEARER import no.nav.sosialhjelp.innsyn.utils.logger +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.HttpHeaders.AUTHORIZATION import org.springframework.http.MediaType.APPLICATION_JSON import org.springframework.stereotype.Component @@ -24,6 +25,7 @@ interface DokumentlagerClient { @Component class DokumentlagerClientImpl( private val fiksWebClient: WebClient, + @Qualifier("maskinportenClient") private val maskinportenClient: MaskinportenClient ) : DokumentlagerClient { diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/test/DigisosApiTestClientImpl.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/test/DigisosApiTestClientImpl.kt index 19e83b5b2..5f97a967d 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/test/DigisosApiTestClientImpl.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisosapi/test/DigisosApiTestClientImpl.kt @@ -13,6 +13,7 @@ import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.BEARER import no.nav.sosialhjelp.innsyn.utils.logger import no.nav.sosialhjelp.innsyn.utils.objectMapper import no.nav.sosialhjelp.innsyn.vedlegg.FilForOpplasting +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.context.annotation.Profile import org.springframework.http.HttpHeaders.AUTHORIZATION import org.springframework.http.MediaType @@ -31,6 +32,7 @@ import org.springframework.web.reactive.function.client.bodyToMono class DigisosApiTestClientImpl( private val fiksWebClient: WebClient, private val digisosApiTestWebClient: WebClient, + @Qualifier("maskinportenClient") private val maskinportenClient: MaskinportenClient, private val fiksClientImpl: FiksClientImpl, ) : DigisosApiTestClient { diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusResponse.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusResponse.kt index 53699b64d..591b33178 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusResponse.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusResponse.kt @@ -8,11 +8,12 @@ data class SaksStatusResponse( val tittel: String, val status: SaksStatus?, val skalViseVedtakInfoPanel: Boolean, - val vedtaksfilUrlList: List? + val vedtaksfilUrlList: List?, ) -data class VedtaksfilUrl( +data class FilUrl( @JsonFormat(pattern = "yyyy-MM-dd") val dato: LocalDate?, - val vedtaksfilUrl: String + val url: String, + val id: String, ) diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusService.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusService.kt index 4b2090cff..6b3fa07c0 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusService.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusService.kt @@ -8,11 +8,14 @@ import no.nav.sosialhjelp.innsyn.event.EventService import no.nav.sosialhjelp.innsyn.utils.logger import org.springframework.stereotype.Component +const val DEFAULT_SAK_TITTEL = "default_sak_tittel" + @Component class SaksStatusService( private val eventService: EventService, - private val fiksClient: FiksClient + private val fiksClient: FiksClient, ) { + private val log by logger() fun hentSaksStatuser(fiksDigisosId: String, token: String): List { val digisosSak = fiksClient.hentDigisosSak(fiksDigisosId, token, true) @@ -29,39 +32,16 @@ class SaksStatusService( } private fun mapToResponse(sak: Sak): SaksStatusResponse { - val saksStatus = hentStatusNavn(sak) - val vedtakfilUrlList = when { - sak.vedtak.isEmpty() -> null - else -> sak.vedtak.map { - log.info("Hentet url til vedtaksfil: ${it.vedtaksFilUrl}") - VedtaksfilUrl(it.dato, it.vedtaksFilUrl) - } + val saksStatus = if (sak.vedtak.isEmpty()) { + sak.saksStatus ?: SaksStatus.UNDER_BEHANDLING + } else { + SaksStatus.FERDIGBEHANDLET } - val skalViseVedtakInfoPanel = getSkalViseVedtakInfoPanel(sak) + val vedtakfilUrlList = sak.vedtak.map { + log.info("Hentet url til vedtaksfil: ${it.vedtaksFilUrl}") + FilUrl(it.dato, it.vedtaksFilUrl, it.id) + }.ifEmpty { null } + val skalViseVedtakInfoPanel = sak.vedtak.all { it.utfall in listOf(UtfallVedtak.DELVIS_INNVILGET, UtfallVedtak.INNVILGET) } return SaksStatusResponse(sak.tittel ?: DEFAULT_SAK_TITTEL, saksStatus, skalViseVedtakInfoPanel, vedtakfilUrlList) } - - private fun hentStatusNavn(sak: Sak): SaksStatus { - return when { - sak.vedtak.isEmpty() -> sak.saksStatus ?: SaksStatus.UNDER_BEHANDLING - else -> SaksStatus.FERDIGBEHANDLET - } - } - - fun getSkalViseVedtakInfoPanel(sak: Sak): Boolean { - var sakHarVedtakslisteMedGjeldendeVedtakInnvilgetEllerDelvisInnvilget = false - for (vedtak in sak.vedtak) { - when { - vedtak.utfall == UtfallVedtak.DELVIS_INNVILGET || vedtak.utfall == UtfallVedtak.INNVILGET -> sakHarVedtakslisteMedGjeldendeVedtakInnvilgetEllerDelvisInnvilget = true - vedtak.utfall == UtfallVedtak.AVSLATT || vedtak.utfall == UtfallVedtak.AVVIST -> sakHarVedtakslisteMedGjeldendeVedtakInnvilgetEllerDelvisInnvilget = false - } - } - return sakHarVedtakslisteMedGjeldendeVedtakInnvilgetEllerDelvisInnvilget - } - - companion object { - private val log by logger() - - const val DEFAULT_SAK_TITTEL: String = "default_sak_tittel" - } } diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/domain/DigisosSoker.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/domain/DigisosSoker.kt index 5c67201b4..a82801dea 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/domain/DigisosSoker.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/domain/DigisosSoker.kt @@ -58,6 +58,7 @@ data class Sak( ) data class Vedtak( + val id: String, var utfall: UtfallVedtak?, var vedtaksFilUrl: String, var dato: LocalDate?, diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/event/VedtakFattet.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/event/VedtakFattet.kt index b1451032c..e8839e63c 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/event/VedtakFattet.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/event/VedtakFattet.kt @@ -1,8 +1,10 @@ package no.nav.sosialhjelp.innsyn.event +import no.nav.sbl.soknadsosialhjelp.digisos.soker.filreferanse.JsonDokumentlagerFilreferanse +import no.nav.sbl.soknadsosialhjelp.digisos.soker.filreferanse.JsonSvarUtFilreferanse import no.nav.sbl.soknadsosialhjelp.digisos.soker.hendelse.JsonVedtakFattet import no.nav.sosialhjelp.innsyn.app.ClientProperties -import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.SaksStatusService.Companion.DEFAULT_SAK_TITTEL +import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.DEFAULT_SAK_TITTEL import no.nav.sosialhjelp.innsyn.domain.Hendelse import no.nav.sosialhjelp.innsyn.domain.HendelseTekstType import no.nav.sosialhjelp.innsyn.domain.InternalDigisosSoker @@ -23,7 +25,14 @@ fun InternalDigisosSoker.apply(hendelse: JsonVedtakFattet, clientProperties: Cli val utfall = utfallString?.let { UtfallVedtak.valueOf(it) } val vedtaksfilUrl = hentUrlFraFilreferanse(clientProperties, hendelse.vedtaksfil.referanse) - val vedtakFattet = Vedtak(utfall, vedtaksfilUrl, hendelse.hendelsestidspunkt.toLocalDateTime().toLocalDate()) + val id = when (val referanse = hendelse.vedtaksfil.referanse) { + is JsonDokumentlagerFilreferanse -> referanse.id + is JsonSvarUtFilreferanse -> referanse.id + else -> error("Ikke støttet referansetype ${referanse.type}") + } + val vedtakFattet = Vedtak( + id, utfall, vedtaksfilUrl, hendelse.hendelsestidspunkt.toLocalDateTime().toLocalDate() + ) var sakForReferanse = saker.firstOrNull { it.referanse == hendelse.saksreferanse || it.referanse == "default" } @@ -42,7 +51,14 @@ fun InternalDigisosSoker.apply(hendelse: JsonVedtakFattet, clientProperties: Cli log.info("Hendelse: Tidspunkt: ${hendelse.hendelsestidspunkt} Vedtak fattet. er ferdigbehandlet") if (sakForReferanse.tittel != null) { - historikk.add(Hendelse(HendelseTekstType.SAK_FERDIGBEHANDLET_MED_TITTEL, hendelse.hendelsestidspunkt.toLocalDateTime(), UrlResponse(HendelseTekstType.VIS_BREVET_LENKETEKST, vedtaksfilUrl), tekstArgument = sakForReferanse.tittel)) + historikk.add( + Hendelse( + HendelseTekstType.SAK_FERDIGBEHANDLET_MED_TITTEL, + hendelse.hendelsestidspunkt.toLocalDateTime(), + UrlResponse(HendelseTekstType.VIS_BREVET_LENKETEKST, vedtaksfilUrl), + tekstArgument = sakForReferanse.tittel + ) + ) } else { historikk.add(Hendelse(HendelseTekstType.SAK_FERDIGBEHANDLET_UTEN_TITTEL, hendelse.hendelsestidspunkt.toLocalDateTime(), UrlResponse(HendelseTekstType.VIS_BREVET_LENKETEKST, vedtaksfilUrl))) } diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIOConfig.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIOConfig.kt new file mode 100644 index 000000000..631c5192e --- /dev/null +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIOConfig.kt @@ -0,0 +1,51 @@ +package no.nav.sosialhjelp.innsyn.klage + +import no.ks.fiks.io.client.konfigurasjon.FiksIOKonfigurasjon +import no.ks.fiks.io.client.konfigurasjon.KontoKonfigurasjon +import no.ks.fiks.io.client.konfigurasjon.VirksomhetssertifikatKonfigurasjon +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile +import java.security.KeyStore +import java.util.UUID + +@Configuration +@Profile("!local&!test") +class FiksIOConfig( + private val kontoKonfigurasjon: KontoKonfigurasjon, + @Value("\${fiks-io.integrasjonspassord}") + private val integrasjonspassord: String, + @Value("\${fiks-io.integrasjonid}") + private val integrasjonId: String, + @Value("\${MASKINPORTEN_CLIENT_ID}") + private val maskinportenClientId: String, +) { + + private val virksomhetssertifikatKonfigurasjon = + VirksomhetssertifikatKonfigurasjon.builder().keyStore(KeyStore.getInstance("pkcs12")).keyStorePassword("bogus").keyAlias("bogus").keyPassword("bogus").build() + + @Bean + @Profile("!prod") + fun fiksIOTestConfig(): FiksIOKonfigurasjon { + val integrasjonId = UUID.fromString(integrasjonId) + + return FiksIOKonfigurasjon.defaultTestConfiguration( + maskinportenClientId, integrasjonId, integrasjonspassord, + kontoKonfigurasjon, + virksomhetssertifikatKonfigurasjon + ) + } + + @Bean + @Profile("prod") + fun fiksIOProdConfig(): FiksIOKonfigurasjon { + val integrasjonId = UUID.fromString(integrasjonId) + + return FiksIOKonfigurasjon.defaultProdConfiguration( + maskinportenClientId, integrasjonId, integrasjonspassord, + kontoKonfigurasjon, + virksomhetssertifikatKonfigurasjon + ) + } +} diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIoKontoConfig.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIoKontoConfig.kt new file mode 100644 index 000000000..8a579ac5d --- /dev/null +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/FiksIoKontoConfig.kt @@ -0,0 +1,32 @@ +package no.nav.sosialhjelp.innsyn.klage + +import no.ks.fiks.io.client.konfigurasjon.KontoKonfigurasjon +import no.ks.fiks.io.client.model.KontoId +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile +import java.nio.file.Files +import java.security.KeyFactory +import java.security.spec.PKCS8EncodedKeySpec +import java.util.UUID +import kotlin.io.path.Path + +@Configuration +@Profile("!local&!test") +class FiksIoKontoConfig( + @Value("\${fiks-io.private-key-path}") + private val privateKeyPath: String, + @Value("\${fiks-io.kontoId}") + private val kontoId: String, + +) { + @Bean + fun kontoKonfigurasjon(): KontoKonfigurasjon { + val kontoId = KontoId(UUID.fromString(kontoId)) + val key = Files.readAllBytes(Path(privateKeyPath)) + val keySpec = PKCS8EncodedKeySpec(key) + val privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec) + return KontoKonfigurasjon.builder().kontoId(kontoId).privatNokkel(privateKey).build() + } +} diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageController.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageController.kt new file mode 100644 index 000000000..bcc3154f9 --- /dev/null +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageController.kt @@ -0,0 +1,64 @@ +package no.nav.sosialhjelp.innsyn.klage + +import jakarta.servlet.http.HttpServletRequest +import no.nav.security.token.support.core.api.ProtectedWithClaims +import no.nav.sosialhjelp.innsyn.app.ClientProperties +import no.nav.sosialhjelp.innsyn.app.xsrf.XsrfGenerator +import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.FilUrl +import no.nav.sosialhjelp.innsyn.tilgang.TilgangskontrollService +import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils +import org.springframework.http.HttpHeaders +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.time.LocalDate + +@RestController +@RequestMapping("/api/v1/innsyn") +@ProtectedWithClaims(issuer = IntegrationUtils.SELVBETJENING, claimMap = [IntegrationUtils.ACR_LEVEL4, IntegrationUtils.ACR_IDPORTEN_LOA_HIGH], combineWithOr = true) +class KlageController( + private val klageService: KlageService, + private val tilgangskontroll: TilgangskontrollService, + private val xsrfGenerator: XsrfGenerator, + private val clientProperties: ClientProperties, +) { + + @GetMapping("/{fiksDigisosId}/klage", produces = ["application/json;charset=UTF-8"]) + fun hentKlager(@PathVariable fiksDigisosId: String, @RequestHeader(value = HttpHeaders.AUTHORIZATION) token: String): ResponseEntity> { + tilgangskontroll.sjekkTilgang(token) + + val klager = klageService.hentKlager(fiksDigisosId, token) + + val klageDtos = klager.map { + KlageDto( + FilUrl(dato = LocalDate.now(), url = it.filRef.toDokumentLagerUrl(), id = it.filRef), + status = it.status, + nyttVedtakUrl = FilUrl(LocalDate.now(), it.vedtakRef.first().toDokumentLagerUrl(), it.vedtakRef.first()) + ) + } + return ResponseEntity.ok(klageDtos) + } + + private fun String.toDokumentLagerUrl() = clientProperties.fiksDokumentlagerEndpointUrl + "/dokumentlager/nedlasting/niva4/$this?inline=true" + + @PostMapping("/{fiksDigisosId}/klage", consumes = ["application/json;charset=UTF-8"]) + fun sendKlage( + @PathVariable fiksDigisosId: String, + @RequestBody body: InputKlage, + @RequestHeader(value = HttpHeaders.AUTHORIZATION) token: String, + request: HttpServletRequest, + ): ResponseEntity { + tilgangskontroll.sjekkTilgang(token) + xsrfGenerator.sjekkXsrfToken(request) + + klageService.sendKlage(fiksDigisosId, body, token) + return ResponseEntity.ok().build() + } +} + +data class KlageDto(val klageUrl: FilUrl, val status: KlageStatus, val nyttVedtakUrl: FilUrl? = null) diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageService.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageService.kt new file mode 100644 index 000000000..71192b1a6 --- /dev/null +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/KlageService.kt @@ -0,0 +1,161 @@ +package no.nav.sosialhjelp.innsyn.klage + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.channels.onClosed +import kotlinx.coroutines.channels.onFailure +import kotlinx.coroutines.channels.onSuccess +import kotlinx.coroutines.channels.trySendBlocking +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import no.ks.fiks.io.client.FiksIOKlient +import no.ks.fiks.io.client.FiksIOKlientFactory +import no.ks.fiks.io.client.SvarSender +import no.ks.fiks.io.client.konfigurasjon.FiksIOKonfigurasjon +import no.ks.fiks.io.client.model.Identifikator +import no.ks.fiks.io.client.model.IdentifikatorType +import no.ks.fiks.io.client.model.Konto +import no.ks.fiks.io.client.model.LookupRequest +import no.ks.fiks.io.client.model.MeldingRequest +import no.ks.fiks.io.client.model.MottattMelding +import no.ks.fiks.io.client.model.SendtMelding +import no.nav.sosialhjelp.innsyn.app.maskinporten.MaskinportenClient +import no.nav.sosialhjelp.innsyn.digisosapi.FiksClient +import no.nav.sosialhjelp.innsyn.utils.logger +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Service +import org.springframework.web.multipart.MultipartFile +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.awaitBodilessEntity +import org.springframework.web.reactive.function.client.awaitBody +import reactor.core.publisher.Mono +import java.lang.IllegalStateException +import kotlin.jvm.optionals.getOrNull + +interface KlageService { + fun sendKlage(fiksDigisosId: String, klage: InputKlage, token: String) + + fun hentKlager(fiksDigisosId: String, token: String): List +} + +@Service +@Profile("local|test") +class KlageServiceLocalImpl : KlageService { + + private val log by logger() + + // private val webClient = WebClient.create("http://sosialhjelp-mock-alt-api-mock/sosialhjelp/mock-alt-api/fiks/digisos/api/v1/") + private val webClient = WebClient.create("http://localhost:8989/sosialhjelp/mock-alt-api/fiks/digisos/api/v1/") + + override fun sendKlage(fiksDigisosId: String, klage: InputKlage, token: String) = runBlocking { + val response = webClient.post().uri("$fiksDigisosId/klage").bodyValue(klage).retrieve().awaitBodilessEntity() + if (!response.statusCode.is2xxSuccessful) { + log.error("Fikk ikke 2xx fra mock-alt-api i sending av klage. Status=${response.statusCode.value()}") + error("Feil ved levering av klage") + } + } + + override fun hentKlager(fiksDigisosId: String, token: String): List = runBlocking { + // Get fra mock-alt-api + webClient.get().uri("$fiksDigisosId/klage").retrieve().onStatus({ !it.is2xxSuccessful }, { + log.error("Fikk ikke 2xx fra mock-alt-api i henting av klager. Status=${it.statusCode().value()}}") + Mono.error { IllegalStateException("Feil ved henting av klager") } + }).awaitBody() + } +} + +@Service +@Profile("!local&!test") +class KlageServiceImpl( + private val fiksIOConfig: FiksIOKonfigurasjon, + private val fiksClient: FiksClient, + @Qualifier("specialMaskinportenClient") + private val maskinportenClient: MaskinportenClient, +) : KlageService { + + private val log by logger() + + override fun sendKlage(fiksDigisosId: String, klage: InputKlage, token: String) { + val (klient, konto) = hentKlientOgKonto(fiksDigisosId, token, "no.nav.sosialhjelp.klage.v1") + + konto?.let { + klient.send(MeldingRequest.builder().mottakerKontoId(it.kontoId).build(), lagKlageFil(klage), "klage.json") + } ?: error("Kunne ikke sende klage") + } + + private fun lagKlageFil(klage: InputKlage) = klage.toString().byteInputStream() + + override fun hentKlager(fiksDigisosId: String, token: String): List { + val (klient, konto) = hentKlientOgKonto(fiksDigisosId, token, "digisos.klage.hent") + + val sendtMelding = konto?.let { + klient.send(MeldingRequest.builder().mottakerKontoId(it.kontoId).build(), fiksDigisosId, "???") + } ?: error("Kunne ikke sende til Fiks IO") + + return runBlocking { + withTimeout(2000) { + waitForResult(klient, sendtMelding) + }.catch { e -> log.error("Fikk feil i henting av klager", e) }.toList() + } + } + + private fun hentKlientOgKonto(fiksDigisosId: String, token: String, protokoll: String): Pair { + val digisosSak = fiksClient.hentDigisosSak(fiksDigisosId, token, true) + val navEnhetId = digisosSak.tilleggsinformasjon?.enhetsnummer?.let { + Identifikator(IdentifikatorType.NAVENHET_ID, it) + } ?: error("Sak mangler enhetsnummer") + + val fiksIOKlientFactory = FiksIOKlientFactory(fiksIOConfig).apply { + setMaskinportenAccessTokenSupplier { + maskinportenClient.getToken() + } + } + val fiksIOKlient = fiksIOKlientFactory.build() + + val lookupRequest = LookupRequest.builder().identifikator(navEnhetId).sikkerhetsNiva(4).meldingsprotokoll(protokoll).build() + val fiksIoKonto = fiksIOKlient.lookup(lookupRequest) + return Pair(fiksIOKlient, fiksIoKonto.getOrNull()) + } + + private fun waitForResult(fiksIOKlient: FiksIOKlient, sendtMelding: SendtMelding) = callbackFlow { + val callback = { mottattMelding: MottattMelding, svarSender: SvarSender -> + if (mottattMelding.svarPaMelding == sendtMelding.meldingId) { + val klage: Klage = mottattMelding.dekryptertZipStream.use { ObjectMapper().readValue(String(it.readBytes())) } + + channel.trySendBlocking(klage) + .onSuccess { + svarSender.ack() + }.onFailure { + svarSender.nackWithRequeue() + }.onClosed { svarSender.nackWithRequeue() } + channel.close() + } else { + svarSender.nack() + } + Unit + } + + fiksIOKlient.newSubscription(callback) + + awaitClose { + fiksIOKlient.close() + } + } +} + +data class InputKlage(val fiksDigisosId: String, val klageTekst: String, val vedtaksIds: List, val vedlegg: List = emptyList()) + +data class Klage(val fiksDigisosId: String, val filRef: String, val vedtakRef: List, val status: KlageStatus, val utfall: KlageUtfall?) + +enum class KlageStatus { + SENDT, MOTTATT, UNDER_BEHANDLING, FERDIG_BEHANDLET, HOS_STATSFORVALTER +} + +enum class KlageUtfall { + NYTT_VEDTAK, AVVIST, +} diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/VirksomhetssertifikatConfig.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/VirksomhetssertifikatConfig.kt new file mode 100644 index 000000000..201b3a102 --- /dev/null +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/klage/VirksomhetssertifikatConfig.kt @@ -0,0 +1,32 @@ +package no.nav.sosialhjelp.innsyn.klage + +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile + +@Configuration +@Profile("!local&!test") +class VirksomhetssertifikatConfig( +// @Value("\${fiks-io.virksomhetssertifikat.keyStore.path}") +// private val virksomhetssertifikatKeyStorePath: String, +// @Value("\${fiks-io.virksomhetssertifikat.keyStore.password}") +// private val virksomhetssertifikatKeyStorePassword: String, +// @Value("\${fiks-io.virksomhetssertifikat.keyPassword}") +// private val virksomhetssertifikatKeyPassword: String, +// @Value("\${fiks-io.virksomhetssertifikat.keyAlias}") +// private val virksomhetssertifikatKeyAlias: String, +) { + +// @Bean +// fun virksomhetssertifikatKonfigurasjon(): VirksomhetssertifikatKonfigurasjon { +// val keyStoreInputStream = Files.newInputStream(Path(virksomhetssertifikatKeyStorePath)) +// val keyStorePassword = virksomhetssertifikatKeyStorePassword.toCharArray() +// val p12: KeyStore = KeyStore.getInstance("pkcs12").also { +// it.load(keyStoreInputStream, keyStorePassword) +// } +// return VirksomhetssertifikatKonfigurasjon.builder() +// .keyStore(p12) +// .keyStorePassword(virksomhetssertifikatKeyStorePassword) +// .keyPassword(virksomhetssertifikatKeyPassword) +// .keyAlias(virksomhetssertifikatKeyAlias).build() +// } +} diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/kommuneinfo/KommuneInfoClient.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/kommuneinfo/KommuneInfoClient.kt index ae29dc597..6d2a2d2ca 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/kommuneinfo/KommuneInfoClient.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/kommuneinfo/KommuneInfoClient.kt @@ -13,6 +13,7 @@ import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.HEADER_INTEGRASJON_ID import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.HEADER_INTEGRASJON_PASSORD import no.nav.sosialhjelp.innsyn.utils.logger import no.nav.sosialhjelp.innsyn.utils.objectMapper +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.HttpHeaders.AUTHORIZATION import org.springframework.http.MediaType import org.springframework.http.client.reactive.ReactorClientHttpConnector @@ -26,6 +27,7 @@ import reactor.netty.http.client.HttpClient @Component class KommuneInfoClient( + @Qualifier("maskinportenClient") private val maskinportenClient: MaskinportenClient, clientProperties: ClientProperties, webClientBuilder: WebClient.Builder, diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/navenhet/NorgClient.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/navenhet/NorgClient.kt index 23560010a..cb480acbe 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/navenhet/NorgClient.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/navenhet/NorgClient.kt @@ -9,7 +9,6 @@ import no.nav.sosialhjelp.innsyn.redis.RedisService import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.HEADER_CALL_ID import no.nav.sosialhjelp.innsyn.utils.logger import no.nav.sosialhjelp.innsyn.utils.objectMapper -import org.springframework.context.annotation.Profile import org.springframework.http.MediaType import org.springframework.stereotype.Component import org.springframework.web.reactive.function.client.WebClient @@ -20,7 +19,6 @@ interface NorgClient { fun hentNavEnhet(enhetsnr: String): NavEnhet } -@Profile("!local") @Component class NorgClientImpl( private val norgWebClient: WebClient, @@ -77,28 +75,3 @@ class NorgClientImpl( private const val NAVENHET_CACHE_TIMETOLIVE_SECONDS: Long = 60 * 60 // 1 time } } - -@Profile("local") -@Component -class NorgClientLocal : NorgClient { - - private val innsynMap = mutableMapOf() - - override fun hentNavEnhet(enhetsnr: String): NavEnhet { - return innsynMap.getOrElse( - enhetsnr - ) { - val default = NavEnhet( - enhetId = 100000367, - navn = "NAV Longyearbyen", - enhetNr = enhetsnr, - antallRessurser = 20, - status = "AKTIV", - aktiveringsdato = "1982-04-21", - nedleggelsesdato = "null" - ) - innsynMap[enhetsnr] = default - default - } - } -} diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/saksoversikt/SaksOversiktController.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/saksoversikt/SaksOversiktController.kt index 22f2bec3f..637b7ab8b 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/saksoversikt/SaksOversiktController.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/saksoversikt/SaksOversiktController.kt @@ -4,7 +4,7 @@ import no.nav.security.token.support.core.api.ProtectedWithClaims import no.nav.sosialhjelp.api.fiks.exceptions.FiksException import no.nav.sosialhjelp.innsyn.digisosapi.FiksClient import no.nav.sosialhjelp.innsyn.digisossak.oppgaver.OppgaveService -import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.SaksStatusService +import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.DEFAULT_SAK_TITTEL import no.nav.sosialhjelp.innsyn.domain.InternalDigisosSoker import no.nav.sosialhjelp.innsyn.domain.SaksStatus import no.nav.sosialhjelp.innsyn.domain.UtbetalingsStatus @@ -69,7 +69,7 @@ class SaksOversiktController( private fun hentNavn(model: InternalDigisosSoker): String { return model.saker.filter { SaksStatus.FEILREGISTRERT != it.saksStatus }.joinToString { - it.tittel ?: SaksStatusService.DEFAULT_SAK_TITTEL + it.tittel ?: DEFAULT_SAK_TITTEL } } diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/Tilgangskontroll.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/Tilgangskontroll.kt index 13de4b1e0..445671624 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/Tilgangskontroll.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/Tilgangskontroll.kt @@ -1,7 +1,6 @@ package no.nav.sosialhjelp.innsyn.tilgang import no.nav.sosialhjelp.api.fiks.DigisosSak -import no.nav.sosialhjelp.innsyn.app.exceptions.BadStateException import no.nav.sosialhjelp.innsyn.app.exceptions.PdlException import no.nav.sosialhjelp.innsyn.app.exceptions.TilgangskontrollException import no.nav.sosialhjelp.innsyn.app.subjecthandler.SubjectHandlerUtils @@ -10,7 +9,6 @@ import no.nav.sosialhjelp.innsyn.tilgang.pdl.PdlPerson import no.nav.sosialhjelp.innsyn.tilgang.pdl.isKode6Or7 import no.nav.sosialhjelp.innsyn.utils.logger import org.springframework.beans.factory.annotation.Value -import org.springframework.context.annotation.Profile import org.springframework.core.env.Environment import org.springframework.stereotype.Component import java.util.Locale @@ -21,7 +19,6 @@ interface Tilgangskontroll { fun verifyDigisosSakIsForCorrectUser(digisosSak: DigisosSak) } -@Profile("!local") @Component class TilgangskontrollService( @Value("\${login_api_idporten_clientid}") private val loginApiClientId: String, @@ -76,27 +73,6 @@ class TilgangskontrollService( } } -@Profile("local") -@Component -class TilgangskontrollLocal : Tilgangskontroll { - - override fun sjekkTilgang(token: String) { - // no-op - } - - override fun hentTilgang(ident: String, token: String): Tilgang { - return Tilgang( - harTilgang = true, - fornavn = "mockperson" - ) - } - - override fun verifyDigisosSakIsForCorrectUser(digisosSak: DigisosSak) { - if (digisosSak.sokerFnr != SubjectHandlerUtils.getUserIdFromToken()) - throw BadStateException("digisosSak hører ikke til rett person") - } -} - data class Tilgang( val harTilgang: Boolean, val fornavn: String diff --git a/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/pdl/PdlClient.kt b/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/pdl/PdlClient.kt index 20454876b..b6ed825dc 100644 --- a/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/pdl/PdlClient.kt +++ b/src/main/kotlin/no/nav/sosialhjelp/innsyn/tilgang/pdl/PdlClient.kt @@ -15,7 +15,6 @@ import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.HEADER_TEMA import no.nav.sosialhjelp.innsyn.utils.IntegrationUtils.TEMA_KOM import no.nav.sosialhjelp.innsyn.utils.logger import no.nav.sosialhjelp.innsyn.utils.objectMapper -import org.springframework.context.annotation.Profile import org.springframework.http.HttpHeaders.AUTHORIZATION import org.springframework.http.MediaType import org.springframework.stereotype.Component @@ -29,7 +28,6 @@ interface PdlClient { fun ping() } -@Profile("!local") @Component class PdlClientImpl( private val pdlWebClient: WebClient, diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 29ce1d2f2..000000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,47 +0,0 @@ -innsyn: - vedlegg: - virusscan: - enabled: false - url: - cache: - dokument_cache_time_to_live_seconds: 100 - -springdoc: - api-docs: - enabled: true - -#Token-validering -no.nav.security.jwt: - issuer.selvbetjening: - discoveryurl: http://localhost:${mock-oauth2-server.port}/selvbetjening/.well-known/openid-configuration - accepted_audience: someaudience - cookie_name: localhost-idtoken -innsyn.loginurl: ${INNSYN_LOGINURL:http://localhost:8080/sosialhjelp/innsyn-api/local/cookie} - -login_api_idporten_clientid: clientId - -client: - fiks_digisos_endpoint_url: ${FIKS_DIGISOS_ENDPOINT_URL:https://api.fiks.test.ks.no} - fiks_dokumentlager_endpoint_url: ${FIKS_DOKUMENTLAGER_ENDPOINT_URL:https://minside.fiks.test.ks.no} - fiks_svar_ut_endpoint_url: ${FIKS_SVAR_UT_ENDPOINT_URL} - fiks_integrasjonid: ${INTEGRASJONSID_FIKS} - fiks_integrasjonid_kommune: ${INTEGRASJONSID_FIKS_KOMMUNE} - fiks_integrasjonpassord: ${INTEGRASJONPASSORD_FIKS} - fiks_integrasjonpassord_kommune: ${INTEGRASJONPASSORD_FIKS_KOMMUNE} - norg_url: ${NORG_URL:norg_endpoint_url} - pdl_endpoint_url: ${PDL_ENDPOINT_URL:pdl_endpoint_url} - pdl_audience: ${PDL_AUDIENCE:dummyAudience} - unleash_url: ${UNLEASH_API_URL:https://unleash.nais.io/api} - unleash_instance_id: ${UNLEASH_INSTANCE_ID:local} - tokendings_url: ${TOKEN_X_WELL_KNOWN_URL:tokendings_endpoint_url} - tokendings_private_jwk: ${TOKEN_X_PRIVATE_JWK:generateRSA} - vilkar_dokkrav_fagsystem_versjoner: ${VILKAR_DOKKRAV_FAGSYSTEM_VERSJONER} - soknad_api_url: ${SOKNAD_API_URL:soknad_api_url} - soknad_api_audience: ${SOKNAD_API_AUDIENCE:dummyAudience} - - -#Maskinporten -maskinporten_clientid: maskinporten_clientid -maskinporten_scopes: scopes -maskinporten_well_known_url: ${MASKINPORTEN_WELL_KNOWN_URL:http://${mock-alt-api-host}:8989/sosialhjelp/mock-alt-api/well-known/maskinporten${mock-alt-api-wellknown-queryparam}} -maskinporten_client_jwk: generateRSA diff --git a/src/main/resources/application-mock-alt.yml b/src/main/resources/application-mock-alt.yml index 0037c852d..05ce45de9 100644 --- a/src/main/resources/application-mock-alt.yml +++ b/src/main/resources/application-mock-alt.yml @@ -55,9 +55,15 @@ client: #Maskinporten maskinporten_clientid: maskinporten_clientid maskinporten_scopes: scopes -maskinporten_well_known_url: ${MASKINPORTEN_WELL_KNOWN_URL:http://${mock-alt-api-host}:8989/sosialhjelp/mock-alt-api/well-known/maskinporten${mock-alt-api-wellknown-queryparam}} +maskinporten_well_known_url: ${MOCK_ALT_MASKINPORTEN_WELL_KNOWN_URL:http://${mock-alt-api-host}:8989/sosialhjelp/mock-alt-api/well-known/maskinporten${mock-alt-api-wellknown-queryparam}} maskinporten_client_jwk: generateRSA +#special_Maskinporten +special_maskinporten_clientid: ${MASKINPORTEN_CLIENT_ID} +special_maskinporten_scopes: ${MASKINPORTEN_SCOPES} +special_maskinporten_well_known_url: ${MASKINPORTEN_WELL_KNOWN_URL} +special_maskinporten_client_jwk: ${MASKINPORTEN_CLIENT_JWK} + idporten_well_known_url: ${IDPORTEN_WELL_KNOWN_URL:https://test.idporten.no/.well-known/openid-configuration} idporten_clientid: ${IDPORTEN_CLIENT_ID:clientId} idporten_client_jwk: ${IDPORTEN_CLIENT_JWK:generateRSA} @@ -66,3 +72,15 @@ idporten_post_logout_redirect_uri: ${IDPORTEN_POST_LOGOUT_REDIRECT_URI:https://w idporten_login_timeout: ${IDPORTEN_LOGIN_TIMEOUT:3600} idporten_session_timeout: ${IDPORTEN_SESSION_TIMEOUT:7200} idporten_token_timeout: ${IDPORTEN_TOKEN_TIMEOUT:3600} + +fiks-io: + integrasjonspassord: ${INNSYN_API_FIKS_IO_INTEGRASJONSPASSORD} + integrasjonsid: 6839eedd-8007-432b-a24d-67bd845f6369 + private-key-path: "/var/run/secrets/key.der" + kontoId: 46bbe668-3468-45fa-9bd1-67b5469b7361 +# virksomhetssertifikat: +# keystore: +# path: "/var/run/secrets/virksomhetssertifikat.pem" +# password: ${INNSYN_API_FIKS_IO_VIRKSOMHETSSERTIFIKAT_KEY_STORE_PASSORD} +# keyPassword: ${INNSYN_API_FIKS_IO_VIRKSOMHETSSERTIFIKAT_PASSORD} +# keyAlias: abc diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b51316b64..d3847fd11 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -72,6 +72,11 @@ maskinporten_scopes: ${MASKINPORTEN_SCOPES} maskinporten_well_known_url: ${MASKINPORTEN_WELL_KNOWN_URL} maskinporten_client_jwk: ${MASKINPORTEN_CLIENT_JWK} +special_maskinporten_clientid: ${MASKINPORTEN_CLIENT_ID} +special_maskinporten_scopes: ${MASKINPORTEN_SCOPES} +special_maskinporten_well_known_url: ${MASKINPORTEN_WELL_KNOWN_URL} +special_maskinporten_client_jwk: ${MASKINPORTEN_CLIENT_JWK} + #Token-validering no.nav.security.jwt: issuer.selvbetjening: diff --git a/src/test/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusServiceTest.kt b/src/test/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusServiceTest.kt index 96eddca2f..d839f5a9e 100644 --- a/src/test/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusServiceTest.kt +++ b/src/test/kotlin/no/nav/sosialhjelp/innsyn/digisossak/saksstatus/SaksStatusServiceTest.kt @@ -5,7 +5,6 @@ import io.mockk.every import io.mockk.mockk import no.nav.sosialhjelp.api.fiks.DigisosSak import no.nav.sosialhjelp.innsyn.digisosapi.FiksClient -import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.SaksStatusService.Companion.DEFAULT_SAK_TITTEL import no.nav.sosialhjelp.innsyn.domain.InternalDigisosSoker import no.nav.sosialhjelp.innsyn.domain.Sak import no.nav.sosialhjelp.innsyn.domain.SaksStatus @@ -28,6 +27,7 @@ internal class SaksStatusServiceTest { private val tittel = "tittel" private val referanse = "referanse" private val vedtaksfilUrl = "url" + private val id = "id" private val mockDigisosSak: DigisosSak = mockk() @@ -84,7 +84,8 @@ internal class SaksStatusServiceTest { Vedtak( utfall = UtfallVedtak.INNVILGET, vedtaksFilUrl = vedtaksfilUrl, - dato = LocalDate.now() + dato = LocalDate.now(), + id = "" ) ), utbetalinger = mutableListOf() @@ -100,7 +101,7 @@ internal class SaksStatusServiceTest { assertThat(response[0].status).isEqualTo(SaksStatus.FERDIGBEHANDLET) assertThat(response[0].tittel).isEqualTo(tittel) assertThat(response[0].vedtaksfilUrlList).hasSize(1) - assertThat(response[0].vedtaksfilUrlList?.get(0)?.vedtaksfilUrl).isEqualTo(vedtaksfilUrl) + assertThat(response[0].vedtaksfilUrlList?.get(0)?.url).isEqualTo(vedtaksfilUrl) } @Test @@ -115,7 +116,8 @@ internal class SaksStatusServiceTest { Vedtak( utfall = UtfallVedtak.INNVILGET, vedtaksFilUrl = vedtaksfilUrl, - dato = LocalDate.now() + dato = LocalDate.now(), + id = id ) ), utbetalinger = mutableListOf() @@ -131,7 +133,7 @@ internal class SaksStatusServiceTest { assertThat(response[0].status).isEqualTo(SaksStatus.FERDIGBEHANDLET) assertThat(response[0].tittel).isEqualTo(DEFAULT_SAK_TITTEL) assertThat(response[0].vedtaksfilUrlList).hasSize(1) - assertThat(response[0].vedtaksfilUrlList?.get(0)?.vedtaksfilUrl).isEqualTo(vedtaksfilUrl) + assertThat(response[0].vedtaksfilUrlList?.get(0)?.url).isEqualTo(vedtaksfilUrl) } @Test @@ -147,12 +149,14 @@ internal class SaksStatusServiceTest { Vedtak( utfall = UtfallVedtak.INNVILGET, vedtaksFilUrl = vedtaksfilUrl, - dato = LocalDate.now() + dato = LocalDate.now(), + id = id, ), Vedtak( utfall = UtfallVedtak.INNVILGET, vedtaksFilUrl = vedtaksfilUrl, - dato = LocalDate.now() + dato = LocalDate.now(), + id = id, ) ), utbetalinger = mutableListOf() @@ -186,27 +190,32 @@ internal class SaksStatusServiceTest { val vedtak1 = Vedtak( utfall = UtfallVedtak.INNVILGET, vedtaksFilUrl = "en link til noe", - dato = null + dato = null, + id = id, ) val vedtak2 = Vedtak( utfall = UtfallVedtak.DELVIS_INNVILGET, vedtaksFilUrl = "en link til noe", - dato = null + dato = null, + id = id, ) val vedtak3 = Vedtak( utfall = UtfallVedtak.AVVIST, vedtaksFilUrl = "en link til noe", - dato = null + dato = null, + id = id, ) val vedtak4 = Vedtak( utfall = UtfallVedtak.AVSLATT, vedtaksFilUrl = "en link til noe", - dato = null + dato = null, + id = id, ) val vedtak5 = Vedtak( utfall = null, vedtaksFilUrl = "en link til noe", - dato = null + dato = null, + id = id, ) val sakSomSkalGiTrue = Sak( "ref1", @@ -223,7 +232,19 @@ internal class SaksStatusServiceTest { utbetalinger = mutableListOf() ) - assertThat(service.getSkalViseVedtakInfoPanel(sakSomSkalGiTrue)).isEqualTo(true) - assertThat(service.getSkalViseVedtakInfoPanel(sakSomSkalGiFalse)).isEqualTo(false) + val digisosSak1 = DigisosSak("id1", "", "", "", 1L, null, null, null, null) + every { + fiksClient.hentDigisosSak("id1", "token", true) + } returns digisosSak1 + val digisosSak2 = DigisosSak("id2", "", "", "", 1L, null, null, null, null) + every { + fiksClient.hentDigisosSak("id2", "token", true) + } returns digisosSak2 + + every { eventService.createModel(digisosSak1, "token") } returns InternalDigisosSoker(saker = mutableListOf(sakSomSkalGiTrue)) + every { eventService.createModel(digisosSak2, "token") } returns InternalDigisosSoker(saker = mutableListOf(sakSomSkalGiFalse)) + + assertThat(service.hentSaksStatuser("id1", "token").first().skalViseVedtakInfoPanel).isEqualTo(true) + assertThat(service.hentSaksStatuser("id2", "token").first().skalViseVedtakInfoPanel).isEqualTo(false) } } diff --git a/src/test/kotlin/no/nav/sosialhjelp/innsyn/event/EventServiceTest.kt b/src/test/kotlin/no/nav/sosialhjelp/innsyn/event/EventServiceTest.kt index 4bec19445..7cce7e316 100644 --- a/src/test/kotlin/no/nav/sosialhjelp/innsyn/event/EventServiceTest.kt +++ b/src/test/kotlin/no/nav/sosialhjelp/innsyn/event/EventServiceTest.kt @@ -12,7 +12,7 @@ import no.nav.sbl.soknadsosialhjelp.digisos.soker.hendelse.JsonUtbetaling import no.nav.sbl.soknadsosialhjelp.soknad.JsonSoknad import no.nav.sosialhjelp.api.fiks.DigisosSak import no.nav.sosialhjelp.innsyn.app.ClientProperties -import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.SaksStatusService.Companion.DEFAULT_SAK_TITTEL +import no.nav.sosialhjelp.innsyn.digisossak.saksstatus.DEFAULT_SAK_TITTEL import no.nav.sosialhjelp.innsyn.domain.Hendelse import no.nav.sosialhjelp.innsyn.domain.HendelseTekstType import no.nav.sosialhjelp.innsyn.domain.InternalDigisosSoker