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 5c94392d2..5152fb4fe 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 70738739d..166c86fa7 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; @@ -37,17 +61,6 @@ 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 @RequiredArgsConstructor @@ -79,6 +92,7 @@ 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 2bdacf7cf..97ed62780 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; @@ -285,4 +285,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 ec169b9b6..2f5e78f0d 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; @@ -38,6 +38,7 @@ public class DossierTemplatePersistenceService { private final DossierTemplateRepository dossierTemplateRepository; private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; private final RulesPersistenceService rulesPersistenceService; + private final DictionaryPersistenceService dictionaryPersistenceService; private final TypeRepository typeRepository; @@ -227,4 +228,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 883619630..5f4190f74 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 { @@ -69,6 +70,14 @@ public interface TypeRepository extends JpaRepository { List findDictionarySummaryList(@Param("dossierTemplateIds") Set dossierTemplateIds); + @Query(""" + 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""") + 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); 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..7e96b2ace --- /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,168 @@ +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; + +@ExtendWith(SpringExtension.class) +public class DossierTemplateCloneAndExportWithDuplicateRanksTest { + + @MockBean + private DossierTemplateRepository dossierTemplateRepository; + @MockBean + private LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; + @MockBean + private RulesPersistenceService rulesPersistenceService; + @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(dossierTemplateRepository, + legalBasisMappingPersistenceService, + rulesPersistenceService, + dictionaryPersistenceService, + 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 79f4383a8..4109b40a6 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,18 +1,65 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; +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.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; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +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.*; +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.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.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; @@ -31,32 +78,6 @@ 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 java.io.*; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -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; - @SuppressWarnings("PMD") public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @@ -189,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") @@ -227,6 +249,21 @@ 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); 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 + +}