From 6e2a4911e5183af41dd40e88137a399749f42d8c Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Thu, 13 Jun 2024 15:33:17 +0200 Subject: [PATCH 1/2] kn sende pdf istedenfor fritkest ved utsending av brev fra sak --- .../main/kotlin/dokument/domain/Dokument.kt | 6 +- .../domain/DokumentMedMetadataUtenFil.kt | 6 +- .../database/DistribueringsAdresseJson.kt | 4 +- ...Journalf\303\270rOgSendDokumentCommand.kt" | 81 ++++++++++++++++ .../su/se/bakover/domain/sak/SakService.kt | 3 +- ...nalf\303\270rOgSendDokumentCommandTest.kt" | 97 +++++++++++++++++++ .../se/bakover/service/sak/SakServiceImpl.kt | 9 +- .../bakover/service/sak/SakServiceImplTest.kt | 40 +++++++- .../su/se/bakover/web/routes/sak/SakRoutes.kt | 85 +++++++++++++--- .../bakover/web/services/AccessCheckProxy.kt | 8 +- 10 files changed, 312 insertions(+), 27 deletions(-) create mode 100644 "domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommand.kt" create mode 100644 "domain/src/test/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommandTest.kt" diff --git a/dokument/domain/src/main/kotlin/dokument/domain/Dokument.kt b/dokument/domain/src/main/kotlin/dokument/domain/Dokument.kt index cce4ce26e8..887cb77e99 100644 --- a/dokument/domain/src/main/kotlin/dokument/domain/Dokument.kt +++ b/dokument/domain/src/main/kotlin/dokument/domain/Dokument.kt @@ -104,7 +104,7 @@ sealed interface Dokument { override val distribusjonstype = Distribusjonstype.VEDTAK constructor( - utenMetadata: UtenMetadata, + utenMetadata: UtenMetadata.Vedtak, metadata: Metadata, distribueringsadresse: Distribueringsadresse?, ) : this( @@ -134,7 +134,7 @@ sealed interface Dokument { override val distribusjonstype = Distribusjonstype.VIKTIG constructor( - utenMetadata: UtenMetadata, + utenMetadata: UtenMetadata.Informasjon.Viktig, metadata: Metadata, distribueringsadresse: Distribueringsadresse?, ) : this( @@ -160,7 +160,7 @@ sealed interface Dokument { override val distribusjonstype = Distribusjonstype.ANNET constructor( - utenMetadata: UtenMetadata, + utenMetadata: UtenMetadata.Informasjon.Annet, metadata: Metadata, distribueringsadresse: Distribueringsadresse?, ) : this( diff --git a/dokument/domain/src/main/kotlin/dokument/domain/DokumentMedMetadataUtenFil.kt b/dokument/domain/src/main/kotlin/dokument/domain/DokumentMedMetadataUtenFil.kt index d54d1ba300..c9f47e0924 100644 --- a/dokument/domain/src/main/kotlin/dokument/domain/DokumentMedMetadataUtenFil.kt +++ b/dokument/domain/src/main/kotlin/dokument/domain/DokumentMedMetadataUtenFil.kt @@ -32,7 +32,7 @@ data class DokumentMedMetadataUtenFil( ): Dokument.MedMetadata { return when (distribusjonstype) { Distribusjonstype.VEDTAK -> Dokument.MedMetadata.Vedtak( - utenMetadata = toDokumentUtenMetadata(pdf), + utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Vedtak, metadata = metadata.copy( journalpostId = journalpostId?.toString(), brevbestillingId = brevbestillingId?.toString(), @@ -41,7 +41,7 @@ data class DokumentMedMetadataUtenFil( ) Distribusjonstype.VIKTIG -> Dokument.MedMetadata.Informasjon.Viktig( - utenMetadata = toDokumentUtenMetadata(pdf), + utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Informasjon.Viktig, metadata = metadata.copy( journalpostId = journalpostId?.toString(), brevbestillingId = brevbestillingId?.toString(), @@ -50,7 +50,7 @@ data class DokumentMedMetadataUtenFil( ) Distribusjonstype.ANNET -> Dokument.MedMetadata.Informasjon.Annet( - utenMetadata = toDokumentUtenMetadata(pdf), + utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Informasjon.Annet, metadata = metadata.copy( journalpostId = journalpostId?.toString(), brevbestillingId = brevbestillingId?.toString(), diff --git a/dokument/infrastructure/src/main/kotlin/no/nav/su/se/bakover/dokument/infrastructure/database/DistribueringsAdresseJson.kt b/dokument/infrastructure/src/main/kotlin/no/nav/su/se/bakover/dokument/infrastructure/database/DistribueringsAdresseJson.kt index 76fdd82e66..fc31df185f 100644 --- a/dokument/infrastructure/src/main/kotlin/no/nav/su/se/bakover/dokument/infrastructure/database/DistribueringsAdresseJson.kt +++ b/dokument/infrastructure/src/main/kotlin/no/nav/su/se/bakover/dokument/infrastructure/database/DistribueringsAdresseJson.kt @@ -4,7 +4,7 @@ import dokument.domain.distribuering.Distribueringsadresse import no.nav.su.se.bakover.common.deserialize import no.nav.su.se.bakover.common.serialize -fun Distribueringsadresse.toDbJson(): String = serialize( +internal fun Distribueringsadresse.toDbJson(): String = serialize( DistribueringsAdresseJson( adresselinje1 = adresselinje1, adresselinje2 = adresselinje2, @@ -14,7 +14,7 @@ fun Distribueringsadresse.toDbJson(): String = serialize( ), ) -fun deserializeDistribueringsadresse(json: String): Distribueringsadresse = +internal fun deserializeDistribueringsadresse(json: String): Distribueringsadresse = deserialize(json).let { Distribueringsadresse( adresselinje1 = it.adresselinje1, diff --git "a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommand.kt" "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommand.kt" new file mode 100644 index 0000000000..5ec6530c61 --- /dev/null +++ "b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommand.kt" @@ -0,0 +1,81 @@ +package no.nav.su.se.bakover.domain.sak + +import dokument.domain.Distribusjonstype +import dokument.domain.Dokument +import dokument.domain.distribuering.Distribueringsadresse +import no.nav.su.se.bakover.common.domain.PdfA +import no.nav.su.se.bakover.common.ident.NavIdentBruker +import no.nav.su.se.bakover.common.serialize +import no.nav.su.se.bakover.common.tid.Tidspunkt +import java.time.Clock +import java.util.UUID + +data class JournalførOgSendDokumentCommand( + val sakId: UUID, + val saksbehandler: NavIdentBruker.Saksbehandler, + val journaltittel: String, + val pdf: PdfA, + val distribueringsadresse: Distribueringsadresse?, + val distribusjonstype: Distribusjonstype, +) { + fun opprettDokumentMedMetadata(clock: Clock): Dokument.MedMetadata { + val generertDokumentJson = createJson() + + return when (this.distribusjonstype) { + Distribusjonstype.VEDTAK -> Dokument.MedMetadata.Vedtak( + utenMetadata = Dokument.UtenMetadata.Vedtak( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(clock), + tittel = journaltittel, + generertDokument = pdf, + generertDokumentJson = generertDokumentJson, + ), + metadata = Dokument.Metadata(sakId = this.sakId), + distribueringsadresse = this.distribueringsadresse, + ) + + Distribusjonstype.VIKTIG -> Dokument.MedMetadata.Informasjon.Viktig( + utenMetadata = Dokument.UtenMetadata.Informasjon.Viktig( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(clock), + tittel = journaltittel, + generertDokument = pdf, + generertDokumentJson = generertDokumentJson, + ), + metadata = Dokument.Metadata(sakId = this.sakId), + distribueringsadresse = this.distribueringsadresse, + ) + + Distribusjonstype.ANNET -> Dokument.MedMetadata.Informasjon.Annet( + utenMetadata = Dokument.UtenMetadata.Informasjon.Annet( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(clock), + tittel = journaltittel, + generertDokument = pdf, + generertDokumentJson = generertDokumentJson, + ), + metadata = Dokument.Metadata(sakId = this.sakId), + distribueringsadresse = this.distribueringsadresse, + ) + } + } + + private fun createJson(): String = JournalførOgSendDokumentJson( + saksbehandler = saksbehandler, + journaltittel = journaltittel, + distribueringsadresse = distribueringsadresse, + distribusjonstype = distribusjonstype, + ).let { serialize(it) } +} + +private data class JournalførOgSendDokumentJson( + val saksbehandler: NavIdentBruker.Saksbehandler, + val journaltittel: String, + val distribueringsadresse: Distribueringsadresse?, + val distribusjonstype: Distribusjonstype, +) { + /** + * kommentar som skal bli inkludert i json for generertDokumentJson + */ + val kommentar: String = "Pdf er lastet opp manuelt. Innholdet i brevet er ukjent" +} diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt index bb1af13b83..95a83d2cef 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt @@ -65,7 +65,8 @@ interface SakService { fun hentSakForSøknad(søknadId: UUID): Either fun opprettFritekstDokument(request: OpprettDokumentRequest): Either - fun lagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either + fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either + fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata fun hentAlleJournalposter(sakId: UUID): Either> fun oppdaterFødselsnummer(command: OppdaterFødselsnummerPåSakCommand): Either diff --git "a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommandTest.kt" "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommandTest.kt" new file mode 100644 index 0000000000..937501bb48 --- /dev/null +++ "b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/sak/Journalf\303\270rOgSendDokumentCommandTest.kt" @@ -0,0 +1,97 @@ +package no.nav.su.se.bakover.domain.sak + +import dokument.domain.Distribusjonstype +import dokument.domain.Dokument +import dokument.domain.distribuering.Distribueringsadresse +import io.kotest.matchers.equality.shouldBeEqualToIgnoringFields +import no.nav.su.se.bakover.common.domain.PdfA +import no.nav.su.se.bakover.common.ident.NavIdentBruker +import no.nav.su.se.bakover.test.fixedClock +import no.nav.su.se.bakover.test.fixedTidspunkt +import org.junit.jupiter.api.Test +import java.util.UUID + +class JournalførOgSendDokumentCommandTest { + + @Test + fun `oppretter dokument med metadata`() { + val vedtaksCommand = nyCommand( + distribueringsadresse = Distribueringsadresse( + adresselinje1 = "Gondor", + adresselinje2 = "calls", + adresselinje3 = "for", + postnummer = "aid", + poststed = "And Rohan will answer", + ), + ) + val viktigCommand = nyCommand(distribusjonstype = Distribusjonstype.VIKTIG) + val annetCommand = nyCommand(distribusjonstype = Distribusjonstype.ANNET) + + vedtaksCommand.opprettDokumentMedMetadata(fixedClock).let { + it.shouldBeEqualToIgnoringFields( + Dokument.MedMetadata.Vedtak( + utenMetadata = Dokument.UtenMetadata.Vedtak( + id = it.id, + opprettet = fixedTidspunkt, + tittel = vedtaksCommand.journaltittel, + generertDokument = vedtaksCommand.pdf, + //language=json + generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":{"adresselinje1":"Gondor","adresselinje2":"calls","adresselinje3":"for","postnummer":"aid","poststed":"And Rohan will answer"},"distribusjonstype":"VEDTAK","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""", + ), + metadata = Dokument.Metadata(sakId = vedtaksCommand.sakId), + distribueringsadresse = vedtaksCommand.distribueringsadresse, + ), + Dokument::id, + Dokument::generertDokument, + ) + } + + viktigCommand.opprettDokumentMedMetadata(fixedClock).shouldBeEqualToIgnoringFields( + Dokument.MedMetadata.Informasjon.Viktig( + utenMetadata = Dokument.UtenMetadata.Informasjon.Viktig( + id = UUID.randomUUID(), + opprettet = fixedTidspunkt, + tittel = viktigCommand.journaltittel, + generertDokument = viktigCommand.pdf, + //language=json + generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":null,"distribusjonstype":"VIKTIG","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""", + ), + metadata = Dokument.Metadata(sakId = viktigCommand.sakId), + distribueringsadresse = viktigCommand.distribueringsadresse, + ), + Dokument::id, + ) + + annetCommand.opprettDokumentMedMetadata(fixedClock).shouldBeEqualToIgnoringFields( + Dokument.MedMetadata.Informasjon.Annet( + utenMetadata = Dokument.UtenMetadata.Informasjon.Annet( + id = UUID.randomUUID(), + opprettet = fixedTidspunkt, + tittel = annetCommand.journaltittel, + generertDokument = annetCommand.pdf, + //language=json + generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":null,"distribusjonstype":"ANNET","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""", + ), + metadata = Dokument.Metadata(sakId = annetCommand.sakId), + distribueringsadresse = annetCommand.distribueringsadresse, + ), + Dokument::id, + ) + } + + private fun nyCommand( + sakId: UUID = UUID.randomUUID(), + saksbehandler: NavIdentBruker.Saksbehandler = no.nav.su.se.bakover.test.saksbehandler, + journaltittel: String = "tittel på journalposten", + pdf: PdfA = PdfA("pdf".toByteArray()), + distribueringsadresse: Distribueringsadresse? = null, + distribusjonstype: Distribusjonstype = Distribusjonstype.VEDTAK, + ) = JournalførOgSendDokumentCommand( + sakId = sakId, + saksbehandler = saksbehandler, + journaltittel = journaltittel, + pdf = pdf, + distribueringsadresse = distribueringsadresse, + distribusjonstype = distribusjonstype, + ) +} diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt index cd9ab83c30..079354f7c8 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt @@ -27,6 +27,7 @@ import no.nav.su.se.bakover.domain.Sak import no.nav.su.se.bakover.domain.brev.command.FritekstDokumentCommand import no.nav.su.se.bakover.domain.revurdering.RevurderingId import no.nav.su.se.bakover.domain.sak.FantIkkeSak +import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeGrunnlagsdataForVedtak import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeVedtaksdata import no.nav.su.se.bakover.domain.sak.KunneIkkeOppretteDokument @@ -165,7 +166,7 @@ class SakServiceImpl( } } - override fun lagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either { + override fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either { return opprettFritekstDokument(request).map { it.leggTilMetadata(Dokument.Metadata(sakId = request.sakId), request.distribueringsadresse) }.onRight { @@ -173,6 +174,12 @@ class SakServiceImpl( } } + override fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata { + return request.opprettDokumentMedMetadata(clock).also { + dokumentRepo.lagre(it) + } + } + override fun hentAlleJournalposter(sakId: UUID): Either> { return sakRepo.hentSakInfo(sakId)?.let { journalpostClient.hentJournalposterFor(it.saksnummer) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt index 374df26767..7860baaa74 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.service.sak import arrow.core.right import dokument.domain.Distribusjonstype +import dokument.domain.Dokument import dokument.domain.DokumentRepo import dokument.domain.GenererDokumentCommand import dokument.domain.brev.BrevService @@ -10,6 +11,7 @@ import dokument.domain.journalføring.Journalpost import dokument.domain.journalføring.QueryJournalpostClient import io.kotest.assertions.arrow.core.shouldBeRight import io.kotest.matchers.shouldBe +import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.domain.Saksnummer import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag import no.nav.su.se.bakover.common.domain.sak.SakInfo @@ -18,6 +20,7 @@ import no.nav.su.se.bakover.common.journal.JournalpostId import no.nav.su.se.bakover.common.tid.periode.år import no.nav.su.se.bakover.domain.Sak import no.nav.su.se.bakover.domain.brev.command.FritekstDokumentCommand +import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand import no.nav.su.se.bakover.domain.sak.OpprettDokumentRequest import no.nav.su.se.bakover.domain.sak.SakRepo import no.nav.su.se.bakover.domain.statistikk.StatistikkEvent @@ -25,6 +28,7 @@ import no.nav.su.se.bakover.domain.statistikk.StatistikkEventObserver import no.nav.su.se.bakover.test.argThat import no.nav.su.se.bakover.test.dokumentUtenMetadataInformasjonAnnet import no.nav.su.se.bakover.test.fixedClock +import no.nav.su.se.bakover.test.fixedTidspunkt import no.nav.su.se.bakover.test.getOrFail import no.nav.su.se.bakover.test.nySøknadsbehandlingMedStønadsperiode import no.nav.su.se.bakover.test.opprettetRevurdering @@ -327,7 +331,7 @@ internal class SakServiceImplTest { } val actual = SakServiceImpl(sakRepo, fixedClock, dokumentRepo, brevService, mock(), mock()) - .lagreOgSendFritekstDokument( + .genererLagreOgSendFritekstDokument( request = OpprettDokumentRequest( sakId = sak.id, saksbehandler = saksbehandler, @@ -365,6 +369,40 @@ internal class SakServiceImplTest { verifyNoMoreInteractions(dokumentRepo) } + @Test + fun `lagrer og sender et fritekst dokument der saksbehandler har lastet opp pdf`() { + val expecedSakId = UUID.randomUUID() + val dokumentRepo = mock { + doNothing().whenever(it).lagre(any(), anyOrNull()) + } + + val actual = + SakServiceImpl(mock(), fixedClock, dokumentRepo, mock(), mock(), mock()).lagreOgSendFritekstDokument( + request = JournalførOgSendDokumentCommand( + sakId = expecedSakId, + saksbehandler = saksbehandler, + journaltittel = "Vedtaksbrev om nytt vedtak", + pdf = PdfA(content = "".toByteArray()), + distribueringsadresse = null, + distribusjonstype = Distribusjonstype.VEDTAK, + ), + ) + + actual shouldBe Dokument.MedMetadata.Vedtak( + utenMetadata = Dokument.UtenMetadata.Vedtak( + // id'en blir generert på innsiden av opprettelsen av dokumentet + id = actual.id, + opprettet = fixedTidspunkt, + tittel = "Vedtaksbrev om nytt vedtak", + generertDokument = PdfA(content = "".toByteArray()), + //language=json + generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"Vedtaksbrev om nytt vedtak","distribueringsadresse":null,"distribusjonstype":"VEDTAK","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""", + ), + metadata = Dokument.Metadata(sakId = expecedSakId), + distribueringsadresse = null, + ) + } + @Test fun `henter alle journalposter`() { val sak = nySakMedjournalførtSøknadOgOppgave().first diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt index c7b5a63981..bd01fad8d8 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt @@ -9,13 +9,19 @@ import io.ktor.http.HttpStatusCode.Companion.BadRequest import io.ktor.http.HttpStatusCode.Companion.Created import io.ktor.http.HttpStatusCode.Companion.NotFound import io.ktor.http.HttpStatusCode.Companion.OK +import io.ktor.http.content.PartData +import io.ktor.http.content.readAllParts +import io.ktor.http.content.streamProvider import io.ktor.server.application.call +import io.ktor.server.request.receiveMultipart import io.ktor.server.response.respondBytes import io.ktor.server.routing.Route import io.ktor.server.routing.get import io.ktor.server.routing.post import no.nav.su.se.bakover.common.audit.AuditLogEvent import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle +import no.nav.su.se.bakover.common.deserialize +import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.domain.Saksnummer import no.nav.su.se.bakover.common.domain.sak.Sakstype import no.nav.su.se.bakover.common.infrastructure.PeriodeJson.Companion.toJson @@ -32,6 +38,7 @@ import no.nav.su.se.bakover.common.infrastructure.web.withSakId import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.common.serialize import no.nav.su.se.bakover.common.tid.periode.Periode +import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeVedtaksdata import no.nav.su.se.bakover.domain.sak.KunneIkkeOppretteDokument import no.nav.su.se.bakover.domain.sak.OpprettDokumentRequest @@ -275,22 +282,68 @@ internal fun Route.sakRoutes( post("$SAK_PATH/{sakId}/fritekstDokument/lagreOgSend") { authorize(Brukerrolle.Saksbehandler) { call.withSakId { sakId -> - call.withBody { body -> - val res = sakService.lagreOgSendFritekstDokument( - OpprettDokumentRequest( - sakId = sakId, - saksbehandler = call.suUserContext.saksbehandler, - tittel = body.tittel, - fritekst = body.fritekst, - distribueringsadresse = body.adresse?.toDomain(), - distribusjonstype = body.distribusjonstype.toDomain(), - ), - ) + when (call.request.headers["content-type"]?.contains("multipart/form-data")) { + /** + * Dersom requesten er multipart, har dem lagt på en allerede generert PDF, og vi skal bare + * journalføre, og distribuere denne. + */ + true -> { + val parts = call.receiveMultipart().readAllParts() - res.fold( - { call.svar(it.tilResultat()) }, - { call.svar(Resultat.json(Created, it.toJson())) }, - ) + /** + * Vi forventer en viss rekkefølge fra frontend på innholdet i formdata + * 1. journaltittel + * 2. distribusjonstype + * 3. pdf + * 4. distribueringsadresse - Denne er den eneste som er optional, og kommer sist i rekkefølgen + */ + val journaltittel: String = (parts[0] as PartData.FormItem).value + val distribusjonstype: dokument.domain.Distribusjonstype = + Distribusjonstype.valueOf((parts[1] as PartData.FormItem).value).toDomain() + val pdfContent: ByteArray = (parts[2] as PartData.FileItem).streamProvider().readBytes() + val distribueringsadresse: Distribueringsadresse? = parts.getOrNull(3)?.let { + val distribueringsadresseAsJson = (it as PartData.FormItem).value + deserialize(distribueringsadresseAsJson).toDomain() + } + + sakService.lagreOgSendFritekstDokument( + request = JournalførOgSendDokumentCommand( + sakId = sakId, + saksbehandler = call.suUserContext.saksbehandler, + journaltittel = journaltittel, + pdf = PdfA(content = pdfContent), + distribueringsadresse = distribueringsadresse, + distribusjonstype = distribusjonstype, + ), + ) + + call.svar(Resultat.accepted()) + } + /** + * så lenge requesten ikke er spesifikk multipart/form-data så vil den bli behandlet som en vanlig text/plain / app/json + * vi forventer at frontend sender en body med fritekst, og vi skal generere dokumentet + */ + null, + false, + -> { + call.withBody { body -> + val res = sakService.genererLagreOgSendFritekstDokument( + OpprettDokumentRequest( + sakId = sakId, + saksbehandler = call.suUserContext.saksbehandler, + tittel = body.tittel, + fritekst = body.fritekst, + distribueringsadresse = body.adresse?.toDomain(), + distribusjonstype = body.distribusjonstype.toDomain(), + ), + ) + + res.fold( + { call.svar(it.tilResultat()) }, + { call.svar(Resultat.json(Created, it.toJson())) }, + ) + } + } } } } @@ -298,6 +351,8 @@ internal fun Route.sakRoutes( /** * Forhåndsvisning av fritekstdokument + * + * Forhåndsvisning baserer seg på at vi skal alltid genere dokument. Tar derfor ikke stilling til formdata */ post("$SAK_PATH/{sakId}/fritekstDokument") { authorize(Brukerrolle.Saksbehandler) { diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt index 7bf289ffa2..34e76e20a4 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt @@ -120,6 +120,7 @@ import no.nav.su.se.bakover.domain.revurdering.vilkår.uføre.KunneIkkeLeggeTilU import no.nav.su.se.bakover.domain.revurdering.vilkår.utenlandsopphold.KunneIkkeLeggeTilUtenlandsopphold import no.nav.su.se.bakover.domain.sak.FantIkkeSak import no.nav.su.se.bakover.domain.sak.FeilVedHentingAvGjeldendeVedtaksdataForPeriode +import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeGrunnlagsdataForVedtak import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeVedtaksdata import no.nav.su.se.bakover.domain.sak.KunneIkkeOppretteDokument @@ -396,7 +397,12 @@ open class AccessCheckProxy( return services.sak.opprettFritekstDokument(request) } - override fun lagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either { + override fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either { + assertHarTilgangTilSak(request.sakId) + return services.sak.genererLagreOgSendFritekstDokument(request) + } + + override fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata { assertHarTilgangTilSak(request.sakId) return services.sak.lagreOgSendFritekstDokument(request) } From 62a071893cabfc21d6716fda544b7e3078b68777 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Thu, 13 Jun 2024 17:38:55 +0200 Subject: [PATCH 2/2] forklar sending av brev for lagreOgSendFritekstDokument() --- .../main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt index 95a83d2cef..7d989a4ac8 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt @@ -66,6 +66,10 @@ interface SakService { fun hentSakForSøknad(søknadId: UUID): Either fun opprettFritekstDokument(request: OpprettDokumentRequest): Either fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either + + /** + * Sending av dokumentet gjøres i en automatisk jobb når dokumentet lagres i databasen. + */ fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata fun hentAlleJournalposter(sakId: UUID): Either> fun oppdaterFødselsnummer(command: OppdaterFødselsnummerPåSakCommand): Either