From c7caae829ce806b799969252472e2356352f6d9e Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Thu, 21 Sep 2023 14:44:19 +0200 Subject: [PATCH 1/8] Set access rights for ROL for DUA. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Øyvind Norsted Wedøe --- .../api/controller/SmartEditorController.kt | 14 +++- .../DokumentUnderArbeid.kt | 12 ++- .../service/DokumentUnderArbeidService.kt | 83 +++++++++++++++---- .../db/migration/V86__add_creator_to_dua.sql | 9 ++ .../DokumentUnderArbeidControllerTest.kt | 4 + .../DokumentUnderArbeidRepositoryTest.kt | 22 +++++ .../oppgave/service/BehandlingServiceTest.kt | 2 + 7 files changed, 126 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/db/migration/V86__add_creator_to_dua.sql diff --git a/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt b/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt index 2c0df2cd9..e9cea6624 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt @@ -117,7 +117,7 @@ class SmartEditorController( readOnly = false ) - dokumentUnderArbeidService.validateDocumentNotFinalized(dokumentId = dokumentId) + dokumentUnderArbeidService.validateDocument(dokumentId = dokumentId) if (input.templateId != null) { dokumentUnderArbeidService.updateSmartEditorTemplateId( @@ -165,7 +165,9 @@ class SmartEditorController( @PathVariable("dokumentId") documentId: UUID, @RequestBody commentInput: CommentInput ): CommentOutput { - //TODO: Skal hvem som helst få kommentere? + + dokumentUnderArbeidService.validateDocument(documentId) + val smartEditorId = dokumentUnderArbeidService.getSmartEditorId( dokumentId = documentId, @@ -185,6 +187,9 @@ class SmartEditorController( @PathVariable("commentId") commentId: UUID, @RequestBody modifyCommentInput: ModifyCommentInput ): CommentOutput { + + dokumentUnderArbeidService.validateDocument(documentId) + val smartEditorId = dokumentUnderArbeidService.getSmartEditorId( dokumentId = documentId, @@ -225,7 +230,8 @@ class SmartEditorController( @PathVariable("commentId") commentId: UUID, @RequestBody commentInput: CommentInput, ): CommentOutput { - //TODO: Skal hvem som helst få kommentere? + dokumentUnderArbeidService.validateDocument(documentId) + val smartEditorId = dokumentUnderArbeidService.getSmartEditorId( dokumentId = documentId, @@ -262,6 +268,8 @@ class SmartEditorController( @PathVariable("dokumentId") documentId: UUID, @PathVariable("commentId") commentId: UUID ) { + dokumentUnderArbeidService.validateDocument(documentId) + val smartEditorId = dokumentUnderArbeidService.getSmartEditorId( dokumentId = documentId, diff --git a/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt b/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt index faab23f5a..21c1923bc 100644 --- a/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt +++ b/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt @@ -67,7 +67,12 @@ open class DokumentUnderArbeid( AttributeOverride(name = "dokumentInfoId", column = Column(name = "journalfoert_dokument_dokument_info_id")), ] ) - val journalfoertDokumentReference: JournalfoertDokumentReference? + val journalfoertDokumentReference: JournalfoertDokumentReference?, + @Column(name = "creator_ident") + open var creatorIdent: String, + @Column(name = "creator_role") + @Enumerated(EnumType.STRING) + open var creatorRole: CreatorRole, ) : Comparable { override fun compareTo(other: DokumentUnderArbeid): Int = @@ -121,6 +126,11 @@ open class DokumentUnderArbeid( JOURNALFOERT } + enum class CreatorRole { + KABAL_SAKSBEHANDLING, + KABAL_ROL; + } + fun getType(): DokumentUnderArbeidType { return when { smartEditorId != null -> DokumentUnderArbeidType.SMART diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index cd3207b96..4d4d233ac 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -28,6 +28,7 @@ import no.nav.klage.oppgave.domain.klage.Endringslogginnslag import no.nav.klage.oppgave.domain.klage.Felt import no.nav.klage.oppgave.domain.klage.Saksdokument import no.nav.klage.oppgave.exceptions.InvalidProperty +import no.nav.klage.oppgave.exceptions.MissingTilgangException import no.nav.klage.oppgave.exceptions.SectionedValidationErrorWithDetailsException import no.nav.klage.oppgave.exceptions.ValidationSection import no.nav.klage.oppgave.service.BehandlingService @@ -49,7 +50,7 @@ class DokumentUnderArbeidService( private val smartEditorApiGateway: DefaultKabalSmartEditorApiGateway, private val kabalJsonToPdfClient: KabalJsonToPdfClient, private val behandlingService: BehandlingService, - private val dokumentEnhetService: KabalDocumentGateway, + private val kabalDocumentGateway: KabalDocumentGateway, private val applicationEventPublisher: ApplicationEventPublisher, private val safClient: SafGraphQlClient, private val innloggetSaksbehandlerService: InnloggetSaksbehandlerService, @@ -90,6 +91,8 @@ class DokumentUnderArbeidService( smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = innloggetIdent, + creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) ) ) behandling.publishEndringsloggEvent( @@ -136,6 +139,8 @@ class DokumentUnderArbeidService( smartEditorId = smartEditorDocumentId, smartEditorTemplateId = smartEditorTemplateId, journalfoertDokumentReference = null, + creatorIdent = innloggetIdent, + creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) ) ) behandling.publishEndringsloggEvent( @@ -203,7 +208,9 @@ class DokumentUnderArbeidService( journalfoertDokumentReference = no.nav.klage.dokument.domain.dokumenterunderarbeid.JournalfoertDokumentReference( journalpostId = journalfoertDokumentReference.journalpostId, dokumentInfoId = journalfoertDokumentReference.dokumentInfoId, - ) + ), + creatorIdent = innloggetIdent, + creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) ) behandling.publishEndringsloggEvent( @@ -223,6 +230,15 @@ class DokumentUnderArbeidService( return resultingDocuments to duplicates } + private fun getCreatorRoleOrThrowException( + behandling: Behandling, + innloggetIdent: String + ) = if (behandling.rolIdent == innloggetIdent) { + DokumentUnderArbeid.CreatorRole.KABAL_ROL + } else if (behandling.tildeling?.saksbehandlerident == innloggetIdent) { + DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING + } else throw MissingTilgangException("Kun ROL eller saksbehandler kan opprette dokumenter") + fun getDokumentUnderArbeid(dokumentId: UUID) = dokumentUnderArbeidRepository.getReferenceById(dokumentId) fun updateDokumentType( @@ -270,6 +286,19 @@ class DokumentUnderArbeidService( val dokument = dokumentUnderArbeidRepository.getReferenceById(dokumentId) val behandlingForCheck = behandlingService.getBehandling(dokument.behandlingId) + + if (behandlingForCheck.tildeling?.saksbehandlerident == innloggetIdent) { + if (dokument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING) { + throw MissingTilgangException("Saksbehandlere har ikke anledning til å endre tittel på dokumenter opprettet av ROL.") + } + } else if (behandlingForCheck.rolIdent == innloggetIdent) { + if (dokument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_ROL) { + throw MissingTilgangException("ROL har ikke anledning til å endre tittel på dokumenter opprettet av saksbehandlere.") + } + } else { + throw MissingTilgangException("Kun tildelt ROL eller saksbehandler kan endre tittel på dokumenter.") + } + val isCurrentROL = behandlingForCheck.rolIdent == innloggetIdent //Sjekker tilgang på behandlingsnivå: @@ -295,13 +324,30 @@ class DokumentUnderArbeidService( return dokument } - fun validateDocumentNotFinalized( - dokumentId: UUID + fun validateDocument( + dokumentId: UUID, ) { val dokument = dokumentUnderArbeidRepository.getReferenceById(dokumentId) if (dokument.erMarkertFerdig()) { throw DokumentValidationException("Dokument er allerede ferdigstilt.") } + + val behandling = behandlingService.getBehandling(dokument.behandlingId) + + val innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent() + + when (dokument.creatorRole) { + DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING -> { + if (!(behandling.tildeling?.saksbehandlerident == innloggetIdent || behandling.medunderskriver?.saksbehandlerident == innloggetIdent)) { + throw MissingTilgangException("Kun saksbehandler eller medunderskriver kan skrive i dette dokumentet.") + } + } + DokumentUnderArbeid.CreatorRole.KABAL_ROL -> { + if (behandling.rolIdent != innloggetIdent) { + throw MissingTilgangException("Kun ROL kan skrive i dette dokumentet.") + } + } + } } fun updateSmartEditorTemplateId( @@ -578,6 +624,21 @@ class DokumentUnderArbeidService( val documents = descendants.plus(document) + documents.forEach { currentDocument -> + //can delete? + if (behandling.tildeling?.saksbehandlerident == innloggetIdent) { + if (currentDocument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING) { + throw MissingTilgangException("Saksbehandlere har ikke anledning til å slette dokumenter opprettet av ROL.") + } + } else if (behandling.rolIdent == innloggetIdent) { + if (currentDocument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_ROL) { + throw MissingTilgangException("ROL har ikke anledning til å slette dokumenter opprettet av saksbehandlere.") + } + } else { + throw MissingTilgangException("Kun tildelt ROL eller saksbehandler kan slette dokumenter.") + } + } + documents.forEach { currentDocument -> if (currentDocument.erMarkertFerdig()) { logger.warn("Attempting to delete finalized document {}", currentDocument.id) @@ -622,14 +683,9 @@ class DokumentUnderArbeidService( } val parentDokument = dokumentUnderArbeidRepository.getReferenceById(parentId) - val behandling = behandlingService.getBehandling(parentDokument.behandlingId) - - val isCurrentROL = behandling.rolIdent == innloggetIdent - //Sjekker tilgang på behandlingsnivå: behandlingService.getBehandlingForUpdate( behandlingId = parentDokument.behandlingId, - ignoreCheckSkrivetilgang = isCurrentROL ) if (parentDokument.erMarkertFerdig()) { @@ -693,14 +749,9 @@ class DokumentUnderArbeidService( ): DokumentUnderArbeid { val vedlegg = dokumentUnderArbeidRepository.getReferenceById(dokumentId) - val behandling = behandlingService.getBehandling(behandlingId) - - val isCurrentROL = behandling.rolIdent == innloggetIdent - //Sjekker tilgang på behandlingsnivå: behandlingService.getBehandlingForUpdate( behandlingId = vedlegg.behandlingId, - ignoreCheckSkrivetilgang = isCurrentROL ) //TODO: Skal det lages endringslogg på dette?? @@ -737,7 +788,7 @@ class DokumentUnderArbeidService( if (hovedDokument.dokumentEnhetId == null) { //Vi vet at smartEditor-dokumentene har en oppdatert snapshot i mellomlageret fordi det ble fikset i finnOgMarkerFerdigHovedDokument val behandling = behandlingService.getBehandlingForUpdateBySystembruker(hovedDokument.behandlingId) - val dokumentEnhetId = dokumentEnhetService.createKomplettDokumentEnhet( + val dokumentEnhetId = kabalDocumentGateway.createKomplettDokumentEnhet( behandling = behandling, hovedDokument = hovedDokument, vedlegg = vedlegg @@ -752,7 +803,7 @@ class DokumentUnderArbeidService( val vedlegg = dokumentUnderArbeidRepository.findByParentIdOrderByCreated(hovedDokument.id) val behandling: Behandling = behandlingService.getBehandlingForUpdateBySystembruker(hovedDokument.behandlingId) val documentInfoList = - dokumentEnhetService.fullfoerDokumentEnhet(dokumentEnhetId = hovedDokument.dokumentEnhetId!!) + kabalDocumentGateway.fullfoerDokumentEnhet(dokumentEnhetId = hovedDokument.dokumentEnhetId!!) documentInfoList.forEach { documentInfo -> val journalpost = safClient.getJournalpostAsSystembruker(documentInfo.journalpostId.value) diff --git a/src/main/resources/db/migration/V86__add_creator_to_dua.sql b/src/main/resources/db/migration/V86__add_creator_to_dua.sql new file mode 100644 index 000000000..8c8ac9127 --- /dev/null +++ b/src/main/resources/db/migration/V86__add_creator_to_dua.sql @@ -0,0 +1,9 @@ +ALTER TABLE klage.dokument_under_arbeid + ADD COLUMN creator_ident TEXT, + ADD COLUMN creator_role TEXT DEFAULT 'KABAL_SAKSBEHANDLING' NOT NULL; + +UPDATE klage.dokument_under_arbeid dua +SET creator_ident = (SELECT b.tildelt_saksbehandlerident FROM klage.behandling b WHERE b.id = dua.behandling_id); + +ALTER TABLE klage.dokument_under_arbeid + ALTER COLUMN creator_ident SET NOT NULL; diff --git a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt index 758de8f4c..47afbfdda 100644 --- a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt +++ b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt @@ -101,6 +101,8 @@ internal class DokumentUnderArbeidControllerTest { parentId = null, id = UUID.randomUUID(), journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) @@ -169,6 +171,8 @@ internal class DokumentUnderArbeidControllerTest { parentId = null, id = UUID.randomUUID(), journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) val json = mockMvc.perform( diff --git a/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt b/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt index 82f027494..1b8f45e28 100644 --- a/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt +++ b/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt @@ -47,6 +47,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) hovedDokument.markerFerdigHvisIkkeAlleredeMarkertFerdig(LocalDateTime.now(), "S123456") hovedDokument.ferdigstillHvisIkkeAlleredeFerdigstilt(LocalDateTime.now()) @@ -74,6 +76,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -92,6 +96,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, parentId = hovedDokument.id, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) ) @@ -116,6 +122,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -135,6 +143,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, parentId = hovedDokument.id, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) ) @@ -165,6 +175,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -198,6 +210,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) val vedlegg1 = DokumentUnderArbeid( mellomlagerId = UUID.randomUUID().toString(), @@ -211,6 +225,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, parentId = hovedDokument1.id, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) val vedlegg2 = DokumentUnderArbeid( mellomlagerId = UUID.randomUUID().toString(), @@ -224,6 +240,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, parentId = hovedDokument1.id, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) val hovedDokument2 = DokumentUnderArbeid( @@ -237,6 +255,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) val hovedDokument3 = DokumentUnderArbeid( @@ -250,6 +270,8 @@ class DokumentUnderArbeidRepositoryTest { smartEditorId = null, smartEditorTemplateId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument1) dokumentUnderArbeidRepository.save(vedlegg1) diff --git a/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt b/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt index 4da6f292c..843a21391 100644 --- a/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt +++ b/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt @@ -338,6 +338,8 @@ class BehandlingServiceTest { dokumentEnhetId = null, parentId = null, journalfoertDokumentReference = null, + creatorIdent = "null", + creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, ) ) From 522136fc2043b8f2d98cb3ffde26ab847dad573f Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Thu, 21 Sep 2023 15:39:09 +0200 Subject: [PATCH 2/8] Added info about creator for DUA. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Øyvind Norsted Wedøe --- .../kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt | 4 ++++ .../no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt b/src/main/kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt index 0ab74fd88..74b0e2481 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt @@ -86,6 +86,8 @@ class DokumentMapper( parentId = dokumentUnderArbeid.parentId, type = type, journalfoertDokumentReference = journalfoertDokumentReference, + creatorIdent = dokumentUnderArbeid.creatorIdent, + creatorRole = dokumentUnderArbeid.creatorRole, ) } @@ -130,6 +132,8 @@ class DokumentMapper( content = jacksonObjectMapper().readTree(smartEditorDocument.json), created = smartEditorDocument.created, modified = smartEditorDocument.modified, + creatorIdent = dokumentUnderArbeid.creatorIdent, + creatorRole = dokumentUnderArbeid.creatorRole, ) } diff --git a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt index c7037a3da..b85f5b403 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt @@ -24,6 +24,8 @@ data class DokumentView( val parent: UUID?, val parentId: UUID?, val journalfoertDokumentReference: JournalfoertDokumentReference?, + val creatorIdent: String, + val creatorRole: DokumentUnderArbeid.CreatorRole, ) { data class JournalfoertDokumentReference ( val journalpostId: String, @@ -64,4 +66,6 @@ data class SmartEditorDocumentView( //Deprecated val parent: UUID?, val parentId: UUID?, + val creatorIdent: String, + val creatorRole: DokumentUnderArbeid.CreatorRole, ) \ No newline at end of file From 67f81304c34aa214cd94d93d6c0691d2092f8891 Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Thu, 21 Sep 2023 15:44:23 +0200 Subject: [PATCH 3/8] Possibility to add parent when creating smart document. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Øyvind Norsted Wedøe --- .../klage/dokument/api/controller/SmartEditorController.kt | 1 + .../nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt | 1 + .../nav/klage/dokument/service/DokumentUnderArbeidService.kt | 4 +++- .../api/controller/DokumentUnderArbeidControllerTest.kt | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt b/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt index e9cea6624..33968b935 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/controller/SmartEditorController.kt @@ -80,6 +80,7 @@ class SmartEditorController( smartEditorTemplateId = body.templateId, innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent(), tittel = body.tittel ?: DokumentType.VEDTAK.defaultFilnavn, + parentId = body.parentId, ) val smartEditorId = diff --git a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt index 16431e268..4a2c5afba 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt @@ -16,6 +16,7 @@ data class SmartHovedDokumentInput( val tittel: String?, val dokumentTypeId: String? = null, val version: Int?, + val parentId: UUID?, ) data class PatchSmartHovedDokumentInput( diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index 4d4d233ac..9b314e19d 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -113,6 +113,7 @@ class DokumentUnderArbeidService( smartEditorTemplateId: String?, innloggetIdent: String, tittel: String, + parentId: UUID?, ): DokumentUnderArbeid { //Sjekker tilgang på behandlingsnivå: val behandling = behandlingService.getBehandlingForUpdate(behandlingId) @@ -140,7 +141,8 @@ class DokumentUnderArbeidService( smartEditorTemplateId = smartEditorTemplateId, journalfoertDokumentReference = null, creatorIdent = innloggetIdent, - creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) + creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent), + parentId = parentId, ) ) behandling.publishEndringsloggEvent( diff --git a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt index 47afbfdda..51199f4f8 100644 --- a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt +++ b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt @@ -134,6 +134,7 @@ internal class DokumentUnderArbeidControllerTest { tittel = "Tittel", templateId = "template", version = null, + parentId = null, ) every { dokumentUnderArbeidService.getSmartEditorId(any(), any()) } returns smartEditorDocumentId @@ -153,6 +154,7 @@ internal class DokumentUnderArbeidControllerTest { any(), any(), any(), + any(), ) } returns DokumentUnderArbeid( mellomlagerId = "mellomlagerId", From deedfc3925ef360f35651b90400758b0261a653d Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Thu, 21 Sep 2023 16:53:14 +0200 Subject: [PATCH 4/8] ROL rights MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Øyvind Norsted Wedøe --- .../DokumenterUnderArbeidController.kt | 1 + .../api/view/DokumentUnderArbeidInput.kt | 1 + .../api/view/DokumentUnderArbeidView.kt | 5 +- .../DokumentUnderArbeid.kt | 8 +- .../service/DokumentUnderArbeidService.kt | 99 +++++++++++-------- .../klage/oppgave/domain/klage/Behandling.kt | 8 ++ .../DokumentUnderArbeidControllerTest.kt | 6 +- .../DokumentUnderArbeidRepositoryTest.kt | 23 ++--- .../oppgave/service/BehandlingServiceTest.kt | 3 +- 9 files changed, 90 insertions(+), 64 deletions(-) diff --git a/src/main/kotlin/no/nav/klage/dokument/api/controller/DokumenterUnderArbeidController.kt b/src/main/kotlin/no/nav/klage/dokument/api/controller/DokumenterUnderArbeidController.kt index 5dafbff21..35bb1dfb5 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/controller/DokumenterUnderArbeidController.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/controller/DokumenterUnderArbeidController.kt @@ -67,6 +67,7 @@ class DokumentUnderArbeidController( opplastetFil = opplastetFil, innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent(), tittel = opplastetFil.title, + parentId = input.parentId, ) ) } diff --git a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt index 4a2c5afba..241e59e1b 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidInput.kt @@ -8,6 +8,7 @@ import java.util.* data class FilInput( val file: MultipartFile, val dokumentTypeId: String = DokumentType.NOTAT.id, + val parentId: UUID?, ) data class SmartHovedDokumentInput( diff --git a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt index b85f5b403..047f88bde 100644 --- a/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt +++ b/src/main/kotlin/no/nav/klage/dokument/api/view/DokumentUnderArbeidView.kt @@ -2,6 +2,7 @@ package no.nav.klage.dokument.api.view import com.fasterxml.jackson.databind.JsonNode import no.nav.klage.dokument.domain.dokumenterunderarbeid.DokumentUnderArbeid +import no.nav.klage.oppgave.domain.klage.BehandlingRole import java.time.LocalDateTime import java.util.* @@ -25,7 +26,7 @@ data class DokumentView( val parentId: UUID?, val journalfoertDokumentReference: JournalfoertDokumentReference?, val creatorIdent: String, - val creatorRole: DokumentUnderArbeid.CreatorRole, + val creatorRole: BehandlingRole, ) { data class JournalfoertDokumentReference ( val journalpostId: String, @@ -67,5 +68,5 @@ data class SmartEditorDocumentView( val parent: UUID?, val parentId: UUID?, val creatorIdent: String, - val creatorRole: DokumentUnderArbeid.CreatorRole, + val creatorRole: BehandlingRole, ) \ No newline at end of file diff --git a/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt b/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt index 21c1923bc..c49921841 100644 --- a/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt +++ b/src/main/kotlin/no/nav/klage/dokument/domain/dokumenterunderarbeid/DokumentUnderArbeid.kt @@ -2,6 +2,7 @@ package no.nav.klage.dokument.domain.dokumenterunderarbeid import jakarta.persistence.* import no.nav.klage.kodeverk.DokumentType +import no.nav.klage.oppgave.domain.klage.BehandlingRole import no.nav.klage.oppgave.domain.klage.DokumentTypeConverter import org.hibernate.annotations.BatchSize import org.hibernate.annotations.DynamicUpdate @@ -72,7 +73,7 @@ open class DokumentUnderArbeid( open var creatorIdent: String, @Column(name = "creator_role") @Enumerated(EnumType.STRING) - open var creatorRole: CreatorRole, + open var creatorRole: BehandlingRole, ) : Comparable { override fun compareTo(other: DokumentUnderArbeid): Int = @@ -126,11 +127,6 @@ open class DokumentUnderArbeid( JOURNALFOERT } - enum class CreatorRole { - KABAL_SAKSBEHANDLING, - KABAL_ROL; - } - fun getType(): DokumentUnderArbeidType { return when { smartEditorId != null -> DokumentUnderArbeidType.SMART diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index 9b314e19d..f119d45a8 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -22,11 +22,8 @@ import no.nav.klage.oppgave.clients.saf.graphql.Journalpost import no.nav.klage.oppgave.clients.saf.graphql.SafGraphQlClient import no.nav.klage.oppgave.domain.events.BehandlingEndretEvent import no.nav.klage.oppgave.domain.events.DokumentFerdigstiltAvSaksbehandler -import no.nav.klage.oppgave.domain.klage.Behandling +import no.nav.klage.oppgave.domain.klage.* import no.nav.klage.oppgave.domain.klage.BehandlingSetters.addSaksdokument -import no.nav.klage.oppgave.domain.klage.Endringslogginnslag -import no.nav.klage.oppgave.domain.klage.Felt -import no.nav.klage.oppgave.domain.klage.Saksdokument import no.nav.klage.oppgave.exceptions.InvalidProperty import no.nav.klage.oppgave.exceptions.MissingTilgangException import no.nav.klage.oppgave.exceptions.SectionedValidationErrorWithDetailsException @@ -70,9 +67,16 @@ class DokumentUnderArbeidService( opplastetFil: FysiskDokument?, innloggetIdent: String, tittel: String, + parentId: UUID?, ): DokumentUnderArbeid { //Sjekker tilgang på behandlingsnivå: - val behandling = behandlingService.getBehandlingForUpdate(behandlingId) + val behandling = behandlingService.getBehandling(behandlingId) + + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + + if (behandlingRole == BehandlingRole.KABAL_ROL && parentId == null) { + throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") + } if (opplastetFil == null) { throw DokumentValidationException("No file uploaded") @@ -80,6 +84,7 @@ class DokumentUnderArbeidService( attachmentValidator.validateAttachment(opplastetFil) val mellomlagerId = mellomlagerService.uploadDocument(opplastetFil) + val hovedDokument = dokumentUnderArbeidRepository.save( DokumentUnderArbeid( mellomlagerId = mellomlagerId, @@ -92,7 +97,8 @@ class DokumentUnderArbeidService( smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = innloggetIdent, - creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) + creatorRole = behandlingRole, + parentId = parentId, ) ) behandling.publishEndringsloggEvent( @@ -116,7 +122,15 @@ class DokumentUnderArbeidService( parentId: UUID?, ): DokumentUnderArbeid { //Sjekker tilgang på behandlingsnivå: - val behandling = behandlingService.getBehandlingForUpdate(behandlingId) + val behandling = behandlingService.getBehandling(behandlingId) + + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + + if (behandlingRole == BehandlingRole.KABAL_ROL && parentId == null) { + throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") + } + + validateCanCreateDocuments(behandlingRole) if (json == null) { throw DokumentValidationException("Ingen json angitt") @@ -141,7 +155,7 @@ class DokumentUnderArbeidService( smartEditorTemplateId = smartEditorTemplateId, journalfoertDokumentReference = null, creatorIdent = innloggetIdent, - creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent), + creatorRole = behandlingRole, parentId = parentId, ) ) @@ -193,6 +207,9 @@ class DokumentUnderArbeidService( val (toAdd, duplicates) = journalfoerteDokumenter.partition { it !in alreadyAddedDocuments } + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + validateCanCreateDocuments(behandlingRole) + val resultingDocuments = toAdd.map { journalfoertDokumentReference -> val journalpostInDokarkiv = safClient.getJournalpostAsSaksbehandler(journalfoertDokumentReference.journalpostId) @@ -212,7 +229,7 @@ class DokumentUnderArbeidService( dokumentInfoId = journalfoertDokumentReference.dokumentInfoId, ), creatorIdent = innloggetIdent, - creatorRole = getCreatorRoleOrThrowException(behandling, innloggetIdent) + creatorRole = behandlingRole ) behandling.publishEndringsloggEvent( @@ -232,14 +249,19 @@ class DokumentUnderArbeidService( return resultingDocuments to duplicates } - private fun getCreatorRoleOrThrowException( - behandling: Behandling, - innloggetIdent: String - ) = if (behandling.rolIdent == innloggetIdent) { - DokumentUnderArbeid.CreatorRole.KABAL_ROL - } else if (behandling.tildeling?.saksbehandlerident == innloggetIdent) { - DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING - } else throw MissingTilgangException("Kun ROL eller saksbehandler kan opprette dokumenter") + private fun Behandling.getRoleInBehandling(innloggetIdent: String) = if (rolIdent == innloggetIdent) { + BehandlingRole.KABAL_ROL + } else if (tildeling?.saksbehandlerident == innloggetIdent) { + BehandlingRole.KABAL_SAKSBEHANDLING + } else if (medunderskriver?.saksbehandlerident == innloggetIdent) { + BehandlingRole.KABAL_MEDUNDERSKRIVER + } else BehandlingRole.NONE + + private fun validateCanCreateDocuments(behandlingRole: BehandlingRole) { + if (behandlingRole !in listOf(BehandlingRole.KABAL_ROL, BehandlingRole.KABAL_SAKSBEHANDLING)) { + throw MissingTilgangException("Kun ROL eller saksbehandler kan opprette dokumenter") + } + } fun getDokumentUnderArbeid(dokumentId: UUID) = dokumentUnderArbeidRepository.getReferenceById(dokumentId) @@ -289,16 +311,10 @@ class DokumentUnderArbeidService( val behandlingForCheck = behandlingService.getBehandling(dokument.behandlingId) - if (behandlingForCheck.tildeling?.saksbehandlerident == innloggetIdent) { - if (dokument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING) { - throw MissingTilgangException("Saksbehandlere har ikke anledning til å endre tittel på dokumenter opprettet av ROL.") - } - } else if (behandlingForCheck.rolIdent == innloggetIdent) { - if (dokument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_ROL) { - throw MissingTilgangException("ROL har ikke anledning til å endre tittel på dokumenter opprettet av saksbehandlere.") - } - } else { - throw MissingTilgangException("Kun tildelt ROL eller saksbehandler kan endre tittel på dokumenter.") + val behandlingRole = behandlingForCheck.getRoleInBehandling(innloggetIdent) + + if (dokument.creatorRole != behandlingRole) { + throw MissingTilgangException("$behandlingRole har ikke anledning til å endre tittel på dette dokumentet eiet av ${dokument.creatorRole}.") } val isCurrentROL = behandlingForCheck.rolIdent == innloggetIdent @@ -338,17 +354,23 @@ class DokumentUnderArbeidService( val innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent() + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + when (dokument.creatorRole) { - DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING -> { - if (!(behandling.tildeling?.saksbehandlerident == innloggetIdent || behandling.medunderskriver?.saksbehandlerident == innloggetIdent)) { + BehandlingRole.KABAL_SAKSBEHANDLING -> { + if (behandlingRole !in listOf(BehandlingRole.KABAL_SAKSBEHANDLING, BehandlingRole.KABAL_MEDUNDERSKRIVER)) { throw MissingTilgangException("Kun saksbehandler eller medunderskriver kan skrive i dette dokumentet.") } } - DokumentUnderArbeid.CreatorRole.KABAL_ROL -> { - if (behandling.rolIdent != innloggetIdent) { + BehandlingRole.KABAL_ROL -> { + if (behandlingRole != BehandlingRole.KABAL_ROL) { throw MissingTilgangException("Kun ROL kan skrive i dette dokumentet.") } } + + else -> { + throw RuntimeException("A document was created by non valid role: ${dokument.creatorRole}") + } } } @@ -626,18 +648,11 @@ class DokumentUnderArbeidService( val documents = descendants.plus(document) + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + documents.forEach { currentDocument -> - //can delete? - if (behandling.tildeling?.saksbehandlerident == innloggetIdent) { - if (currentDocument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING) { - throw MissingTilgangException("Saksbehandlere har ikke anledning til å slette dokumenter opprettet av ROL.") - } - } else if (behandling.rolIdent == innloggetIdent) { - if (currentDocument.creatorRole != DokumentUnderArbeid.CreatorRole.KABAL_ROL) { - throw MissingTilgangException("ROL har ikke anledning til å slette dokumenter opprettet av saksbehandlere.") - } - } else { - throw MissingTilgangException("Kun tildelt ROL eller saksbehandler kan slette dokumenter.") + if (currentDocument.creatorRole != behandlingRole) { + throw MissingTilgangException("$behandlingRole har ikke anledning til å slette dokumentet eiet av ${currentDocument.creatorRole}.") } } diff --git a/src/main/kotlin/no/nav/klage/oppgave/domain/klage/Behandling.kt b/src/main/kotlin/no/nav/klage/oppgave/domain/klage/Behandling.kt index 0c473626e..db9793ad4 100644 --- a/src/main/kotlin/no/nav/klage/oppgave/domain/klage/Behandling.kt +++ b/src/main/kotlin/no/nav/klage/oppgave/domain/klage/Behandling.kt @@ -172,6 +172,14 @@ abstract class Behandling( } } +enum class BehandlingRole { + KABAL_SAKSBEHANDLING, + KABAL_ROL, + KABAL_MEDUNDERSKRIVER, + NONE, + ; +} + val utfallToNewAnkebehandling = setOf( Utfall.HENVIST diff --git a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt index 51199f4f8..b1d25bf51 100644 --- a/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt +++ b/src/test/kotlin/no/nav/klage/dokument/api/controller/DokumentUnderArbeidControllerTest.kt @@ -18,6 +18,7 @@ import no.nav.klage.dokument.service.DokumentUnderArbeidService import no.nav.klage.kodeverk.DokumentType import no.nav.klage.oppgave.clients.events.KafkaEventClient import no.nav.klage.oppgave.clients.saf.graphql.SafGraphQlClient +import no.nav.klage.oppgave.domain.klage.BehandlingRole import no.nav.klage.oppgave.service.BehandlingService import no.nav.klage.oppgave.service.InnloggetSaksbehandlerService import org.assertj.core.api.Assertions.assertThat @@ -83,6 +84,7 @@ internal class DokumentUnderArbeidControllerTest { any(), any(), any(), + any(), ) } returns DokumentUnderArbeid( mellomlagerId = "mellomlagerId", @@ -102,7 +104,7 @@ internal class DokumentUnderArbeidControllerTest { id = UUID.randomUUID(), journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = BehandlingRole.KABAL_SAKSBEHANDLING, ) @@ -174,7 +176,7 @@ internal class DokumentUnderArbeidControllerTest { id = UUID.randomUUID(), journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = BehandlingRole.KABAL_SAKSBEHANDLING, ) val json = mockMvc.perform( diff --git a/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt b/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt index 1b8f45e28..bdb352cd0 100644 --- a/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt +++ b/src/test/kotlin/no/nav/klage/dokument/repositories/DokumentUnderArbeidRepositoryTest.kt @@ -3,6 +3,7 @@ package no.nav.klage.dokument.repositories import no.nav.klage.dokument.domain.dokumenterunderarbeid.DokumentUnderArbeid import no.nav.klage.kodeverk.DokumentType import no.nav.klage.oppgave.db.TestPostgresqlContainer +import no.nav.klage.oppgave.domain.klage.BehandlingRole.KABAL_SAKSBEHANDLING import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired @@ -48,7 +49,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) hovedDokument.markerFerdigHvisIkkeAlleredeMarkertFerdig(LocalDateTime.now(), "S123456") hovedDokument.ferdigstillHvisIkkeAlleredeFerdigstilt(LocalDateTime.now()) @@ -77,7 +78,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -97,7 +98,7 @@ class DokumentUnderArbeidRepositoryTest { parentId = hovedDokument.id, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) ) @@ -123,7 +124,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -144,7 +145,7 @@ class DokumentUnderArbeidRepositoryTest { parentId = hovedDokument.id, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) ) @@ -176,7 +177,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument) @@ -211,7 +212,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) val vedlegg1 = DokumentUnderArbeid( mellomlagerId = UUID.randomUUID().toString(), @@ -226,7 +227,7 @@ class DokumentUnderArbeidRepositoryTest { parentId = hovedDokument1.id, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) val vedlegg2 = DokumentUnderArbeid( mellomlagerId = UUID.randomUUID().toString(), @@ -241,7 +242,7 @@ class DokumentUnderArbeidRepositoryTest { parentId = hovedDokument1.id, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) val hovedDokument2 = DokumentUnderArbeid( @@ -256,7 +257,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) val hovedDokument3 = DokumentUnderArbeid( @@ -271,7 +272,7 @@ class DokumentUnderArbeidRepositoryTest { smartEditorTemplateId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) dokumentUnderArbeidRepository.save(hovedDokument1) dokumentUnderArbeidRepository.save(vedlegg1) diff --git a/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt b/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt index 843a21391..58398bf5c 100644 --- a/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt +++ b/src/test/kotlin/no/nav/klage/oppgave/service/BehandlingServiceTest.kt @@ -19,6 +19,7 @@ import no.nav.klage.oppgave.clients.klagefssproxy.KlageFssProxyClient import no.nav.klage.oppgave.clients.pdl.PdlFacade import no.nav.klage.oppgave.db.TestPostgresqlContainer import no.nav.klage.oppgave.domain.klage.* +import no.nav.klage.oppgave.domain.klage.BehandlingRole.KABAL_SAKSBEHANDLING import no.nav.klage.oppgave.exceptions.BehandlingAvsluttetException import no.nav.klage.oppgave.exceptions.BehandlingFinalizedException import no.nav.klage.oppgave.exceptions.SectionedValidationErrorWithDetailsException @@ -339,7 +340,7 @@ class BehandlingServiceTest { parentId = null, journalfoertDokumentReference = null, creatorIdent = "null", - creatorRole = DokumentUnderArbeid.CreatorRole.KABAL_SAKSBEHANDLING, + creatorRole = KABAL_SAKSBEHANDLING, ) ) From bae625781ed2534b827fb5fa718125b98a7e7fe6 Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Fri, 22 Sep 2023 09:04:36 +0200 Subject: [PATCH 5/8] Removed `detail` from problems when title is the same. --- .../oppgave/config/problem/ProblemHandlingControllerAdvice.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/no/nav/klage/oppgave/config/problem/ProblemHandlingControllerAdvice.kt b/src/main/kotlin/no/nav/klage/oppgave/config/problem/ProblemHandlingControllerAdvice.kt index 8c685a967..66c5760f8 100644 --- a/src/main/kotlin/no/nav/klage/oppgave/config/problem/ProblemHandlingControllerAdvice.kt +++ b/src/main/kotlin/no/nav/klage/oppgave/config/problem/ProblemHandlingControllerAdvice.kt @@ -238,7 +238,7 @@ class ProblemHandlingControllerAdvice : ResponseEntityExceptionHandler() { exception = ex ) - return ProblemDetail.forStatusAndDetail(httpStatus, errorMessage).apply { + return ProblemDetail.forStatus(httpStatus).apply { title = errorMessage } } From 6e94b126fe12e61112bdc95efe981160ea2c8314 Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Fri, 22 Sep 2023 16:31:48 +0200 Subject: [PATCH 6/8] Document access for ROL when creating or moving attachments. --- .../service/DokumentUnderArbeidService.kt | 49 ++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index f119d45a8..ee70d41c1 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -14,6 +14,7 @@ import no.nav.klage.dokument.exceptions.JsonToPdfValidationException import no.nav.klage.dokument.repositories.DokumentUnderArbeidRepository import no.nav.klage.kodeverk.DokumentType import no.nav.klage.kodeverk.PartIdType +import no.nav.klage.kodeverk.Template import no.nav.klage.oppgave.clients.ereg.EregClient import no.nav.klage.oppgave.clients.kabaldocument.KabalDocumentGateway import no.nav.klage.oppgave.clients.kabaldocument.KabalDocumentMapper @@ -69,7 +70,7 @@ class DokumentUnderArbeidService( tittel: String, parentId: UUID?, ): DokumentUnderArbeid { - //Sjekker tilgang på behandlingsnivå: + //Sjekker lesetilgang på behandlingsnivå: val behandling = behandlingService.getBehandling(behandlingId) val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) @@ -78,6 +79,14 @@ class DokumentUnderArbeidService( throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") } + if (parentId != null && behandlingRole == BehandlingRole.KABAL_ROL) { + val parentDocument = dokumentUnderArbeidRepository.getReferenceById(parentId) + + if (parentDocument.smartEditorTemplateId != Template.ROL_NOTAT.id) { + throw MissingTilgangException("ROL kan ikke opprette vedlegg til dette hoveddokumentet.") + } + } + if (opplastetFil == null) { throw DokumentValidationException("No file uploaded") } @@ -85,7 +94,7 @@ class DokumentUnderArbeidService( attachmentValidator.validateAttachment(opplastetFil) val mellomlagerId = mellomlagerService.uploadDocument(opplastetFil) - val hovedDokument = dokumentUnderArbeidRepository.save( + val document = dokumentUnderArbeidRepository.save( DokumentUnderArbeid( mellomlagerId = mellomlagerId, opplastet = LocalDateTime.now(), @@ -105,11 +114,11 @@ class DokumentUnderArbeidService( saksbehandlerident = innloggetIdent, felt = Felt.DOKUMENT_UNDER_ARBEID_OPPLASTET, fraVerdi = null, - tilVerdi = hovedDokument.created.toString(), - tidspunkt = hovedDokument.created, - dokumentId = hovedDokument.id, + tilVerdi = document.created.toString(), + tidspunkt = document.created, + dokumentId = document.id, ) - return hovedDokument + return document } fun opprettSmartdokument( @@ -121,7 +130,7 @@ class DokumentUnderArbeidService( tittel: String, parentId: UUID?, ): DokumentUnderArbeid { - //Sjekker tilgang på behandlingsnivå: + //Sjekker lesetilgang på behandlingsnivå: val behandling = behandlingService.getBehandling(behandlingId) val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) @@ -130,6 +139,14 @@ class DokumentUnderArbeidService( throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") } + if (parentId != null && behandlingRole == BehandlingRole.KABAL_ROL) { + val parentDocument = dokumentUnderArbeidRepository.getReferenceById(parentId) + + if (parentDocument.smartEditorTemplateId != Template.ROL_NOTAT.id) { + throw MissingTilgangException("ROL kan ikke opprette vedlegg til dette hoveddokumentet.") + } + } + validateCanCreateDocuments(behandlingRole) if (json == null) { @@ -698,14 +715,22 @@ class DokumentUnderArbeidService( if (parentId == dokumentId) { throw DokumentValidationException("Kan ikke gjøre et dokument til vedlegg for seg selv.") } - val parentDokument = dokumentUnderArbeidRepository.getReferenceById(parentId) + val parentDocument = dokumentUnderArbeidRepository.getReferenceById(parentId) - //Sjekker tilgang på behandlingsnivå: - behandlingService.getBehandlingForUpdate( - behandlingId = parentDokument.behandlingId, + val behandling = behandlingService.getBehandling( + behandlingId = parentDocument.behandlingId, ) - if (parentDokument.erMarkertFerdig()) { + val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + + if (!(behandlingRole == BehandlingRole.KABAL_ROL && parentDocument.smartEditorTemplateId == Template.ROL_NOTAT.id)) { + //Sjekker generell tilgang på behandlingsnivå: + behandlingService.getBehandlingForUpdate( + behandlingId = parentDocument.behandlingId, + ) + } + + if (parentDocument.erMarkertFerdig()) { throw DokumentValidationException("Kan ikke koble til et dokument som er ferdigstilt") } From d1f642ecd1bea62d25e747c4c6164aaf04de122a Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Sat, 23 Sep 2023 09:42:02 +0200 Subject: [PATCH 7/8] Document access for ROL when creating or moving attachments. --- build.gradle.kts | 2 +- .../service/DokumentUnderArbeidService.kt | 51 +++++++++---------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d5dab4ba7..427f0c0cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ val jacksonJsonschemaVersion = "1.0.39" val pdfboxVersion = "3.0.0" val tikaVersion = "2.9.0" val verapdfVersion = "1.24.1" -val klageKodeverkVersion = "1.6.5" +val klageKodeverkVersion = "1.6.8" plugins { val kotlinVersion = "1.9.10" diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index ee70d41c1..6776d9b40 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -75,17 +75,10 @@ class DokumentUnderArbeidService( val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) - if (behandlingRole == BehandlingRole.KABAL_ROL && parentId == null) { - throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") - } - - if (parentId != null && behandlingRole == BehandlingRole.KABAL_ROL) { - val parentDocument = dokumentUnderArbeidRepository.getReferenceById(parentId) - - if (parentDocument.smartEditorTemplateId != Template.ROL_NOTAT.id) { - throw MissingTilgangException("ROL kan ikke opprette vedlegg til dette hoveddokumentet.") - } - } + validateCanCreateDocuments( + behandlingRole = behandlingRole, + parentDocument = if (parentId != null) dokumentUnderArbeidRepository.getReferenceById(parentId) else null + ) if (opplastetFil == null) { throw DokumentValidationException("No file uploaded") @@ -135,19 +128,10 @@ class DokumentUnderArbeidService( val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) - if (behandlingRole == BehandlingRole.KABAL_ROL && parentId == null) { - throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") - } - - if (parentId != null && behandlingRole == BehandlingRole.KABAL_ROL) { - val parentDocument = dokumentUnderArbeidRepository.getReferenceById(parentId) - - if (parentDocument.smartEditorTemplateId != Template.ROL_NOTAT.id) { - throw MissingTilgangException("ROL kan ikke opprette vedlegg til dette hoveddokumentet.") - } - } - - validateCanCreateDocuments(behandlingRole) + validateCanCreateDocuments( + behandlingRole = behandlingRole, + parentDocument = if (parentId != null) dokumentUnderArbeidRepository.getReferenceById(parentId) else null + ) if (json == null) { throw DokumentValidationException("Ingen json angitt") @@ -225,7 +209,10 @@ class DokumentUnderArbeidService( val (toAdd, duplicates) = journalfoerteDokumenter.partition { it !in alreadyAddedDocuments } val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) - validateCanCreateDocuments(behandlingRole) + validateCanCreateDocuments( + behandlingRole, + if (parentId != null) dokumentUnderArbeidRepository.getReferenceById(parentId) else null + ) val resultingDocuments = toAdd.map { journalfoertDokumentReference -> val journalpostInDokarkiv = @@ -274,10 +261,20 @@ class DokumentUnderArbeidService( BehandlingRole.KABAL_MEDUNDERSKRIVER } else BehandlingRole.NONE - private fun validateCanCreateDocuments(behandlingRole: BehandlingRole) { + private fun validateCanCreateDocuments(behandlingRole: BehandlingRole, parentDocument: DokumentUnderArbeid?) { if (behandlingRole !in listOf(BehandlingRole.KABAL_ROL, BehandlingRole.KABAL_SAKSBEHANDLING)) { throw MissingTilgangException("Kun ROL eller saksbehandler kan opprette dokumenter") } + + if (behandlingRole == BehandlingRole.KABAL_ROL && parentDocument == null) { + throw MissingTilgangException("ROL kan ikke opprette hoveddokumenter.") + } + + if (parentDocument != null && behandlingRole == BehandlingRole.KABAL_ROL) { + if (parentDocument.smartEditorTemplateId != Template.ROL_QUESTIONS.id) { + throw MissingTilgangException("ROL kan ikke opprette vedlegg til dette hoveddokumentet.") + } + } } fun getDokumentUnderArbeid(dokumentId: UUID) = dokumentUnderArbeidRepository.getReferenceById(dokumentId) @@ -723,7 +720,7 @@ class DokumentUnderArbeidService( val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) - if (!(behandlingRole == BehandlingRole.KABAL_ROL && parentDocument.smartEditorTemplateId == Template.ROL_NOTAT.id)) { + if (!(behandlingRole == BehandlingRole.KABAL_ROL && parentDocument.smartEditorTemplateId == Template.ROL_QUESTIONS.id)) { //Sjekker generell tilgang på behandlingsnivå: behandlingService.getBehandlingForUpdate( behandlingId = parentDocument.behandlingId, From ab8aa00ddb0de1a449d0098dfa9de1046038ec78 Mon Sep 17 00:00:00 2001 From: Andreas Jonsson Date: Sat, 23 Sep 2023 09:46:34 +0200 Subject: [PATCH 8/8] Minor code cleaning --- .../nav/klage/dokument/service/DokumentUnderArbeidService.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt index 6776d9b40..36d40d5af 100644 --- a/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt +++ b/src/main/kotlin/no/nav/klage/dokument/service/DokumentUnderArbeidService.kt @@ -209,9 +209,10 @@ class DokumentUnderArbeidService( val (toAdd, duplicates) = journalfoerteDokumenter.partition { it !in alreadyAddedDocuments } val behandlingRole = behandling.getRoleInBehandling(innloggetIdent) + validateCanCreateDocuments( - behandlingRole, - if (parentId != null) dokumentUnderArbeidRepository.getReferenceById(parentId) else null + behandlingRole = behandlingRole, + parentDocument = parentDocument ) val resultingDocuments = toAdd.map { journalfoertDokumentReference ->