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 86021e8b..4b403de7 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt @@ -44,27 +44,36 @@ class NasjonalOppgaveService( suspend fun lagreOppgave(papirManuellOppgave: PapirManuellOppgave): NasjonalManuellOppgaveDAO = withContext(Dispatchers.IO) { val eksisterendeOppgave = nasjonalOppgaveRepository.findBySykmeldingId(papirManuellOppgave.sykmeldingId) - if (eksisterendeOppgave.isPresent) { - log.info("Fant eksisterende oppgave med sykmeldingId ${papirManuellOppgave.sykmeldingId} , oppdaterer oppgave med database id ${eksisterendeOppgave.get().id}") - nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, eksisterendeOppgave.get().id)) + if (eksisterendeOppgave != null) { + log.info("Fant eksisterende oppgave med sykmeldingId ${papirManuellOppgave.sykmeldingId} , oppdaterer oppgave med database id ${eksisterendeOppgave.id}") + nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, eksisterendeOppgave.id)) } val res = nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, null)) - log.info("Lagret oppgave med sykmeldingId ${res.sykmeldingId} og med database id ${eksisterendeOppgave.get().id}") + log.info("Lagret oppgave med sykmeldingId ${res.sykmeldingId} og med database id ${eksisterendeOppgave?.id}") res } - suspend fun oppdaterOppgave(sykmeldingId: String, utfall: String, ferdigstiltAv: String, avvisningsgrunn: String?): NasjonalManuellOppgaveDAO = withContext(Dispatchers.IO){ - nasjonalOppgaveRepository.save( - mapToUpdateDao(sykmeldingId, utfall, ferdigstiltAv, avvisningsgrunn, nasjonalOppgaveRepository.findBySykmeldingId(sykmeldingId).get()), - ) + suspend fun oppdaterOppgave(sykmeldingId: String, utfall: String, ferdigstiltAv: String, avvisningsgrunn: String?): NasjonalManuellOppgaveDAO? = withContext(Dispatchers.IO){ + val updated = nasjonalOppgaveRepository.findBySykmeldingId(sykmeldingId)?.copy( + utfall = utfall, + ferdigstiltAv = ferdigstiltAv, + avvisningsgrunn = avvisningsgrunn, + datoFerdigstilt = LocalDateTime.now(), + ferdigstilt = true, + ) + when (updated) { + null -> log.info("Sykmelding $sykmeldingId not found ") + else -> nasjonalOppgaveRepository.save(updated) + } + updated } suspend fun findByOppgaveId(oppgaveId: Int): NasjonalManuellOppgaveDAO? { val oppgave = withContext(Dispatchers.IO) { nasjonalOppgaveRepository.findByOppgaveId(oppgaveId) } - if (!oppgave.isPresent) return null - return oppgave.get() + if (oppgave == null) return null + return oppgave } suspend fun getNasjonalOppgave(oppgaveId: String): NasjonalManuellOppgaveDAO { @@ -96,14 +105,14 @@ class NasjonalOppgaveService( val eksisterendeOppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId) val avvisningsgrunn = mapper.readValue(request, AvvisSykmeldingRequest::class.java).reason - if (eksisterendeOppgave.isPresent) { + if (eksisterendeOppgave != null) { val navEmail = oppgaveSecurityService.getNavEmailAsync() log.info("navEmail: $navEmail") // val veilederIdent = oppgaveSecurityService.getNavIdent().veilederIdent val veilederIdent = navEmail ferdigstillNasjonalAvvistOppgave(oppgaveId, authorization, navEnhet, navEmail, avvisningsgrunn, veilederIdent) val res = oppdaterOppgave( - eksisterendeOppgave.get().sykmeldingId, + eksisterendeOppgave.sykmeldingId, utfall = Utfall.AVVIST.toString(), ferdigstiltAv = veilederIdent, avvisningsgrunn = avvisningsgrunn, @@ -262,4 +271,4 @@ private fun getLoggingMeta(sykmeldingId: String, oppgave: NasjonalManuellOppgave journalpostId = oppgave.journalpostId, ) } -} \ No newline at end of file +} 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 0034ed34..5b7cc1ac 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 @@ -11,6 +11,6 @@ import java.util.UUID @Transactional @Repository interface NasjonalOppgaveRepository : CrudRepository { - fun findBySykmeldingId(sykmeldingId: String): Optional - fun findByOppgaveId(oppgaveId: Int): Optional + fun findBySykmeldingId(sykmeldingId: String): NasjonalManuellOppgaveDAO? + fun findByOppgaveId(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 915257e2..da0a0dd0 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 @@ -19,7 +19,7 @@ import java.time.LocalDateTime import java.util.UUID @Table(name = "nasjonal_manuelloppgave") -open class NasjonalManuellOppgaveDAO( +data class NasjonalManuellOppgaveDAO( @Id @GeneratedValue(generator = "UUID") var id: UUID? = null, 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 829b5103..1760ad82 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/tilgangskontroll/OppgaveSecurityService.kt @@ -43,100 +43,99 @@ class OppgaveSecurityService( return tilgang } - suspend fun hasAccessToNasjonalOppgave(oppgaveId: String): Boolean { - securelog.info("sjekker om bruker har tilgang på oppgave $oppgaveId") - val oppgave = withContext(Dispatchers.IO) { - nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt()) + suspend fun hasAccessToNasjonalOppgave(oppgaveId: String): Boolean = withContext( + Dispatchers.IO) { + securelog.info("sjekker om bruker har tilgang på oppgave $oppgaveId") + val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt()) + val navEmail = getNavEmailAsync() + 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") + tilgang + } + false } - val navEmail = getNavEmailAsync() - val fnr = oppgave.get().fnr - if (oppgave.isPresent && fnr != null) { - val tilgang = hasAccess(fnr, navEmail) - securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $oppgaveId") + + fun hasAccessToSykmelding(sykmeldingId: String): Boolean { + securelog.info("sjekker om bruker har tilgang på sykmelding $sykmeldingId") + val oppgave = sykDigOppgaveService.getOppgaveFromSykmeldingId(sykmeldingId) + val navEmail = getNavEmail() + val tilgang = hasAccess(oppgave.fnr, navEmail) + securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $sykmeldingId") return tilgang } - return false - } - fun hasAccessToSykmelding(sykmeldingId: String): Boolean { - securelog.info("sjekker om bruker har tilgang på sykmelding $sykmeldingId") - val oppgave = sykDigOppgaveService.getOppgaveFromSykmeldingId(sykmeldingId) - val navEmail = getNavEmail() - val tilgang = hasAccess(oppgave.fnr, navEmail) - securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $sykmeldingId") - return tilgang - } - - fun hasAccessToJournalpost(journalpostResult: JournalpostResult): Boolean { - return when (journalpostResult) { - is Journalpost -> return hasAccess(journalpostResult.fnr, getNavEmail()) - is JournalpostStatus -> return true - else -> false + fun hasAccessToJournalpost(journalpostResult: JournalpostResult): Boolean { + return when (journalpostResult) { + is Journalpost -> return hasAccess(journalpostResult.fnr, getNavEmail()) + is JournalpostStatus -> return true + else -> false + } } - } - fun hasAccessToJournalpostId(journalpostId: String): Boolean { - val journalpost = safGraphQlClient.getJournalpost(journalpostId) - securelog.info("journalpostid $journalpostId ble hentet: ${objectMapper.writeValueAsString(journalpost)}") + fun hasAccessToJournalpostId(journalpostId: String): Boolean { + val journalpost = safGraphQlClient.getJournalpost(journalpostId) + securelog.info("journalpostid $journalpostId ble hentet: ${objectMapper.writeValueAsString(journalpost)}") - val id = - when (journalpost.journalpost?.bruker?.type) { - Type.ORGNR -> null - else -> journalpost.journalpost?.bruker?.id - } + val id = + when (journalpost.journalpost?.bruker?.type) { + Type.ORGNR -> null + else -> journalpost.journalpost?.bruker?.id + } - if (id == null) { - securelog.info("Fant ikke id i journalpost: $journalpostId") - return false - } + if (id == null) { + securelog.info("Fant ikke id i journalpost: $journalpostId") + return false + } - val fnr = personService.getPerson(id, journalpostId).fnr + val fnr = personService.getPerson(id, journalpostId).fnr - securelog.info("Fødselsnummer: $fnr") - val navEmail = getNavEmail() - val tilgang = hasAccess(fnr, journalpostId) - securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} til journalpost med id $journalpostId") - return tilgang - } + securelog.info("Fødselsnummer: $fnr") + val navEmail = getNavEmail() + val tilgang = hasAccess(fnr, journalpostId) + securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} til journalpost med id $journalpostId") + return tilgang + } - private fun hasAccess( - fnr: String, - navEmail: String, - ): Boolean { - val tilgang = istilgangskontrollOboClient.sjekkTilgangVeileder(fnr) - auditlog.info( - AuditLogger().createcCefMessage( - fnr = fnr, - navEmail = navEmail, - operation = AuditLogger.Operation.READ, - requestPath = "/api/graphql", - permit = - when (tilgang) { - true -> AuditLogger.Permit.PERMIT - false -> AuditLogger.Permit.DENY - }, - ), - ) + private fun hasAccess( + fnr: String, + navEmail: String, + ): Boolean { + val tilgang = istilgangskontrollOboClient.sjekkTilgangVeileder(fnr) + auditlog.info( + AuditLogger().createcCefMessage( + fnr = fnr, + navEmail = navEmail, + operation = AuditLogger.Operation.READ, + requestPath = "/api/graphql", + permit = + when (tilgang) { + true -> AuditLogger.Permit.PERMIT + false -> AuditLogger.Permit.DENY + }, + ), + ) - return tilgang - } + return tilgang + } - fun getNavIdent(): Veileder { - val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken - return Veileder(authentication.token.claims["NAVident"].toString()) - } + fun getNavIdent(): Veileder { + val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken + return Veileder(authentication.token.claims["NAVident"].toString()) + } - fun getNavEmail(): String { - val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken - return authentication.token.claims["preferred_username"].toString() - } + fun getNavEmail(): String { + val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken + return authentication.token.claims["preferred_username"].toString() + } - suspend fun getNavEmailAsync(): String { - return ReactiveSecurityContextHolder.getContext().map { context -> - val auth = context.authentication as JwtAuthenticationToken - auth.token.claims["preferred_username"].toString() - }.awaitSingle() - } + suspend fun getNavEmailAsync(): String { + return ReactiveSecurityContextHolder.getContext().map { context -> + val auth = context.authentication as JwtAuthenticationToken + auth.token.claims["preferred_username"].toString() + }.awaitSingle() + } } diff --git a/src/main/resources/db/migration/V14__create_nasjonal_tables.sql b/src/main/resources/db/migration/V14__create_nasjonal_tables.sql index 6dd91651..1d9b0593 100644 --- a/src/main/resources/db/migration/V14__create_nasjonal_tables.sql +++ b/src/main/resources/db/migration/V14__create_nasjonal_tables.sql @@ -1,6 +1,3 @@ -drop table if exists nasjonal_manuelloppgave; -drop table if exists nasjonal_sykmelding; - create table nasjonal_manuelloppgave ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, @@ -9,25 +6,30 @@ create table nasjonal_manuelloppgave fnr VARCHAR NULL, aktor_id VARCHAR NULL, dokument_info_id VARCHAR NULL, - dato_opprettet TIMESTAMP NULL, + dato_opprettet TIMESTAMP with time zone NULL, oppgave_id INT, ferdigstilt boolean NOT NULL, papir_sm_registrering JSONB NULL, utfall VARCHAR NULL, ferdigstilt_av VARCHAR NULL, - dato_ferdigstilt TIMESTAMP NULL, + dato_ferdigstilt TIMESTAMP with time zone NULL, avvisningsgrunn VARCHAR NULL ); create table nasjonal_sykmelding ( - sykmelding_id VARCHAR NOT NULL, + id UUID DEFAULT gen_random_uuid() PRIMARY KEY, + sykmelding_id VARCHAR NOT NULL, sykmelding JSONB NOT NULL, timestamp TIMESTAMP with time zone NOT NULL, - ferdigstilt_av VARCHAR null, - dato_ferdigstilt TIMESTAMP, - primary key (sykmelding_id, timestamp) + ferdigstilt_av VARCHAR NULL, + dato_ferdigstilt TIMESTAMP with time zone NULL ); ALTER TABLE nasjonal_manuelloppgave - ADD CONSTRAINT unique_sykmelding_id UNIQUE (sykmelding_id); \ No newline at end of file + ADD CONSTRAINT unique_sykmelding_id UNIQUE (sykmelding_id); + +ALTER TABLE nasjonal_sykmelding + ADD CONSTRAINT unique_sykmelding_id_timestamp UNIQUE (sykmelding_id, timestamp); + +CREATE INDEX idx_sykmelding_id ON sykmelding(sykmelding_id); diff --git a/src/main/resources/db/migration/V15__add_id_nasjonal_sykmelding.sql b/src/main/resources/db/migration/V15__add_id_nasjonal_sykmelding.sql deleted file mode 100644 index 2b4e05b3..00000000 --- a/src/main/resources/db/migration/V15__add_id_nasjonal_sykmelding.sql +++ /dev/null @@ -1,14 +0,0 @@ -drop table if exists nasjonal_sykmelding; - -create table nasjonal_sykmelding -( - id UUID DEFAULT gen_random_uuid() PRIMARY KEY, - sykmelding_id VARCHAR NOT NULL, - sykmelding JSONB NOT NULL, - timestamp TIMESTAMP with time zone NOT NULL, - ferdigstilt_av VARCHAR NULL, - dato_ferdigstilt TIMESTAMP NULL -); - -ALTER TABLE nasjonal_sykmelding - ADD CONSTRAINT unique_sykmelding_id_timestamp UNIQUE (sykmelding_id, timestamp); \ No newline at end of file diff --git a/src/main/resources/db/migration/V16__create_sykmelding_index.sql b/src/main/resources/db/migration/V16__create_sykmelding_index.sql deleted file mode 100644 index fad4ff19..00000000 --- a/src/main/resources/db/migration/V16__create_sykmelding_index.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX idx_sykmelding_id ON sykmelding(sykmelding_id); diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveRepositoryTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveRepositoryTest.kt index ebad1bb5..f423e4d1 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveRepositoryTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveRepositoryTest.kt @@ -19,15 +19,15 @@ class NasjonalOppgaveRepositoryTest : IntegrationTest() { fun `given New NasjonalOppgave opprett og hent`() = runBlocking { val savedOppgave = nasjonalOppgaveRepository.save(testData(null, "123")) val retrievedOppgave = nasjonalOppgaveRepository.findBySykmeldingId(savedOppgave.sykmeldingId) - Assertions.assertTrue(retrievedOppgave.isPresent) - assertEquals(savedOppgave.sykmeldingId, retrievedOppgave.get().sykmeldingId) + Assertions.assertNotNull(retrievedOppgave) + assertEquals(savedOppgave.sykmeldingId, retrievedOppgave?.sykmeldingId) } @Test fun `insert two instances with same sykmeldingId`() = runBlocking { nasjonalOppgaveRepository.save(testData(null, "1")) val eksisterendeOppgave = nasjonalOppgaveRepository.findBySykmeldingId("1") - nasjonalOppgaveRepository.save(testData(eksisterendeOppgave.get().id, "1")) + nasjonalOppgaveRepository.save(testData(eksisterendeOppgave?.id, "1")) val retrievedOppgave = nasjonalOppgaveRepository.findAll() assertEquals(1, retrievedOppgave.count()) }