From 7a860e1ae2a340fda4c3e3e224a2c3e43507eef4 Mon Sep 17 00:00:00 2001 From: JeremiahUy Date: Wed, 16 Oct 2024 16:04:20 +0200 Subject: [PATCH] ADD: Controller for pvk dokument and updated pvk dokument files Co-authored-by: andregroseth --- .../pvkdokument/PvkDokumentController.java | 72 +++++++++++++++++++ .../pvk/pvkdokument/PvkDokumentService.java | 71 ++++++++++++++++++ .../pvkdokument/domain/PvkDokumentRepo.java | 23 ++++++ .../pvkdokument/dto/PvkDokumentRequest.java | 4 +- .../pvkdokument/dto/PvkDokumentResponse.java | 36 +++++++++- 5 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentController.java create mode 100644 apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentService.java create mode 100644 apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/domain/PvkDokumentRepo.java diff --git a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentController.java b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentController.java new file mode 100644 index 000000000..5cbb86b5b --- /dev/null +++ b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentController.java @@ -0,0 +1,72 @@ +package no.nav.data.pvk.pvkdokument; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.data.common.exceptions.ValidationException; +import no.nav.data.common.rest.PageParameters; +import no.nav.data.common.rest.RestResponsePage; +import no.nav.data.pvk.pvkdokument.domain.PvkDokument; +import no.nav.data.pvk.pvkdokument.dto.PvkDokumentRequest; +import no.nav.data.pvk.pvkdokument.dto.PvkDokumentResponse; +import org.springframework.data.domain.Page; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; +import java.util.UUID; + +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/pvkdokument") +@Tag(name = "Pvk Dokument", description = "Pvk Dokument for etterlevelsesdokumentasjon") +public class PvkDokumentController { + + private final PvkDokumentService pvkDokumentService; + + @Operation(summary = "Get All PvkDokument") + @ApiResponse(description = "ok") + @GetMapping + public ResponseEntity> getAll( + PageParameters pageParameters + ) { + log.info("Get all PvkDokument"); + Page page = pvkDokumentService.getAll(pageParameters); + return ResponseEntity.ok(new RestResponsePage<>(page).convert(PvkDokumentResponse::buildFrom)); + } + + @Operation(summary = "Create PvkDocument") + @ApiResponse(responseCode = "201", description = "PvkDokument created") + @PostMapping + public ResponseEntity createPvkDokumente(@RequestBody PvkDokumentRequest request) { + log.info("Create PvkDokument"); + var pvkDokument = pvkDokumentService.save(request.convertToPvkDokument(), false); + + return new ResponseEntity<>(PvkDokumentResponse.buildFrom(pvkDokument), HttpStatus.CREATED); + } + + @Operation(summary = "Update Pvk Document") + @ApiResponse(description = "Pvk Document updated") + @PutMapping("/{id}") + public ResponseEntity updatePvkDokument(@PathVariable UUID id, @Valid @RequestBody PvkDokumentRequest request) { + log.info("Update Pvk Document id={}", id); + + if (!Objects.equals(id, request.getIdAsUUID())) { + throw new ValidationException(String.format("id mismatch in request %s and path %s", request.getId(), id)); + } + + var pvkDokument = pvkDokumentService.save(request.convertToPvkDokument(), true); + return ResponseEntity.ok(PvkDokumentResponse.buildFrom(pvkDokument)); + } +} diff --git a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentService.java b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentService.java new file mode 100644 index 000000000..7952d10f3 --- /dev/null +++ b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/PvkDokumentService.java @@ -0,0 +1,71 @@ +package no.nav.data.pvk.pvkdokument; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.data.common.exceptions.NotFoundException; +import no.nav.data.common.rest.PageParameters; +import no.nav.data.pvk.pvkdokument.domain.PvkDokument; +import no.nav.data.pvk.pvkdokument.domain.PvkDokumentRepo; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; +import java.util.UUID; + +@Service +@Slf4j +@RequiredArgsConstructor +public class PvkDokumentService { + + private PvkDokumentRepo repo; + + public PvkDokument get(UUID uuid) { + if (uuid == null || !repo.existsById(uuid)) return null; + return getPvkDokument(uuid); + } + + private PvkDokument getPvkDokument(UUID uuid) { + return repo.findById(uuid).orElseThrow(() -> new NotFoundException("Couldn't find Pvk Dokument with id " + uuid)); + } + + @Transactional + public PvkDokument saveTestData(PvkDokument pvkDokument) { + pvkDokument = repo.save(pvkDokument); + repo.flush(); + return pvkDokument; + } + + public Page getAll(PageParameters pageParameters) { + return repo.findAll(pageParameters.createPage()); + } + + public Optional getByEtterlevelseDokumentasjon(String etterlevelseDokumentasjonId) { + return repo.findByEtterlevelseDokumensjon(etterlevelseDokumentasjonId); + } + + @Transactional(propagation = Propagation.REQUIRED) + public PvkDokument save(PvkDokument pvkDokument, boolean isUpdate) { + + if (!isUpdate) { + if (pvkDokument.getId() == null) { + pvkDokument.setId(UUID.randomUUID()); + } + var existingPvkDokument = repo.findByEtterlevelseDokumensjon(pvkDokument.getEtterlevelseDokumentId()); + if (existingPvkDokument.isPresent()) { + log.warn("Found existing pvk document when trying to create for etterlevelse dokumentation id: {}", pvkDokument.getEtterlevelseDokumentId()); + pvkDokument = existingPvkDokument.get(); + } + } + + return repo.save(pvkDokument); + } + + @Transactional(propagation = Propagation.REQUIRED) + public PvkDokument delete(UUID id) { + var pvkDokumentToDelete = repo.findById(id); + repo.deleteById(id); + return pvkDokumentToDelete.orElse(null); + } +} diff --git a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/domain/PvkDokumentRepo.java b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/domain/PvkDokumentRepo.java new file mode 100644 index 000000000..16cf12e72 --- /dev/null +++ b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/domain/PvkDokumentRepo.java @@ -0,0 +1,23 @@ +package no.nav.data.pvk.pvkdokument.domain; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Optional; +import java.util.UUID; + +public interface PvkDokumentRepo extends JpaRepository { + + @Override + @Query(value = "select * from pvk_dokument", + countQuery = "select count(1) from pvk_dokument", + nativeQuery = true) + Page findAll(Pageable pageable); + + + @Query(value = "select * from pvk_dokument where etterlevelse_dokumentasjon_id = ?1", nativeQuery = true) + Optional findByEtterlevelseDokumensjon(String etterlevelseDokumentasjonId); + +} diff --git a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentRequest.java b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentRequest.java index 921e9719c..56a9f9d77 100644 --- a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentRequest.java +++ b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentRequest.java @@ -90,9 +90,9 @@ public PvkDokument convertToPvkDokument() { .build(); return PvkDokument.builder() - .id(UUID.fromString(id)) + .id(id != null ? UUID.fromString(id) : null) .etterlevelseDokumentId(etterlevelseDokumentId) - .status(status) + .status(status != null ? status : PvkDokumentStatus.AKTIV) .pvkDokumentData(pkvDokumentData) .build(); } diff --git a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentResponse.java b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentResponse.java index f60f1631b..6a37deac8 100644 --- a/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentResponse.java +++ b/apps/backend/src/main/java/no/nav/data/pvk/pvkdokument/dto/PvkDokumentResponse.java @@ -7,11 +7,16 @@ import lombok.NoArgsConstructor; import no.nav.data.common.rest.ChangeStampResponse; import no.nav.data.pvk.pvkdokument.domain.OpplysningtypeData; +import no.nav.data.pvk.pvkdokument.domain.PvkDokument; import no.nav.data.pvk.pvkdokument.domain.PvkDokumentStatus; +import no.nav.data.pvk.pvkdokument.domain.YtterligereEgenskaper; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import static java.util.List.copyOf; + @Data @Builder @AllArgsConstructor @@ -26,7 +31,7 @@ public class PvkDokumentResponse { private String etterlevelseDokumentId; private PvkDokumentStatus status; - private List ytterligereEgenskaper; + private List ytterligereEgenskaper; private boolean skalUtforePvk; private String pvkVurderingsBegrunnelse; private boolean stemmerOpplysningstypene; @@ -42,4 +47,33 @@ public class PvkDokumentResponse { private boolean harDatabehandlerRepresentantInvolvering; private String dataBehandlerRepresentantInvolveringBeskrivelse; + + public static PvkDokumentResponse buildFrom(PvkDokument pvkDokument) { + return PvkDokumentResponse.builder() + .id(pvkDokument.getId()) + .changeStamp(ChangeStampResponse.builder() + .createdDate(pvkDokument.getCreatedDate() == null ? LocalDateTime.now() : pvkDokument.getCreatedDate()) + .lastModifiedBy(pvkDokument.getLastModifiedBy()) + .lastModifiedDate(pvkDokument.getLastModifiedDate() == null ? LocalDateTime.now() : pvkDokument.getLastModifiedDate()) + .build()) + .version(pvkDokument.getVersion()) + .etterlevelseDokumentId(pvkDokument.getEtterlevelseDokumentId()) + .status(pvkDokument.getStatus()) + + .ytterligereEgenskaper(copyOf(pvkDokument.getPvkDokumentData().getYtterligereEgenskaper())) + .skalUtforePvk(pvkDokument.getPvkDokumentData().isSkalUtforePvk()) + .pvkVurderingsBegrunnelse(pvkDokument.getPvkDokumentData().getPvkVurderingsBegrunnelse()) + .stemmerOpplysningstypene(pvkDokument.getPvkDokumentData().isStemmerOpplysningstypene()) + .opplysningtypeData(copyOf(pvkDokument.getPvkDokumentData().getOpplysningtypeData())) + .tilgangsBeskrivelseForOpplysningstyper(pvkDokument.getPvkDokumentData().getTilgangsBeskrivelseForOpplysningstyper()) + .lagringsBeskrivelseForOpplysningstyper(pvkDokument.getPvkDokumentData().getLagringsBeskrivelseForOpplysningstyper()) + .stemmerPersonkategorier(pvkDokument.getPvkDokumentData().isStemmerPersonkategorier()) + .harInvolvertRepresentant(pvkDokument.getPvkDokumentData().isHarInvolvertRepresentant()) + .representantInvolveringsBeskrivelse(pvkDokument.getPvkDokumentData().getRepresentantInvolveringsBeskrivelse()) + .stemmerDatabehandlere(pvkDokument.getPvkDokumentData().isStemmerDatabehandlere()) + .harDatabehandlerRepresentantInvolvering(pvkDokument.getPvkDokumentData().isHarDatabehandlerRepresentantInvolvering()) + .dataBehandlerRepresentantInvolveringBeskrivelse(pvkDokument.getPvkDokumentData().getDataBehandlerRepresentantInvolveringBeskrivelse()) + .build(); + } + }