Skip to content

Commit

Permalink
prøver å forenkle/kommentere på deler av opplastning av pdf som skal …
Browse files Browse the repository at this point in the history
…sendes for sak
  • Loading branch information
RamziAbuQassim committed Jun 14, 2024
1 parent befeb79 commit 151cdc1
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,6 @@ suspend inline fun <reified T> ApplicationCall.withBody(
}.onRight(ifRight)
}
}

fun ApplicationCall.isMultipartFormDataRequest(): Boolean =
this.request.headers["content-type"]?.contains("multipart/form-data") ?: false
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import no.nav.su.se.bakover.common.tid.Tidspunkt
import java.time.Clock
import java.util.UUID

data class JournalførOgSendDokumentCommand(
data class JournalførOgSendOpplastetPdfSomBrevCommand(
val sakId: UUID,
val saksbehandler: NavIdentBruker.Saksbehandler,
val journaltittel: String,
Expand All @@ -19,6 +19,7 @@ data class JournalførOgSendDokumentCommand(
val distribusjonstype: Distribusjonstype,
) {
fun opprettDokumentMedMetadata(clock: Clock): Dokument.MedMetadata {
// TODO - enkel løsning, men det er ikke ønskelig at domenet skal forholde seg til json
val generertDokumentJson = createJson()

return when (this.distribusjonstype) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,13 @@ interface SakService {
fun hentSakForVedtak(vedtakId: UUID): Sak?

fun hentSakForSøknad(søknadId: UUID): Either<FantIkkeSak, Sak>
fun opprettFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata>
fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata>
fun genererFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata>
fun genererLagreOgSendFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata>

/**
* Sending av dokumentet gjøres i en automatisk jobb når dokumentet lagres i databasen.
*/
fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata
fun lagreOgSendOpplastetPdfPåSak(request: JournalførOgSendOpplastetPdfSomBrevCommand): Dokument.MedMetadata
fun hentAlleJournalposter(sakId: UUID): Either<KunneIkkeHenteJournalposter, List<Journalpost>>
fun oppdaterFødselsnummer(command: OppdaterFødselsnummerPåSakCommand): Either<KunneIkkeOppdatereFødselsnummer, Sak>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import no.nav.su.se.bakover.test.fixedTidspunkt
import org.junit.jupiter.api.Test
import java.util.UUID

class JournalførOgSendDokumentCommandTest {
class JournalførOgSendOpplastetPdfSomBrevCommandTest {

@Test
fun `oppretter dokument med metadata`() {
Expand Down Expand Up @@ -86,7 +86,7 @@ class JournalførOgSendDokumentCommandTest {
pdf: PdfA = PdfA("pdf".toByteArray()),
distribueringsadresse: Distribueringsadresse? = null,
distribusjonstype: Distribusjonstype = Distribusjonstype.VEDTAK,
) = JournalførOgSendDokumentCommand(
) = JournalførOgSendOpplastetPdfSomBrevCommand(
sakId = sakId,
saksbehandler = saksbehandler,
journaltittel = journaltittel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +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.JournalførOgSendOpplastetPdfSomBrevCommand
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
Expand Down Expand Up @@ -148,7 +148,7 @@ class SakServiceImpl(
return sakRepo.hentSakForSøknad(søknadId)?.right() ?: FantIkkeSak.left()
}

override fun opprettFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata> {
override fun genererFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata> {
val sak = sakRepo.hentSak(request.sakId)
?: throw IllegalStateException("Fant ikke sak ved opprettFritekstDokument. sakid ${request.sakId}")

Expand All @@ -166,15 +166,18 @@ class SakServiceImpl(
}
}

override fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
return opprettFritekstDokument(request).map {
override fun genererLagreOgSendFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
return genererFritekstbrevPåSak(request).map {
it.leggTilMetadata(Dokument.Metadata(sakId = request.sakId), request.distribueringsadresse)
}.onRight {
dokumentRepo.lagre(it)
}
}

override fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata {
override fun lagreOgSendOpplastetPdfPåSak(request: JournalførOgSendOpplastetPdfSomBrevCommand): Dokument.MedMetadata {
/**
* vi tar for god fisk at sakId finnes. Det vil smelle i databasen hvis sakId(foreign key) ikke finnes
*/
return request.opprettDokumentMedMetadata(clock).also {
dokumentRepo.lagre(it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +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.JournalførOgSendOpplastetPdfSomBrevCommand
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
Expand Down Expand Up @@ -299,7 +299,7 @@ internal class SakServiceImplTest {
}

SakServiceImpl(sakRepo, fixedClock, mock(), brevService, mock(), mock())
.opprettFritekstDokument(
.genererFritekstbrevPåSak(
request = OpprettDokumentRequest(
sakId = sak.id,
saksbehandler = saksbehandler,
Expand Down Expand Up @@ -331,7 +331,7 @@ internal class SakServiceImplTest {
}

val actual = SakServiceImpl(sakRepo, fixedClock, dokumentRepo, brevService, mock(), mock())
.genererLagreOgSendFritekstDokument(
.genererLagreOgSendFritekstbrevPåSak(
request = OpprettDokumentRequest(
sakId = sak.id,
saksbehandler = saksbehandler,
Expand Down Expand Up @@ -377,8 +377,8 @@ internal class SakServiceImplTest {
}

val actual =
SakServiceImpl(mock(), fixedClock, dokumentRepo, mock(), mock(), mock()).lagreOgSendFritekstDokument(
request = JournalførOgSendDokumentCommand(
SakServiceImpl(mock(), fixedClock, dokumentRepo, mock(), mock(), mock()).lagreOgSendOpplastetPdfPåSak(
request = JournalførOgSendOpplastetPdfSomBrevCommand(
sakId = expecedSakId,
saksbehandler = saksbehandler,
journaltittel = "Vedtaksbrev om nytt vedtak",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,18 @@ package no.nav.su.se.bakover.web.routes.sak
import arrow.core.Either
import arrow.core.flatMap
import arrow.core.merge
import dokument.domain.distribuering.Distribueringsadresse
import io.ktor.http.ContentType
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
Expand All @@ -30,6 +23,7 @@ import no.nav.su.se.bakover.common.infrastructure.web.Resultat
import no.nav.su.se.bakover.common.infrastructure.web.audit
import no.nav.su.se.bakover.common.infrastructure.web.authorize
import no.nav.su.se.bakover.common.infrastructure.web.errorJson
import no.nav.su.se.bakover.common.infrastructure.web.isMultipartFormDataRequest
import no.nav.su.se.bakover.common.infrastructure.web.parameter
import no.nav.su.se.bakover.common.infrastructure.web.suUserContext
import no.nav.su.se.bakover.common.infrastructure.web.svar
Expand All @@ -38,7 +32,6 @@ 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
Expand Down Expand Up @@ -256,78 +249,26 @@ internal fun Route.sakRoutes(
}
}

data class DistribueringsadresseBody(
val adresselinje1: String,
val adresselinje2: String?,
val adresselinje3: String?,
val postnummer: String,
val poststed: String,
) {
fun toDomain(): Distribueringsadresse = Distribueringsadresse(
adresselinje1 = adresselinje1,
adresselinje2 = adresselinje2,
adresselinje3 = adresselinje3,
postnummer = postnummer,
poststed = poststed,
)
}

data class DokumentBody(
val tittel: String,
val fritekst: String,
val adresse: DistribueringsadresseBody?,
val distribusjonstype: Distribusjonstype,
)

post("$SAK_PATH/{sakId}/fritekstDokument/lagreOgSend") {
authorize(Brukerrolle.Saksbehandler) {
call.withSakId { sakId ->
when (call.request.headers["content-type"]?.contains("multipart/form-data")) {
when (call.isMultipartFormDataRequest()) {
/**
* 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()

/**
* 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<DistribueringsadresseBody>(distribueringsadresseAsJson).toDomain()
}

sakService.lagreOgSendFritekstDokument(
request = JournalførOgSendDokumentCommand(
sakId = sakId,
saksbehandler = call.suUserContext.saksbehandler,
journaltittel = journaltittel,
pdf = PdfA(content = pdfContent),
distribueringsadresse = distribueringsadresse,
distribusjonstype = distribusjonstype,
),
)

true -> call.lagCommandForLagreOgSendOpplastetPdfPåSak(sakId).let {
sakService.lagreOgSendOpplastetPdfPåSak(request = it)
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,
-> {
false -> {
call.withBody<DokumentBody> { body ->
val res = sakService.genererLagreOgSendFritekstDokument(
val res = sakService.genererLagreOgSendFritekstbrevPåSak(
OpprettDokumentRequest(
sakId = sakId,
saksbehandler = call.suUserContext.saksbehandler,
Expand Down Expand Up @@ -358,7 +299,7 @@ internal fun Route.sakRoutes(
authorize(Brukerrolle.Saksbehandler) {
call.withSakId { sakId ->
call.withBody<DokumentBody> { body ->
val res = sakService.opprettFritekstDokument(
val res = sakService.genererFritekstbrevPåSak(
OpprettDokumentRequest(
sakId = sakId,
saksbehandler = call.suUserContext.saksbehandler,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package no.nav.su.se.bakover.web.routes.sak

import dokument.domain.distribuering.Distribueringsadresse
import io.ktor.http.content.PartData
import io.ktor.http.content.readAllParts
import io.ktor.http.content.streamProvider
import io.ktor.server.application.ApplicationCall
import io.ktor.server.request.receiveMultipart
import no.nav.su.se.bakover.common.deserialize
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.common.infrastructure.web.suUserContext
import no.nav.su.se.bakover.domain.sak.JournalførOgSendOpplastetPdfSomBrevCommand
import java.util.UUID

data class DistribueringsadresseBody(
val adresselinje1: String,
val adresselinje2: String?,
val adresselinje3: String?,
val postnummer: String,
val poststed: String,
) {
fun toDomain(): Distribueringsadresse = Distribueringsadresse(
adresselinje1 = adresselinje1,
adresselinje2 = adresselinje2,
adresselinje3 = adresselinje3,
postnummer = postnummer,
poststed = poststed,
)
}

data class DokumentBody(
val tittel: String,
val fritekst: String,
val adresse: DistribueringsadresseBody?,
val distribusjonstype: Distribusjonstype,
)

suspend fun ApplicationCall.lagCommandForLagreOgSendOpplastetPdfPåSak(
sakId: UUID,
): JournalførOgSendOpplastetPdfSomBrevCommand {
val parts = this.receiveMultipart().readAllParts()

/**
* 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<DistribueringsadresseBody>(distribueringsadresseAsJson).toDomain()
}

return JournalførOgSendOpplastetPdfSomBrevCommand(
sakId = sakId,
saksbehandler = this.suUserContext.saksbehandler,
journaltittel = journaltittel,
pdf = PdfA(content = pdfContent),
distribueringsadresse = distribueringsadresse,
distribusjonstype = distribusjonstype,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +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.JournalførOgSendOpplastetPdfSomBrevCommand
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
Expand Down Expand Up @@ -392,19 +392,19 @@ open class AccessCheckProxy(
return services.sak.hentSakForSøknad(søknadId)
}

override fun opprettFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata> {
override fun genererFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata> {
assertHarTilgangTilSak(request.sakId)
return services.sak.opprettFritekstDokument(request)
return services.sak.genererFritekstbrevPåSak(request)
}

override fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
override fun genererLagreOgSendFritekstbrevPåSak(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
assertHarTilgangTilSak(request.sakId)
return services.sak.genererLagreOgSendFritekstDokument(request)
return services.sak.genererLagreOgSendFritekstbrevPåSak(request)
}

override fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata {
override fun lagreOgSendOpplastetPdfPåSak(request: JournalførOgSendOpplastetPdfSomBrevCommand): Dokument.MedMetadata {
assertHarTilgangTilSak(request.sakId)
return services.sak.lagreOgSendFritekstDokument(request)
return services.sak.lagreOgSendOpplastetPdfPåSak(request)
}

override fun hentAlleJournalposter(sakId: UUID): Either<KunneIkkeHenteJournalposter, List<Journalpost>> {
Expand Down

0 comments on commit 151cdc1

Please sign in to comment.