From b43fd35a47a0764e7cf9dbdecdecbb686771692e Mon Sep 17 00:00:00 2001 From: Corina Olariu Date: Mon, 11 Mar 2024 15:37:01 +0200 Subject: [PATCH 1/3] RED-7049 - Wrong error code when adding entity with already existing rank - backport - add a check for duplicate ranks before cloning or exporting a dossier template - added junit tests Signed-off-by: Corina Olariu --- .../service/DossierTemplateCloneService.java | 2 +- .../export/DossierTemplateExportService.java | 39 ++-- .../DictionaryPersistenceService.java | 9 +- .../DossierTemplatePersistenceService.java | 18 +- .../repository/TypeRepository.java | 24 ++- ...eCloneAndExportWithDuplicateRanksTest.java | 171 ++++++++++++++++++ .../tests/DossierTemplateTest.java | 131 +++++++++----- .../dossiertemplate/type/TypeRankSummary.java | 19 ++ 8 files changed, 346 insertions(+), 67 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/TypeRankSummary.java diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index d0acab1b9..999cb45a7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -39,7 +39,6 @@ import com.iqser.red.storage.commons.service.StorageService; import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; import com.knecon.fforesight.tenantcommons.TenantContext; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -77,6 +76,7 @@ public class DossierTemplateCloneService { dossierTemplateRepository.findById(dossierTemplateId).ifPresentOrElse(dossierTemplate -> { + dossierTemplatePersistenceService.validateDossierTemplateForDuplicateRanks(dossierTemplateId); OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); clonedDossierTemplate.setId(UUID.randomUUID().toString()); clonedDossierTemplate.setName(cloneDossierTemplateRequest.getName()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java index 385bcd56e..9370c946a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java @@ -1,5 +1,20 @@ package com.iqser.red.service.persistence.management.v1.processor.service.export; +import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert; + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Service; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -13,7 +28,16 @@ import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJ import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; @@ -32,19 +56,10 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; + import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.stereotype.Service; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; - -import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert; @Slf4j @Service @@ -77,6 +92,8 @@ public class DossierTemplateExportService { var mimeType = "application/zip"; + dossierTemplatePersistenceService.validateDossierTemplateForDuplicateRanks(request.getDossierTemplateId()); + String downloadFilename = request.getDossierTemplateId() + ".zip"; String storageId = StorageIdUtils.getStorageId(request.getUserId(), request.getDossierTemplateId()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java index 594f75bfe..b20076c12 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java @@ -11,7 +11,6 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; @@ -19,6 +18,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -280,4 +280,11 @@ public class DictionaryPersistenceService { return typeRepository.unSoftDeleteTypeById(typeId); } + + public List getTypeRankSummaryList(String dossierTemplateId) { + + return typeRepository.findTypeRankSummaryList(dossierTemplateId); + + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java index bef3a6e94..c20ae7db0 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java @@ -5,9 +5,9 @@ import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; - import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -35,6 +35,7 @@ public class DossierTemplatePersistenceService { public static final String DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE = "DossierTemplate with Id %s not found."; + private final DictionaryPersistenceService dictionaryPersistenceService; private final DossierTemplateRepository dossierTemplateRepository; private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; private final RulesPersistenceService rulesPersistenceService; @@ -225,4 +226,19 @@ public class DossierTemplatePersistenceService { dossierTemplateRepository.saveAndFlush(dossierTemplate); } + + public void validateDossierTemplateForDuplicateRanks(String dossierTemplateId) { + + var duplicateRanks = dictionaryPersistenceService.getTypeRankSummaryList(dossierTemplateId) + .stream() + .filter(t -> t.getTypesCount() > 1) + .collect(Collectors.toList()); + if (!duplicateRanks.isEmpty()) { + String errorMessage = "Duplicate ranks found in dossier template " + dossierTemplateId + "\n" + duplicateRanks.stream() + .map(t -> String.format(" Rank %d has %d entries", t.getRank(), t.getTypesCount())) + .collect(Collectors.joining("\n")); + throw new BadRequestException(errorMessage); + } + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index d4e54dbf9..98917697e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -11,6 +11,7 @@ import org.springframework.data.repository.query.Param; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary; public interface TypeRepository extends JpaRepository { @@ -54,19 +55,30 @@ public interface TypeRepository extends JpaRepository { @Query("select coalesce(sum(t.version), 0) from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.dossierId is null") long getVersionForDossierTemplateId(@Param("dossierTemplateId") String dossierTemplateId); + @Query(""" - select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e)) - from DossierTemplateEntity dt - left join TypeEntity t on t.dossierTemplateId = dt.id - left join DictionaryEntryEntity e on e.typeId = t.id - where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.entryId is null or e.deleted = false) - group by dt.id, t.id, t.type, t.label""") + select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e)) + from DossierTemplateEntity dt + left join TypeEntity t on t.dossierTemplateId = dt.id + left join DictionaryEntryEntity e on e.typeId = t.id + where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.entryId is null or e.deleted = false) + group by dt.id, t.id, t.type, t.label""") List findDictionarySummaryList(@Param("dossierTemplateIds") Set dossierTemplateIds); + + @Query(""" + select new TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) + from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.softDeletedTime is null + group by t.dossierTemplateId, t.dossierId, ¬t.rank + order by t.rank""") + List findTypeRankSummaryList(@Param("dossierTemplateId") String dossierTemplateId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("Update TypeEntity t set t.softDeletedTime = offset_datetime where t.id = :typeId") void softDeleteTypeById(@Param("typeId") String typeId); + @Modifying @Query("Update TypeEntity t set t.softDeletedTime = null where t.id = :typeId and t.softDeletedTime is not null") int unSoftDeleteTypeById(@Param("typeId") String typeId); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java new file mode 100644 index 000000000..52f514bc0 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java @@ -0,0 +1,171 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.management.v1.processor.service.export.DossierTemplateExportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary; +import com.iqser.red.storage.commons.service.StorageService; + +import lombok.SneakyThrows; + +//@DirtiesContext +@ExtendWith(SpringExtension.class) +public class DossierTemplateCloneAndExportWithDuplicateRanksTest { + + @MockBean + private DossierTemplateRepository dossierTemplateRepository; + @MockBean + private LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; + @MockBean + private RulesPersistenceService rulesPersistenceService; + + // private DossierTemplatePersistenceService dossierTemplatePersistenceService; + @MockBean + private DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + @MockBean + private DictionaryPersistenceService dictionaryPersistenceService; + @MockBean + private EntryPersistenceService entryPersistenceService; + @MockBean + private FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + @MockBean + private ReportTemplatePersistenceService reportTemplatePersistenceService; + @MockBean + private ColorsService colorsService; + @MockBean + private StorageService storageService; + @MockBean + private DossierStatusPersistenceService dossierStatusPersistenceService; + @MockBean + private WatermarkService watermarkService; + @MockBean + private FileManagementStorageService fileManagementStorageService; + @MockBean + private DownloadStatusPersistenceService downloadStatusPersistenceService; + @MockBean + private RabbitTemplate rabbitTemplate; + @MockBean + private TypeRepository typeRepository; + + @MockBean + private DossierTemplateImportService dossierTemplateImportService; + + private DossierTemplatePersistenceService dossierTemplatePersistenceService; + private DossierTemplateCloneService dossierTemplateCloneService; + private DossierTemplateExportService dossierTemplateExportService; + + private DossierTemplateManagementService dossierTemplateManagementService; + private String dossierTemplateId = "dossierTemplateId"; + private String dossierTemplateName = "Clone of " + dossierTemplateId; + + + @BeforeEach + public void setupData() { + + dossierTemplatePersistenceService = new DossierTemplatePersistenceService(dictionaryPersistenceService, + dossierTemplateRepository, + legalBasisMappingPersistenceService, + rulesPersistenceService, + typeRepository); + dossierTemplateCloneService = new DossierTemplateCloneService(dossierTemplateRepository, + legalBasisMappingPersistenceService, + rulesPersistenceService, + dossierTemplatePersistenceService, + dossierAttributeConfigPersistenceService, + dictionaryPersistenceService, + entryPersistenceService, + fileAttributeConfigPersistenceService, + reportTemplatePersistenceService, + colorsService, + storageService, + dossierStatusPersistenceService, + watermarkService, + fileManagementStorageService); + dossierTemplateExportService = new DossierTemplateExportService(dossierTemplatePersistenceService, + downloadStatusPersistenceService, + dossierAttributeConfigPersistenceService, + dossierStatusPersistenceService, + dictionaryPersistenceService, + fileAttributeConfigPersistenceService, + legalBasisMappingPersistenceService, + rulesPersistenceService, + fileManagementStorageService, + reportTemplatePersistenceService, + colorsService, + entryPersistenceService, + watermarkService, + rabbitTemplate); + dossierTemplateManagementService = new DossierTemplateManagementService(dossierTemplateExportService, + dossierTemplateImportService, + dossierTemplatePersistenceService, + dossierTemplateCloneService); + + List typesValues = new ArrayList<>(); + TypeRankSummary typeRank1 = new TypeRankSummary(dossierTemplateId, null, 50, 2); + TypeRankSummary typeRank2 = new TypeRankSummary(dossierTemplateId, null, 100, 1); + typesValues.add(typeRank1); + typesValues.add(typeRank2); + when(dictionaryPersistenceService.getTypeRankSummaryList(dossierTemplateId)).thenReturn(typesValues); + + } + + + @Test + @SneakyThrows + public void testDownloadWithDuplicateRanks() { + + // test the export of dossier template + ExportDownloadRequest exportDownloadRequest = new ExportDownloadRequest("userId", dossierTemplateId); + Assertions.assertThrows(BadRequestException.class, () -> dossierTemplateManagementService.prepareExportDownload(exportDownloadRequest)); + + } + + + @Test + @SneakyThrows + public void testCloneDossierTemplateWithDuplicateRanks() { + + CloneDossierTemplateRequest cdtr = CloneDossierTemplateRequest.builder().name(dossierTemplateName).cloningUserId("user").ocrByDefault(true).removeWatermark(false).build(); + DossierTemplateEntity dossierTemplateEntity = new DossierTemplateEntity(); + dossierTemplateEntity.setId(dossierTemplateId); + when(dossierTemplateRepository.existsByName(cdtr.getName())).thenReturn(false); + when(dossierTemplateRepository.findById(dossierTemplateId)).thenReturn(Optional.of(dossierTemplateEntity)); + Assertions.assertThrows(BadRequestException.class, () -> dossierTemplateManagementService.cloneDossierTemplate(dossierTemplateId, cdtr)); + + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java index 3f8e82bc8..637c8296a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java @@ -1,42 +1,18 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Sets; -import com.iqser.red.service.peristence.v1.server.integration.client.*; -import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; -import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.iqser.red.service.persistence.management.v1.processor.service.export.ExportDownloadMessageReceiver; -import com.iqser.red.service.persistence.service.v1.api.shared.model.*; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import feign.FeignException; -import lombok.SneakyThrows; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockMultipartFile; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; -import java.io.*; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -51,9 +27,56 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; +import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttributeConfigClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatusClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient; +import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient; +import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.export.ExportDownloadMessageReceiver; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; + +import feign.FeignException; +import lombok.SneakyThrows; @SuppressWarnings("PMD") public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @@ -187,6 +210,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { public void testCloneDossierTemplate() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); var type = CreateTypeValue.builder() .type("t") @@ -215,10 +239,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .recommendation(false) .caseInsensitive(false) .description("t2.getDescription()") - .addToDictionaryAction(true) - .label("t2.getLabel()") - .hasDictionary(true) - .build(); + .addToDictionaryAction(true).label("t2.getLabel()").hasDictionary(true).build(); var createdType1 = dictionaryClient.addType(type); var createdType2 = dictionaryClient.addType(type2); @@ -226,15 +247,31 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var loadedType1 = dictionaryClient.getDictionaryForType(createdType1.getType(), createdType1.getDossierTemplateId(), null); var loadedType2 = dictionaryClient.getDictionaryForType(createdType2.getType(), createdType2.getDossierTemplateId(), null); + // force types on dossier level + dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), dossier.getId()); + dictionaryClient.getDictionaryForType(type2.getType(), type2.getDossierTemplateId(), dossier.getId()); + + var allTypes = dictionaryClient.getAllTypes(dossierTemplate.getId(), dossier.getId(), false).getTypes(); + assertThat(allTypes.size()).isEqualTo(4); + var typesWithRankOfType1 = allTypes.stream() + .filter(t -> t.getRank() == type.getRank()) + .collect(Collectors.toList()); + assertThat(typesWithRankOfType1.size()).isEqualTo(2); + + var typesWithRankOfType2 = allTypes.stream() + .filter(t -> t.getRank() == type2.getRank()) + .collect(Collectors.toList()); + assertThat(typesWithRankOfType2.size()).isEqualTo(2); + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry1", "entry2"), false, null, DictionaryEntryType.ENTRY); dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry3", "entry4"), false, null, DictionaryEntryType.FALSE_POSITIVE); dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry5", "entry6"), false, null, DictionaryEntryType.FALSE_RECOMMENDATION); dossierAttributeConfigClient.setDossierAttributesConfig(dossierTemplate.getId(), - new DossierAttributesConfig(List.of(DossierAttributeConfig.builder() - .dossierTemplateId(dossierTemplate.getId()) - .editable(false) - .id("dossierAttributeId") + new DossierAttributesConfig(List.of(DossierAttributeConfig.builder() + .dossierTemplateId(dossierTemplate.getId()) + .editable(false) + .id("dossierAttributeId") .label("labelDossierAttribute") .type(DossierAttributeType.TEXT) .placeholder("placeholderDossier") diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/TypeRankSummary.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/TypeRankSummary.java new file mode 100644 index 000000000..e6c9db55b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/TypeRankSummary.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TypeRankSummary { + + private String dossierTemplateId; + private String dossierId; + private int rank; + private long typesCount; // number of types with the same rank + +} -- 2.47.2 From aaedac8d12a9b48aa23f357e230e74d0831f8147 Mon Sep 17 00:00:00 2001 From: Corina Olariu Date: Mon, 11 Mar 2024 15:52:52 +0200 Subject: [PATCH 2/3] RED-7049 - Wrong error code when adding entity with already existing rank - backport - fix query Signed-off-by: Corina Olariu --- .../service/persistence/repository/TypeRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index 98917697e..fc41e352a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -67,7 +67,7 @@ public interface TypeRepository extends JpaRepository { @Query(""" - select new TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) + select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.softDeletedTime is null group by t.dossierTemplateId, t.dossierId, ¬t.rank order by t.rank""") -- 2.47.2 From 13733a497a350be2186efff72be4bc15b926e9aa Mon Sep 17 00:00:00 2001 From: Corina Olariu Date: Mon, 11 Mar 2024 21:27:58 +0200 Subject: [PATCH 3/3] RED-7049 - Wrong error code when adding entity with already existing rank - backport - fix query Signed-off-by: Corina Olariu --- .../service/persistence/repository/TypeRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index fc41e352a..9a48daf5e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -67,9 +67,9 @@ public interface TypeRepository extends JpaRepository { @Query(""" - select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) + select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary(t.dossierTemplateId, t.dossierId, t.rank, count(t)) from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.softDeletedTime is null - group by t.dossierTemplateId, t.dossierId, ¬t.rank + group by t.dossierTemplateId, t.dossierId, t.rank order by t.rank""") List findTypeRankSummaryList(@Param("dossierTemplateId") String dossierTemplateId); -- 2.47.2