From 0c796671269edf649c6bbe26121800a0620332c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn-Are=20Flaten?= Date: Tue, 10 Dec 2024 11:01:20 +0100 Subject: [PATCH] chore: refactoring to use updated to handle oppgaver --- .../api/UtenlandskOppgaveDataFetcher.kt | 8 +- .../ferdigstilling/FerdigstillingService.kt | 15 -- .../papirsykmelding/NasjonalCommonService.kt | 24 +- .../papirsykmelding/NasjonalOppgaveService.kt | 244 ++++++++---------- .../NasjonalSykmeldingService.kt | 12 +- .../api/NasjonalOppgaveController.kt | 17 +- .../api/SmregistreringClient.kt | 1 - .../db/NasjonalOppgaveRepository.kt | 3 +- .../db/model/NasjonalManuellOppgaveDAO.kt | 16 +- .../OppgaveSecurityService.kt | 31 ++- .../digitalisering/OppgaveDataFetcherTest.kt | 8 +- .../FerdigstillingServiceTest.kt | 37 +-- .../NasjonalOppgaveServiceTest.kt | 12 + 13 files changed, 214 insertions(+), 214 deletions(-) diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/api/UtenlandskOppgaveDataFetcher.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/api/UtenlandskOppgaveDataFetcher.kt index 1a55ddb4..8cd822cc 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/api/UtenlandskOppgaveDataFetcher.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/api/UtenlandskOppgaveDataFetcher.kt @@ -57,7 +57,7 @@ class UtenlandskOppgaveDataFetcher( return mapToDigitalisertSykmelding(oppgave) } - @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId, '/api/graphql')") + @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId)") @DgsQuery(field = DgsConstants.QUERY.Oppgave) fun getOppgave( @InputArgument oppgaveId: String, @@ -118,7 +118,7 @@ class UtenlandskOppgaveDataFetcher( ) } - @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId, '/api/graphql')") + @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId)") @DgsMutation(field = DgsConstants.MUTATION.Lagre) fun lagreOppgave( @InputArgument oppgaveId: String, @@ -157,7 +157,7 @@ class UtenlandskOppgaveDataFetcher( } } - @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId, '/api/graphql')") + @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId)") @DgsMutation(field = DgsConstants.MUTATION.OppgaveTilbakeTilGosys) fun oppgaveTilbakeTilGosys( @InputArgument oppgaveId: String, @@ -177,7 +177,7 @@ class UtenlandskOppgaveDataFetcher( ) } - @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId, '/api/graphql')") + @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId)") @DgsMutation(field = DgsConstants.MUTATION.Avvis) fun avvis( @InputArgument oppgaveId: String, diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt index f108b7fa..05388a43 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt @@ -1,7 +1,6 @@ package no.nav.sykdig.digitalisering.ferdigstilling import no.nav.sykdig.LoggingMeta -import jakarta.persistence.EntityNotFoundException import no.nav.sykdig.applog import no.nav.sykdig.config.kafka.OK_SYKMELDING_TOPIC import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient @@ -11,8 +10,6 @@ import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.digitalisering.model.FerdistilltRegisterOppgaveValues import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppgaveDAO -import no.nav.sykdig.digitalisering.papirsykmelding.db.NasjonalOppgaveRepository -import no.nav.sykdig.digitalisering.papirsykmelding.db.model.Utfall import no.nav.sykdig.digitalisering.pdl.Person import no.nav.sykdig.digitalisering.pdl.toFormattedNameString import no.nav.sykdig.digitalisering.saf.SafJournalpostGraphQlClient @@ -36,7 +33,6 @@ class FerdigstillingService( private val sykmeldingOKProducer: KafkaProducer, private val dokumentService: DocumentService, private val sykmelderService: SykmelderService, - private val nasjonalOppgaveRepository: NasjonalOppgaveRepository, ) { val log = applog() val securelog = securelog() @@ -219,15 +215,4 @@ class FerdigstillingService( log.info("sendt oppdatert sykmelding med id ${receivedSykmelding.sykmelding.id}") updateUtenlandskDocumentTitle(oppgave, receivedSykmelding) } - - fun ferdigstillOppgaveGosys(oppgaveId: String, utfall: Utfall, navIdent: String) { - val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt()).orElseThrow { - EntityNotFoundException("Fant ikke oppgave") - } - oppgave.utfall = utfall - oppgave.ferdigstilt = true - oppgave.ferdigstiltAv = navIdent - - nasjonalOppgaveRepository.save(oppgave) - } } diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt index 1d373a04..8c23753d 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt @@ -125,6 +125,7 @@ class NasjonalCommonService( verdi } } + fun getNavIdent(): Veileder { val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken return Veileder(authentication.token.claims["NAVident"].toString()) @@ -134,6 +135,7 @@ class NasjonalCommonService( val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken return authentication.token.claims["preferred_username"].toString() } + private fun toSykmelding(sykmeldingId: String, oppgave: NasjonalManuellOppgaveDAO): Sykmelding { requireNotNull(oppgave.papirSmRegistrering.aktorId) { "PapirSmRegistrering.aktorId er null" } requireNotNull(oppgave.papirSmRegistrering.medisinskVurdering) { "PapirSmRegistrering.medisinskVurdering er null" } @@ -156,17 +158,33 @@ class NasjonalCommonService( meldingTilArbeidsgiver = oppgave.papirSmRegistrering.meldingTilArbeidsgiver, kontaktMedPasient = KontaktMedPasient( kontaktDato = oppgave.papirSmRegistrering.kontaktMedPasient?.kontaktDato, - begrunnelseIkkeKontakt = oppgave.papirSmRegistrering.kontaktMedPasient?.begrunnelseIkkeKontakt + begrunnelseIkkeKontakt = oppgave.papirSmRegistrering.kontaktMedPasient?.begrunnelseIkkeKontakt, ), behandletTidspunkt = LocalDateTime.from(oppgave.papirSmRegistrering.behandletTidspunkt), behandler = oppgave.papirSmRegistrering.behandler, - avsenderSystem = AvsenderSystem( //TODO + avsenderSystem = AvsenderSystem( + //TODO navn = "Navn avsendersystem", - versjon = "0.0" + versjon = "0.0", ), syketilfelleStartDato = oppgave.papirSmRegistrering.syketilfelleStartDato, signaturDato = LocalDateTime.from(oppgave.papirSmRegistrering.behandletTidspunkt), navnFastlege = "Fastlege navn", //TODO ) } + + fun getLoggingMeta(sykmeldingId: String, oppgave: NasjonalManuellOppgaveDAO): LoggingMeta { + return LoggingMeta( + mottakId = sykmeldingId, + dokumentInfoId = oppgave.dokumentInfoId, + msgId = sykmeldingId, + sykmeldingId = sykmeldingId, + journalpostId = oppgave.journalpostId, + ) + } } + +fun isValidOppgaveId(oppgaveId: String): Boolean { + val regex = Regex("^\\d{9}$|^[a-zA-Z0-9]{1,20}$") + return oppgaveId.matches(regex) +} \ No newline at end of file diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt index 2955ec65..33c5698f 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt @@ -47,8 +47,6 @@ class NasjonalOppgaveService( val mapper = jacksonObjectMapper() fun lagreOppgave(papirManuellOppgave: PapirManuellOppgave, ferdigstilt: Boolean = false): NasjonalManuellOppgaveDAO { - - fun lagreOppgave(papirManuellOppgave: PapirManuellOppgave): NasjonalManuellOppgaveDAO { val eksisterendeOppgave = nasjonalOppgaveRepository.findBySykmeldingId(papirManuellOppgave.sykmeldingId) securelog.info("Forsøkte å hente eksisterende oppgave med sykmeldingId ${papirManuellOppgave.sykmeldingId} , fant følgende: $eksisterendeOppgave") @@ -104,7 +102,7 @@ class NasjonalOppgaveService( private fun findByOppgaveId(oppgaveId: String): NasjonalManuellOppgaveDAO? { - if(!isValidOppgaveId(oppgaveId)) + if (!isValidOppgaveId(oppgaveId)) throw IllegalArgumentException("Invalid oppgaveId does not contain only alphanumerical characters. oppgaveId: $oppgaveId") val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt()) ?: return null @@ -179,99 +177,100 @@ class NasjonalOppgaveService( log.info("Finner ikke uløst oppgave med id $oppgaveId") return null } + fun avvisOppgave( oppgaveId: String, request: String, navEnhet: String, authorization: String - ): ResponseEntity { + ): ResponseEntity { val eksisterendeOppgave = getOppgave(oppgaveId, authorization) - if(eksisterendeOppgave == null) { - log.info("Fant ikke oppgave som skulle avvises: $oppgaveId") - return ResponseEntity(HttpStatus.NOT_FOUND) - } + if (eksisterendeOppgave == null) { + log.info("Fant ikke oppgave som skulle avvises: $oppgaveId") + return ResponseEntity(HttpStatus.NOT_FOUND) + } - if(eksisterendeOppgave.ferdigstilt) { - log.info("Oppgave med id $oppgaveId er allerede ferdigstilt") - return ResponseEntity(HttpStatus.NO_CONTENT) - } + if (eksisterendeOppgave.ferdigstilt) { + log.info("Oppgave med id $oppgaveId er allerede ferdigstilt") + return ResponseEntity(HttpStatus.NO_CONTENT) + } - val avvisningsgrunn = mapper.readValue(request, AvvisSykmeldingRequest::class.java).reason - val veilederIdent = nasjonalCommonService.getNavIdent().veilederIdent + val avvisningsgrunn = mapper.readValue(request, AvvisSykmeldingRequest::class.java).reason + val veilederIdent = nasjonalCommonService.getNavIdent().veilederIdent - ferdigstillNasjonalAvvistOppgave(eksisterendeOppgave, navEnhet, avvisningsgrunn, veilederIdent) - oppdaterOppgave( - eksisterendeOppgave.sykmeldingId, - utfall = Utfall.AVVIST.toString(), - ferdigstiltAv = veilederIdent, - avvisningsgrunn = avvisningsgrunn, - null - ) + ferdigstillNasjonalAvvistOppgave(eksisterendeOppgave, navEnhet, avvisningsgrunn, veilederIdent) + oppdaterOppgave( + eksisterendeOppgave.sykmeldingId, + utfall = Utfall.AVVIST.toString(), + ferdigstiltAv = veilederIdent, + avvisningsgrunn = avvisningsgrunn, + null + ) - log.info("Har avvist oppgave med oppgaveId $oppgaveId") - return ResponseEntity(HttpStatus.NO_CONTENT) + log.info("Har avvist oppgave med oppgaveId $oppgaveId") + return ResponseEntity(HttpStatus.NO_CONTENT) - } + } -fun mapToDao( - papirManuellOppgave: PapirManuellOppgave, - existingId: UUID?, - ferdigstilt: Boolean = false -): NasjonalManuellOppgaveDAO { - mapper.registerModules(JavaTimeModule()) - securelog.info("Mapper til DAO: $papirManuellOppgave") - - val nasjonalManuellOppgaveDAO = - NasjonalManuellOppgaveDAO( - sykmeldingId = papirManuellOppgave.sykmeldingId, - journalpostId = papirManuellOppgave.papirSmRegistering.journalpostId, - fnr = papirManuellOppgave.fnr, - aktorId = papirManuellOppgave.papirSmRegistering.aktorId, - dokumentInfoId = papirManuellOppgave.papirSmRegistering.dokumentInfoId, - datoOpprettet = papirManuellOppgave.papirSmRegistering.datoOpprettet?.toLocalDateTime(), - oppgaveId = papirManuellOppgave.oppgaveid, - ferdigstilt = ferdigstilt, - papirSmRegistrering = - PapirSmRegistering( - journalpostId = papirManuellOppgave.papirSmRegistering.journalpostId, - oppgaveId = papirManuellOppgave.papirSmRegistering.oppgaveId, - fnr = papirManuellOppgave.papirSmRegistering.fnr, - aktorId = papirManuellOppgave.papirSmRegistering.aktorId, - dokumentInfoId = papirManuellOppgave.papirSmRegistering.dokumentInfoId, - datoOpprettet = papirManuellOppgave.papirSmRegistering.datoOpprettet, - sykmeldingId = papirManuellOppgave.papirSmRegistering.sykmeldingId, - syketilfelleStartDato = papirManuellOppgave.papirSmRegistering.syketilfelleStartDato, - arbeidsgiver = papirManuellOppgave.papirSmRegistering.arbeidsgiver, - medisinskVurdering = papirManuellOppgave.papirSmRegistering.medisinskVurdering, - skjermesForPasient = papirManuellOppgave.papirSmRegistering.skjermesForPasient, - perioder = papirManuellOppgave.papirSmRegistering.perioder, - prognose = papirManuellOppgave.papirSmRegistering.prognose, - utdypendeOpplysninger = papirManuellOppgave.papirSmRegistering.utdypendeOpplysninger, - tiltakNAV = papirManuellOppgave.papirSmRegistering.tiltakNAV, - tiltakArbeidsplassen = papirManuellOppgave.papirSmRegistering.tiltakArbeidsplassen, - andreTiltak = papirManuellOppgave.papirSmRegistering.andreTiltak, - meldingTilNAV = papirManuellOppgave.papirSmRegistering.meldingTilNAV, - meldingTilArbeidsgiver = papirManuellOppgave.papirSmRegistering.meldingTilArbeidsgiver, - kontaktMedPasient = papirManuellOppgave.papirSmRegistering.kontaktMedPasient, - behandletTidspunkt = papirManuellOppgave.papirSmRegistering.behandletTidspunkt, - behandler = papirManuellOppgave.papirSmRegistering.behandler, - ), - utfall = null, - ferdigstiltAv = null, - datoFerdigstilt = null, - avvisningsgrunn = null, - ) + fun mapToDao( + papirManuellOppgave: PapirManuellOppgave, + existingId: UUID?, + ferdigstilt: Boolean = false + ): NasjonalManuellOppgaveDAO { + mapper.registerModules(JavaTimeModule()) + securelog.info("Mapper til DAO: $papirManuellOppgave") + + val nasjonalManuellOppgaveDAO = + NasjonalManuellOppgaveDAO( + sykmeldingId = papirManuellOppgave.sykmeldingId, + journalpostId = papirManuellOppgave.papirSmRegistering.journalpostId, + fnr = papirManuellOppgave.fnr, + aktorId = papirManuellOppgave.papirSmRegistering.aktorId, + dokumentInfoId = papirManuellOppgave.papirSmRegistering.dokumentInfoId, + datoOpprettet = papirManuellOppgave.papirSmRegistering.datoOpprettet?.toLocalDateTime(), + oppgaveId = papirManuellOppgave.oppgaveid, + ferdigstilt = ferdigstilt, + papirSmRegistrering = + PapirSmRegistering( + journalpostId = papirManuellOppgave.papirSmRegistering.journalpostId, + oppgaveId = papirManuellOppgave.papirSmRegistering.oppgaveId, + fnr = papirManuellOppgave.papirSmRegistering.fnr, + aktorId = papirManuellOppgave.papirSmRegistering.aktorId, + dokumentInfoId = papirManuellOppgave.papirSmRegistering.dokumentInfoId, + datoOpprettet = papirManuellOppgave.papirSmRegistering.datoOpprettet, + sykmeldingId = papirManuellOppgave.papirSmRegistering.sykmeldingId, + syketilfelleStartDato = papirManuellOppgave.papirSmRegistering.syketilfelleStartDato, + arbeidsgiver = papirManuellOppgave.papirSmRegistering.arbeidsgiver, + medisinskVurdering = papirManuellOppgave.papirSmRegistering.medisinskVurdering, + skjermesForPasient = papirManuellOppgave.papirSmRegistering.skjermesForPasient, + perioder = papirManuellOppgave.papirSmRegistering.perioder, + prognose = papirManuellOppgave.papirSmRegistering.prognose, + utdypendeOpplysninger = papirManuellOppgave.papirSmRegistering.utdypendeOpplysninger, + tiltakNAV = papirManuellOppgave.papirSmRegistering.tiltakNAV, + tiltakArbeidsplassen = papirManuellOppgave.papirSmRegistering.tiltakArbeidsplassen, + andreTiltak = papirManuellOppgave.papirSmRegistering.andreTiltak, + meldingTilNAV = papirManuellOppgave.papirSmRegistering.meldingTilNAV, + meldingTilArbeidsgiver = papirManuellOppgave.papirSmRegistering.meldingTilArbeidsgiver, + kontaktMedPasient = papirManuellOppgave.papirSmRegistering.kontaktMedPasient, + behandletTidspunkt = papirManuellOppgave.papirSmRegistering.behandletTidspunkt, + behandler = papirManuellOppgave.papirSmRegistering.behandler, + ), + utfall = null, + ferdigstiltAv = null, + datoFerdigstilt = null, + avvisningsgrunn = null, + ) - if (existingId != null) { - nasjonalManuellOppgaveDAO.apply { - id = existingId + if (existingId != null) { + nasjonalManuellOppgaveDAO.apply { + id = existingId + } } - } - return nasjonalManuellOppgaveDAO -} + return nasjonalManuellOppgaveDAO + } fun mapFromDao( nasjonalManuellOppgaveDAO: NasjonalManuellOppgaveDAO @@ -314,62 +313,53 @@ fun mapToDao( } -fun ferdigstillNasjonalAvvistOppgave( - oppgave: NasjonalManuellOppgaveDAO, - navEnhet: String, - avvisningsgrunn: String?, - veilederIdent: String, -) { + fun ferdigstillNasjonalAvvistOppgave( + oppgave: NasjonalManuellOppgaveDAO, + navEnhet: String, + avvisningsgrunn: String?, + veilederIdent: String, + ) { - if (oppgave.fnr != null) { - val sykmeldt = - personService.getPerson( - id = oppgave.fnr, - callId = oppgave.sykmeldingId, + if (oppgave.fnr != null) { + val sykmeldt = + personService.getPerson( + id = oppgave.fnr, + callId = oppgave.sykmeldingId, + ) + val avvistGrunn = enumValues().find { it.name.equals(avvisningsgrunn, ignoreCase = true) } + ferdigstillingService.ferdigstillNasjonalAvvistJournalpost( + enhet = navEnhet, + oppgave = oppgave, + sykmeldt = sykmeldt, + avvisningsGrunn = avvistGrunn?.let { mapAvvisningsgrunn(it, null) }, + loggingMeta = nasjonalCommonService.getLoggingMeta(oppgave.sykmeldingId, oppgave), ) - val avvistGrunn = enumValues().find { it.name.equals(avvisningsgrunn, ignoreCase = true) } - ferdigstillingService.ferdigstillNasjonalAvvistJournalpost( - enhet = navEnhet, - oppgave = oppgave, - sykmeldt = sykmeldt, - avvisningsGrunn = avvistGrunn?.let { mapAvvisningsgrunn(it, null) }, - loggingMeta = getLoggingMeta(oppgave.sykmeldingId, oppgave), - ) - } else { - log.error("Fant ikke fnr for oppgave med id $oppgave.oppgaveId") + } else { + log.error("Fant ikke fnr for oppgave med id $oppgave.oppgaveId") + } } - fun ferdigstillOgSendOppgaveTilGosys(oppgaveId: String) { - val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt()) + fun ferdigstillOgSendOppgaveTilGosys(oppgaveId: String, authorization: String) { + val eksisterendeOppgave = getOppgave(oppgaveId, authorization) - if (!oppgave.isPresent) { + if (eksisterendeOppgave == null) { log.warn("Fant ikke oppgave med id $oppgaveId") throw NoOppgaveException("Fant ikke oppgave med id $oppgaveId") } - val sykmeldingId = oppgave.get().sykmeldingId - val journalpostId = oppgave.get().journalpostId - val dokumentInfoId = oppgave.get().dokumentInfoId - - val loggingMeta = - LoggingMeta( - mottakId = sykmeldingId, - dokumentInfoId = dokumentInfoId, - msgId = sykmeldingId, - sykmeldingId = sykmeldingId, - journalpostId = journalpostId, - ) + val sykmeldingId = eksisterendeOppgave.sykmeldingId + + val loggingMeta = nasjonalCommonService.getLoggingMeta(sykmeldingId, eksisterendeOppgave) log.info( "Sender nasjonal oppgave med id $oppgaveId til Gosys {}", StructuredArguments.fields(loggingMeta) ) - val navIdent = getNavEmail() - gosysService.sendOppgaveTilGosys(oppgaveId, oppgave.get().sykmeldingId, navIdent) - - ferdigstillingService.ferdigstillOppgaveGosys(oppgaveId, Utfall.SENDT_TIL_GOSYS, navIdent) + val navIdent = nasjonalCommonService.getNavIdent().veilederIdent + gosysService.sendOppgaveTilGosys(oppgaveId, sykmeldingId, navIdent) + oppdaterOppgave(sykmeldingId, Utfall.SENDT_TIL_GOSYS.toString(), navIdent, null, null) log.info( "Ferdig å sende oppgave med id $oppgaveId til Gosys {}", @@ -379,19 +369,3 @@ fun ferdigstillNasjonalAvvistOppgave( metricRegister.sendtTilGosysNasjonal.increment() } } - -private fun getLoggingMeta(sykmeldingId: String, oppgave: NasjonalManuellOppgaveDAO): LoggingMeta { - return LoggingMeta( - mottakId = sykmeldingId, - dokumentInfoId = oppgave.dokumentInfoId, - msgId = sykmeldingId, - sykmeldingId = sykmeldingId, - journalpostId = oppgave.journalpostId, - ) -} -} - -fun isValidOppgaveId(oppgaveId: String): Boolean { - val regex = Regex("^\\d{9}$|^[a-zA-Z0-9]{1,20}$") - return oppgaveId.matches(regex) -} diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt index 6a0928dd..8a5e0fd3 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt @@ -47,16 +47,6 @@ class NasjonalSykmeldingService( val securelog = securelog() - private fun getLoggingMeta(sykmeldingId: String, oppgave: NasjonalManuellOppgaveDAO): LoggingMeta { - return LoggingMeta( - mottakId = sykmeldingId, - dokumentInfoId = oppgave.dokumentInfoId, - msgId = sykmeldingId, - sykmeldingId = sykmeldingId, - journalpostId = oppgave.journalpostId, - ) - } - suspend fun sendPapirsykmelding(smRegistreringManuell: SmRegistreringManuell, navEnhet: String, callId: String, oppgaveId: String, authorization: String): ResponseEntity { val oppgave = nasjonalOppgaveService.getOppgave(oppgaveId, authorization) ?: return ResponseEntity(HttpStatus.NOT_FOUND) if (oppgave.ferdigstilt) { @@ -66,7 +56,7 @@ class NasjonalSykmeldingService( val sykmeldingId = oppgave.sykmeldingId log.info("Forsøker å ferdigstille papirsykmelding med sykmeldingId $sykmeldingId") - val loggingMeta = getLoggingMeta(sykmeldingId, oppgave) + val loggingMeta = nasjonalCommonService.getLoggingMeta(sykmeldingId, oppgave) val sykmelder = getSykmelder(smRegistreringManuell, loggingMeta, callId) val receivedSykmelding = nasjonalCommonService.createReceivedSykmelding(sykmeldingId, oppgave, loggingMeta, smRegistreringManuell, callId, sykmelder) diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt index 07e65a67..b8cf88b4 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt @@ -42,7 +42,7 @@ class NasjonalOppgaveController( val securelog = securelog() @PostMapping("/oppgave/{oppgaveId}/avvis") - @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization)") + @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization, '/oppgave/{oppgaveId}/avvis')") @WithSpan fun avvisOppgave( @PathVariable oppgaveId: String, @@ -55,7 +55,7 @@ class NasjonalOppgaveController( } @GetMapping("/oppgave/{oppgaveId}") - @PostAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization)") + @PostAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization, '/oppgave/{oppgaveId}')") @ResponseBody @WithSpan fun getPapirsykmeldingManuellOppgave( @@ -107,7 +107,7 @@ class NasjonalOppgaveController( } @PostMapping("/oppgave/{oppgaveId}/send") - @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization)") + @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization, '/oppgave/{oppgaveId}/send')") @ResponseBody @WithSpan suspend fun sendOppgave( @@ -122,7 +122,7 @@ class NasjonalOppgaveController( } @GetMapping("/sykmelding/{sykmeldingId}/ferdigstilt") - @PostAuthorize("@oppgaveSecurityService.hasAccessToNasjonalSykmelding(#sykmeldingId, #authorization)") + @PostAuthorize("@oppgaveSecurityService.hasAccessToNasjonalSykmelding(#sykmeldingId, #authorization, '/sykmelding/{sykmeldingId}/ferdigstilt')") @ResponseBody @WithSpan fun getFerdigstiltSykmelding( @@ -140,23 +140,24 @@ class NasjonalOppgaveController( return ResponseEntity.notFound().build() } - @PostMapping("/oppgave/{oppgaveId}/tilgosys") - @PreAuthorize("@oppgaveSecurityService.hasAccessToOppgave(#oppgaveId, '/oppgave/{oppgaveId}/tilgosys')") + @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization, '/oppgave/{oppgaveId}/tilgosys')") + @WithSpan fun sendOppgaveTilGosys( @PathVariable oppgaveId: String, + @RequestHeader("Authorization") authorization: String, ): ResponseEntity { if (oppgaveId.isBlank()) { log.info("oppgaveId mangler for å kunne sende oppgave til Gosys") return ResponseEntity.badRequest().build() } log.info("papirsykmelding: Sender oppgave med id $oppgaveId til Gosys") - nasjonalOppgaveService.ferdigstillOgSendOppgaveTilGosys(oppgaveId) + nasjonalOppgaveService.ferdigstillOgSendOppgaveTilGosys(oppgaveId, authorization) return ResponseEntity.noContent().build() } @PostMapping("/sykmelding/{sykmeldingId}") - @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalSykmelding(#sykmeldingId, #authorization)") + @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalSykmelding(#sykmeldingId, #authorization, '/sykmelding/{sykmeldingId}')") @WithSpan fun korrigerSykmelding( @PathVariable sykmeldingId: String, diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/SmregistreringClient.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/SmregistreringClient.kt index f5a3c2c5..53436641 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/SmregistreringClient.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/SmregistreringClient.kt @@ -4,7 +4,6 @@ import no.nav.sykdig.applog import no.nav.sykdig.digitalisering.papirsykmelding.api.model.AvvisSykmeldingRequest import no.nav.sykdig.digitalisering.papirsykmelding.api.model.PapirManuellOppgave import no.nav.sykdig.digitalisering.papirsykmelding.api.model.SmRegistreringManuell -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.Sykmelder import no.nav.sykdig.digitalisering.papirsykmelding.isValidOppgaveId import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpEntity diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/NasjonalOppgaveRepository.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/NasjonalOppgaveRepository.kt index 1e1964d6..df63e62e 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/NasjonalOppgaveRepository.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/NasjonalOppgaveRepository.kt @@ -4,12 +4,11 @@ import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppg import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository import org.springframework.transaction.annotation.Transactional -import java.util.UUID +import java.util.* @Transactional @Repository interface NasjonalOppgaveRepository : CrudRepository { fun findBySykmeldingId(sykmeldingId: String): NasjonalManuellOppgaveDAO? fun findByOppgaveId(oppgaveId: Int): NasjonalManuellOppgaveDAO? - fun findByOppgaveIdAndFerdigstiltIsFalse(oppgaveId: Int): NasjonalManuellOppgaveDAO? } diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/model/NasjonalManuellOppgaveDAO.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/model/NasjonalManuellOppgaveDAO.kt index fd2fb669..945cb884 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/model/NasjonalManuellOppgaveDAO.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/db/model/NasjonalManuellOppgaveDAO.kt @@ -1,22 +1,12 @@ package no.nav.sykdig.digitalisering.papirsykmelding.db.model -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import jakarta.persistence.GeneratedValue import no.nav.sykdig.digitalisering.papirsykmelding.api.model.PapirSmRegistering -import no.nav.sykdig.objectMapper -import org.postgresql.util.PGobject -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.core.convert.converter.Converter import org.springframework.data.annotation.Id -import org.springframework.data.convert.ReadingConverter -import org.springframework.data.convert.WritingConverter -import org.springframework.data.jdbc.core.convert.JdbcCustomConversions import org.springframework.data.relational.core.mapping.Column import org.springframework.data.relational.core.mapping.Table import java.time.LocalDateTime -import java.util.UUID +import java.util.* @Table(name = "nasjonal_manuelloppgave") data class NasjonalManuellOppgaveDAO( @@ -38,11 +28,11 @@ data class NasjonalManuellOppgaveDAO( @Column("oppgave_id") val oppgaveId: Int? = null, @Column("ferdigstilt") - var ferdigstilt: Boolean = false, + val ferdigstilt: Boolean = false, @Column("papir_sm_registrering") val papirSmRegistrering: PapirSmRegistering, @Column("utfall") - var utfall: Utfall? = null, + var utfall: String? = null, @Column("ferdigstilt_av") var ferdigstiltAv: String? = null, @Column("dato_ferdigstilt") diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt index ff9488b5..d2be3a37 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt @@ -38,20 +38,34 @@ class OppgaveSecurityService( return tilgang } - fun hasAccessToNasjonalOppgave(oppgaveId: String, authorization: String): Boolean { + fun hasAccessToNasjonalOppgave(oppgaveId: String, authorization: String, requestPath: String): Boolean { securelog.info("sjekker om bruker har tilgang på oppgave $oppgaveId") + val oppgave = nasjonalOppgaveService.getOppgave(oppgaveId, authorization) val navEmail = nasjonalCommonService.getNavEmail() val fnr = oppgave?.fnr if (oppgave != null && fnr != null) { val tilgang = hasAccess(fnr, navEmail) securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $oppgaveId") + auditlog.info( + AuditLogger().createcCefMessage( + fnr = fnr, + navEmail = navEmail, + operation = AuditLogger.Operation.READ, + requestPath = requestPath, + permit = + when (tilgang) { + true -> AuditLogger.Permit.PERMIT + false -> AuditLogger.Permit.DENY + }, + ), + ) return tilgang } return false } - fun hasAccessToNasjonalSykmelding(sykmeldingId: String, authorization: String): Boolean { + fun hasAccessToNasjonalSykmelding(sykmeldingId: String, authorization: String, requestPath: String): Boolean { securelog.info("sjekker om bruker har tilgang på sykmelding $sykmeldingId") val oppgave = nasjonalOppgaveService.findBySykmeldingId(sykmeldingId) val navEmail = nasjonalCommonService.getNavEmail() @@ -59,6 +73,19 @@ class OppgaveSecurityService( if (oppgave != null && fnr != null) { val tilgang = hasAccess(fnr, navEmail) securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $sykmeldingId") + auditlog.info( + AuditLogger().createcCefMessage( + fnr = fnr, + navEmail = navEmail, + operation = AuditLogger.Operation.READ, + requestPath = requestPath, + permit = + when (tilgang) { + true -> AuditLogger.Permit.PERMIT + false -> AuditLogger.Permit.DENY + }, + ), + ) return tilgang } return false diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/OppgaveDataFetcherTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/OppgaveDataFetcherTest.kt index 9e0a844d..55b8288d 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/OppgaveDataFetcherTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/OppgaveDataFetcherTest.kt @@ -37,7 +37,7 @@ import org.springframework.security.core.context.SecurityContext import org.springframework.security.core.context.SecurityContextHolder import java.time.LocalDate import java.time.OffsetDateTime -import java.util.UUID +import java.util.* @SpringBootTest( classes = [ @@ -71,7 +71,7 @@ class OppgaveDataFetcherTest { Mockito.`when`(securityContext.authentication).thenReturn(authentication) SecurityContextHolder.setContext(securityContext) Mockito.`when`(authentication.isAuthenticated).thenReturn(true) - Mockito.`when`(securityService.hasAccessToOppgave(anyString(), anyString())).thenAnswer { true } + Mockito.`when`(securityService.hasAccessToOppgave(anyString())).thenAnswer { true } } @Test @@ -168,7 +168,7 @@ class OppgaveDataFetcherTest { @Test fun `querying oppgave no access to oppgave`() { - Mockito.`when`(securityService.hasAccessToOppgave(anyString(), anyString())).thenAnswer { false } + Mockito.`when`(securityService.hasAccessToOppgave(anyString())).thenAnswer { false } Mockito.`when`(oppgaveService.getDigitaiseringsoppgave("123")).thenAnswer { SykDigOppgave( oppgaveDbModel = @@ -336,7 +336,7 @@ class OppgaveDataFetcherTest { @Test fun `lager oppgave uten tilgang`() { - Mockito.`when`(securityService.hasAccessToOppgave(anyString(), anyString())).thenAnswer { false } + Mockito.`when`(securityService.hasAccessToOppgave(anyString())).thenAnswer { false } Mockito.`when`(oppgaveService.getDigitaiseringsoppgave("345")).thenAnswer { SykDigOppgave( oppgaveDbModel = diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt index 4be4311e..b3672c23 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt @@ -5,8 +5,15 @@ import no.nav.sykdig.SykDigBackendApplication import no.nav.sykdig.digitalisering.createDigitalseringsoppgaveDbModel import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient import no.nav.sykdig.digitalisering.dokument.DocumentService +import no.nav.sykdig.digitalisering.felles.AktivitetIkkeMulig +import no.nav.sykdig.digitalisering.felles.AvsenderSystem +import no.nav.sykdig.digitalisering.felles.Diagnose +import no.nav.sykdig.digitalisering.felles.KontaktMedPasient +import no.nav.sykdig.digitalisering.felles.Periode +import no.nav.sykdig.digitalisering.felles.SporsmalSvar import no.nav.sykdig.digitalisering.ferdigstilling.mapping.mapToReceivedSykmelding import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient +import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.digitalisering.model.FerdistilltRegisterOppgaveValues import no.nav.sykdig.digitalisering.papirsykmelding.api.model.PapirSmRegistering import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppgaveDAO @@ -22,14 +29,7 @@ import no.nav.sykdig.digitalisering.saf.graphql.Journalstatus import no.nav.sykdig.digitalisering.saf.graphql.SafJournalpost import no.nav.sykdig.digitalisering.saf.graphql.SafQueryJournalpost import no.nav.sykdig.digitalisering.saf.graphql.TEMA_SYKMELDING -import no.nav.sykdig.digitalisering.felles.AktivitetIkkeMulig -import no.nav.sykdig.digitalisering.felles.AvsenderSystem -import no.nav.sykdig.digitalisering.felles.Diagnose -import no.nav.sykdig.digitalisering.felles.KontaktMedPasient -import no.nav.sykdig.digitalisering.felles.Periode import no.nav.sykdig.digitalisering.sykmelding.ReceivedSykmelding -import no.nav.sykdig.digitalisering.felles.SporsmalSvar -import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.generated.types.DiagnoseInput import no.nav.sykdig.generated.types.PeriodeInput import no.nav.sykdig.generated.types.PeriodeType @@ -47,10 +47,11 @@ import org.springframework.boot.test.autoconfigure.actuate.observability.AutoCon import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.mock.mockito.MockBean import java.time.LocalDate +import java.time.LocalDateTime import java.time.Month import java.time.OffsetDateTime import java.time.ZoneOffset -import java.util.UUID +import java.util.* @TestInstance(TestInstance.Lifecycle.PER_CLASS) @AutoConfigureObservability @@ -78,8 +79,7 @@ class FerdigstillingServiceTest : IntegrationTest() { @BeforeEach fun setup() { - ferdigstillingService = - FerdigstillingService(safJournalpostGraphQlClient, dokarkivClient, oppgaveClient, sykmeldingOKProducer, dokumentService, sykmelderService, nasjonalOppgaveRepository) + ferdigstillingService = FerdigstillingService(safJournalpostGraphQlClient, dokarkivClient, oppgaveClient, sykmeldingOKProducer, dokumentService, sykmelderService) nasjonalOppgaveRepository.deleteAll() } @@ -426,16 +426,21 @@ class FerdigstillingServiceTest : IntegrationTest() { fun `ferdigstill oppgave gosys`() { val oppgaveId = 444 nasjonalOppgaveRepository.save(nasjonalOppgave(null, oppgaveId)) - val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId).get() + val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId) + + requireNotNull(oppgave) + val updatedOppgave = oppgave.copy( + utfall = Utfall.SENDT_TIL_GOSYS.toString(), + ferdigstilt = true, + ferdigstiltAv = "nav-ident@mail.no" + ) - oppgave.utfall = Utfall.SENDT_TIL_GOSYS - oppgave.ferdigstilt = true - oppgave.ferdigstiltAv = "nav-ident@mail.no" - val ferdigstiltOppgave = nasjonalOppgaveRepository.save(oppgave) + val ferdigstiltOppgave = nasjonalOppgaveRepository.save(updatedOppgave) + requireNotNull(ferdigstiltOppgave) assertEquals(ferdigstiltOppgave.oppgaveId, 444) - assertEquals(ferdigstiltOppgave.utfall, Utfall.SENDT_TIL_GOSYS) + assertEquals(ferdigstiltOppgave.utfall, Utfall.SENDT_TIL_GOSYS.toString()) assertEquals(ferdigstiltOppgave.ferdigstilt, true) assertEquals(ferdigstiltOppgave.ferdigstiltAv, "nav-ident@mail.no") } diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt index 2200542b..fa6df95d 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt @@ -3,6 +3,7 @@ package no.nav.sykdig.digitalisering.papirsykmelding import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import kotlinx.coroutines.runBlocking import no.nav.sykdig.IntegrationTest +import no.nav.sykdig.LoggingMeta import no.nav.sykdig.digitalisering.SykDigOppgaveService import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient import no.nav.sykdig.digitalisering.dokument.DocumentService @@ -130,6 +131,7 @@ class NasjonalOppgaveServiceTest : IntegrationTest() { Mockito.`when`(sykmelderService.getSykmelder(org.mockito.kotlin.any(), org.mockito.kotlin.any())).thenReturn(testDataSykmelder()) Mockito.doNothing().`when`(oppgaveClient).ferdigstillOppgave(org.mockito.kotlin.any(), org.mockito.kotlin.any()) Mockito.doNothing().`when`(documentService).updateDocumentTitle(org.mockito.kotlin.any(), org.mockito.kotlin.any(), org.mockito.kotlin.any()) + Mockito.`when`(nasjonaCommonService.getLoggingMeta(org.mockito.kotlin.any(), org.mockito.kotlin.any())).thenReturn(testDataLoggingMeta()) assertTrue(originalOppgave.avvisningsgrunn == null) val avvistOppgave = nasjonalOppgaveService.avvisOppgave(oppgaveId, request, "enhet", "auth") @@ -307,4 +309,14 @@ class NasjonalOppgaveServiceTest : IntegrationTest() { SecurityContextHolder.setContext(securityContext) ReactiveSecurityContextHolder.withSecurityContext(Mono.just(securityContext)) } + + fun testDataLoggingMeta(): LoggingMeta { + return LoggingMeta( + mottakId = "mottakId", + journalpostId = "journalpostId", + dokumentInfoId = "dokumentInfoId", + msgId = "msgId", + sykmeldingId = "sykmeldingId", + ) + } }