From f27b1ab679c1cb07b4efa1b8f9a0b918dd5ec2ef Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Wed, 12 Jan 2022 14:13:20 +0200 Subject: [PATCH] changes to dossier changes endpoint --- .../dossier/DossierChange.java | 15 ++++++++++ .../v1/api/resources/DossierResource.java | 5 ++-- .../DossierPersistenceService.java | 29 +++++++++++++++++-- .../repository/DossierRepository.java | 6 +++- .../repository/FileRepository.java | 5 ++-- .../server/controller/DossierController.java | 9 ++---- .../v1/server/service/DossierService.java | 4 ++- .../server/integration/tests/DossierTest.java | 7 +++++ .../v1/server/integration/tests/FileTest.java | 7 +++++ 9 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java new file mode 100644 index 000000000..8d05eb136 --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; + +import lombok.*; + +@Data +@Builder +@EqualsAndHashCode(of="dossierId") +@NoArgsConstructor +@AllArgsConstructor +public class DossierChange { + + private String dossierId; + private boolean dossierChanges; + private boolean fileChanges; +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java index fc4b05f7a..a8b1d891f 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java @@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.service.v1.api.resources; import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -26,12 +27,12 @@ public interface DossierResource { String INCLUDE_DELETED_PARAM = "includeDeleted"; - String CHANGES_PATH = "/has-changes"; + String CHANGES_PATH = "/changes"; @ResponseBody @ResponseStatus(value = HttpStatus.OK) @PostMapping(value = REST_PATH + CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive hasChangesSince(@RequestBody JSONPrimitive since); + Set changesSince(@RequestBody JSONPrimitive since); @PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index fadf814db..dc7acb5d6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -8,6 +8,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; @@ -16,7 +17,9 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -62,7 +65,11 @@ public class DossierPersistenceService { dossier.getReportTemplates().forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId()))); var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds()); - reportTemplates.forEach(r -> {if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) {r.getDossiers().add(dossier);}}); + reportTemplates.forEach(r -> { + if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) { + r.getDossiers().add(dossier); + } + }); dossier.setReportTemplates(reportTemplates); }); @@ -110,7 +117,23 @@ public class DossierPersistenceService { dossierRepository.markDossierAsDeleted(dossierId, DossierStatus.DELETED, softDeletedTime, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); } - public boolean hasChangesSince(OffsetDateTime since) { - return dossierRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS)) || fileRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS)); + public Set hasChangesSince(OffsetDateTime since) { + + var dossiersWithChanges = dossierRepository.findDossierChangeByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS)); + var dossiersWithChangedFiles = fileRepository.findDossierChangeByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS)); + + Set dossierChanges = new HashSet<>(); + + for (var dossierId : dossiersWithChanges) { + var dossierChange = new DossierChange(dossierId, true, dossiersWithChangedFiles.contains(dossierId)); + dossierChanges.add(dossierChange); + } + + for (var dossierId : dossiersWithChangedFiles) { + var dossierChange = new DossierChange(dossierId, dossiersWithChanges.contains(dossierId), true); + dossierChanges.add(dossierChange); + } + + return dossierChanges; } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index d0da0ce50..23ea14f2b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -1,15 +1,20 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import java.time.OffsetDateTime; +import java.util.List; public interface DossierRepository extends JpaRepository { + @Query("select d.id from DossierEntity d where d.lastUpdated > :since") + List findDossierChangeByLastUpdatedIsAfter(OffsetDateTime since); + @Modifying @Query("update DossierEntity d set d.status = :dossierStatus, d.hardDeletedTime = :hardDeletedTime, d.lastUpdated = :lastUpdated," + " d.softDeletedTime = " + @@ -29,6 +34,5 @@ public interface DossierRepository extends JpaRepository @Query("update DossierEntity d set d.status = :dossierStatus, d.softDeletedTime = :softDeletedTime, d.lastUpdated = :lastUpdated where d.id = :dossierId") void markDossierAsDeleted(String dossierId, DossierStatus dossierStatus, OffsetDateTime softDeletedTime, OffsetDateTime lastUpdated); - boolean existsByLastUpdatedIsAfter(OffsetDateTime since); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index 63adde14e..8ed3e2697 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; import org.springframework.data.jpa.repository.JpaRepository; @@ -16,8 +17,6 @@ public interface FileRepository extends JpaRepository { boolean existsByDossierIdAndLastUpdatedIsAfter(String dossierId, OffsetDateTime since); - boolean existsByLastUpdatedIsAfter(OffsetDateTime since); - List findByDossierId(String dossierId); @Modifying @@ -121,6 +120,8 @@ public interface FileRepository extends JpaRepository { @Query("select count(f) from FileEntity f where f.dossierId = :dossierId and f.deleted is not null and f.hardDeletedTime is null") int countSoftDeletedFiles(String dossierId); + @Query("select distinct f.dossierId from FileEntity f where f.lastUpdated > :since") + List findDossierChangeByLastUpdatedIsAfter(OffsetDateTime since); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java index f2c144543..095fcc441 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java @@ -8,10 +8,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.*; import com.iqser.red.service.persistence.service.v1.api.resources.DossierResource; import feign.Param; import lombok.RequiredArgsConstructor; @@ -39,9 +36,9 @@ public class DossierController implements DossierResource { @Override - public JSONPrimitive hasChangesSince(@RequestBody JSONPrimitive since) { + public Set changesSince(@RequestBody JSONPrimitive since) { - return JSONPrimitive.of(dossierService.hasChangesSince(since.getValue())); + return dossierService.changesSince(since.getValue()); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java index 613758efb..b47aeaa73 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java @@ -8,12 +8,14 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.OffsetDateTime; import java.util.List; +import java.util.Set; /** * Provides the internal interface between dossier request and the actual persistence. @@ -108,7 +110,7 @@ public class DossierService { return dossierPersistenceService.findAllDossiers(); } - public boolean hasChangesSince(OffsetDateTime since) { + public Set changesSince(OffsetDateTime since) { return dossierPersistenceService.hasChangesSince(since); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java index 919ca1ee2..3e30ca6c5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java @@ -3,8 +3,10 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.time.OffsetDateTime; import java.util.List; +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import org.junit.Test; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -35,12 +37,17 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { @Test public void testDossier() { + var start = OffsetDateTime.now(); + var dossier = dossierTesterAndProvider.provideTestDossier(); var allDossiers = dossierClient.getAllDossiers(); assertThat(allDossiers.size()).isEqualTo(1); assertThat(allDossiers.get(0)).isEqualTo(dossier); + var changes = dossierClient.changesSince(JSONPrimitive.of(start)); + assertThat(changes).isNotEmpty(); + // update CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); cru.setDossierTemplateId(dossier.getId()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java index a26ade59d..c984fa358 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java @@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; import java.util.Collections; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; @@ -101,6 +102,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest { @Test public void testFile() { + var start = OffsetDateTime.now(); var dossier = dossierTesterAndProvider.provideTestDossier(); // update @@ -111,6 +113,11 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var file = fileTesterAndProvider.testAndProvideFile(dossier); + var changes = dossierClient.changesSince(JSONPrimitive.of(start)); + assertThat(changes).isNotEmpty(); + assertThat(changes.iterator().next().isFileChanges()).isTrue(); + assertThat(changes.iterator().next().isDossierChanges()).isTrue(); + assertThat(fileClient.getAllStatuses().size()).isEqualTo(1); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());