From ba37f0eed1d9f4c77a4c42888371c451d1d0af47 Mon Sep 17 00:00:00 2001 From: aoezyetimoglu Date: Thu, 17 Mar 2022 14:58:24 +0100 Subject: [PATCH 1/2] RED-3246: As an admin I want to clone a dossier template --- .../DossierTemplatePersistenceService.java | 139 ++++++++++++- .../tests/DossierTemplateTest.java | 186 +++++++++++++++--- 2 files changed, 298 insertions(+), 27 deletions(-) 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 33d83c0bc..cd58c9e27 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 @@ -1,7 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.io.IOException; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,13 +15,25 @@ import javax.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; 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.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource; +import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; @@ -30,10 +46,18 @@ public class DossierTemplatePersistenceService { private final DossierTemplateRepository dossierTemplateRepository; private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; private final RulesPersistenceService rulesPersistenceService; + private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + private final DictionaryPersistenceService dictionaryPersistenceService; + private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + private final ReportTemplatePersistenceService reportTemplatePersistenceService; + private final WatermarkService watermarkService; + private final ColorsService colorsService; + private final StorageService storageService; @Transactional public DossierTemplateEntity createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest createOrUpdateDossierRequest) { + if (createOrUpdateDossierRequest.getDossierTemplateId() != null) { Optional dossierTemplate = dossierTemplateRepository.findById(createOrUpdateDossierRequest.getDossierTemplateId()); if (dossierTemplate.isPresent()) { @@ -70,6 +94,7 @@ public class DossierTemplatePersistenceService { private DossierTemplateStatus computeDossierTemplateStatus(DossierTemplateEntity dossierTemplate) { + var legalBasis = legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId()); if (legalBasis == null || legalBasis.isEmpty()) { return DossierTemplateStatus.INCOMPLETE; @@ -91,6 +116,7 @@ public class DossierTemplatePersistenceService { public void validateDossierTemplateNameIsUnique(String templateName) { + getAllDossierTemplates().forEach(existing -> { if (existing.getName().equals(templateName)) { throw new ConflictException("DossierTemplate name must be unique"); @@ -98,6 +124,7 @@ public class DossierTemplatePersistenceService { }); } + public List getAllDossierTemplates() { var allDossierTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse(); @@ -106,15 +133,20 @@ public class DossierTemplatePersistenceService { return allDossierTemplates; } + public DossierTemplateEntity getDossierTemplate(String dossierTemplateId) { - var dossierTemplate = dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId).orElseThrow(() -> new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId))); + + var dossierTemplate = dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId) + .orElseThrow(() -> new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId))); dossierTemplate.setDossierTemplateStatus(computeDossierTemplateStatus(dossierTemplate)); return dossierTemplate; } + @Transactional public void deleteDossierTemplate(String dossierTemplateId, String deletingUserId) { + dossierTemplateRepository.findById(dossierTemplateId).ifPresentOrElse((dossierTemplate) -> { var hasNonDeletedDossiers = dossierTemplate.getDossiers().stream().anyMatch(template -> template.getHardDeletedTime() == null); @@ -139,18 +171,117 @@ public class DossierTemplatePersistenceService { DossierTemplateEntity clonedDossierTemplate = new DossierTemplateEntity(); dossierTemplateRepository.findById(dossierTemplateId).ifPresentOrElse((dossierTemplate) -> { - BeanUtils.copyProperties(dossierTemplate, clonedDossierTemplate); + OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); clonedDossierTemplate.setId(UUID.randomUUID().toString()); clonedDossierTemplate.setName(nameOfClonedDossierTemplate); - clonedDossierTemplate.setCreatedBy(cloningUserId); - clonedDossierTemplate.setModifiedBy(cloningUserId); + clonedDossierTemplate.setDescription(dossierTemplate.getDescription()); clonedDossierTemplate.setDateAdded(now); clonedDossierTemplate.setDateModified(now); + clonedDossierTemplate.setCreatedBy(cloningUserId); + clonedDossierTemplate.setModifiedBy(cloningUserId); + clonedDossierTemplate.setValidFrom(dossierTemplate.getValidFrom()); + clonedDossierTemplate.setValidTo(dossierTemplate.getValidTo()); + clonedDossierTemplate.setSoftDeleteTime(dossierTemplate.getSoftDeleteTime()); + clonedDossierTemplate.setDownloadFileTypes(dossierTemplate.getDownloadFileTypes()); + + //set rules + rulesPersistenceService.setRules(rulesPersistenceService.getRules(dossierTemplate.getId()).getValue(), clonedDossierTemplate.getId()); + //set legal basis + legalBasisMappingPersistenceService.setLegalBasisMapping(clonedDossierTemplate.getId(), convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId()), LegalBasis.class)); + clonedDossierTemplate.setDossierTemplateStatus(DossierTemplateStatus.valueOf(computeDossierTemplateStatus(clonedDossierTemplate).name())); dossierTemplateRepository.save(clonedDossierTemplate); + //set dictionaries + List clonedTypes = new ArrayList<>(); + var types = dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplate.getId()); + for (TypeEntity t : types) { + TypeEntity te = dictionaryPersistenceService.addType(t.getType(), clonedDossierTemplate.getId(), t.getHexColor(), t.getRecommendationHexColor(), t.getRank(), t.isHint(), t.isCaseInsensitive(), t.isRecommendation(), t.getDescription(), t.isAddToDictionaryAction(), t.getLabel(), null); + te.setDossierTemplateId(clonedDossierTemplate.getId()); + clonedTypes.add(te); + } + clonedDossierTemplate.setDossierTypes(clonedTypes); + + //set dossier attributes + var dossierAttributesConfig = dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplate.getId()); + List dacList = new ArrayList<>(); + dossierAttributesConfig.forEach(dossierAttributeConfigEntity -> { + var dac = DossierAttributeConfigEntity.builder() + .label(dossierAttributeConfigEntity.getLabel()) + .editable(dossierAttributeConfigEntity.isEditable()) + .placeholder(dossierAttributeConfigEntity.getPlaceholder()) + .type(dossierAttributeConfigEntity.getType()) + .build(); + dacList.add(dac); + }); + dossierAttributeConfigPersistenceService.setDossierAttributesConfig(clonedDossierTemplate.getId(), dacList); + + //set file attributes + var fileAttributesGeneralConfig = fileAttributeConfigPersistenceService.getFileAttributesGeneralConfiguration(dossierTemplate.getId()); + var fagc = FileAttributesGeneralConfigurationEntity.builder() + .dossierTemplateId(clonedDossierTemplate.getId()) + .delimiter(fileAttributesGeneralConfig.getDelimiter()) + .filenameMappingColumnHeaderName(fileAttributesGeneralConfig.getFilenameMappingColumnHeaderName()) + .build(); + fileAttributeConfigPersistenceService.setFileAttributesGeneralConfig(clonedDossierTemplate.getId(), fagc); + + var fileAttributesConfig = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplate.getId()); + List facList = new ArrayList<>(); + fileAttributesConfig.forEach(fileAttributeConfigEntity -> { + var fac = FileAttributeConfigEntity.builder() + .csvColumnHeader(fileAttributeConfigEntity.getCsvColumnHeader()) + .label(fileAttributeConfigEntity.getLabel()) + .primaryAttribute(fileAttributeConfigEntity.isPrimaryAttribute()) + .editable(fileAttributeConfigEntity.isEditable()) + .filterable(fileAttributeConfigEntity.isFilterable()) + .displayedInFileList(fileAttributeConfigEntity.isDisplayedInFileList()) + .placeholder(fileAttributeConfigEntity.getPlaceholder()) + .type(fileAttributeConfigEntity.getType()) + .build(); + facList.add(fac); + }); + fileAttributeConfigPersistenceService.setFileAttributesConfig(clonedDossierTemplate.getId(), facList); + clonedDossierTemplate.setFileAttributeConfigs(fileAttributeConfigPersistenceService.getFileAttributes(clonedDossierTemplate.getId())); + + //set report templates + var reportTemplates = dossierTemplate.getReportTemplates(); + for (ReportTemplateEntity rte : reportTemplates) { + var storedReportTemplate = storageService.getObject(rte.getStorageId()); + String storageId = clonedDossierTemplate.getId() + "/" + rte.getFileName(); + String templateId = UUID.randomUUID().toString(); + try { + storageService.storeObject(storageId, storedReportTemplate.getInputStream()); + } catch (IOException e) { + throw new ConflictException("Could not clone dossier template."); + } + reportTemplatePersistenceService.insert(clonedDossierTemplate.getId(), templateId, storageId, rte.getFileName(), rte.isActiveByDefault(), rte.isMultiFileReport()); + } + clonedDossierTemplate.setReportTemplates(reportTemplatePersistenceService.findByDossierTemplateId(clonedDossierTemplate.getId())); + + //set watermarks + var watermark = watermarkService.getWatermark(dossierTemplate.getId()); + WatermarkEntity we = WatermarkEntity.builder() + .dossierTemplateId(clonedDossierTemplate.getId()) + .text(watermark.getText()) + .hexColor(watermark.getHexColor()) + .opacity(watermark.getOpacity()) + .fontType(watermark.getFontType()) + .fontSize(watermark.getFontSize()) + .orientation(watermark.getOrientation()) + .build(); + watermarkService.saveWatermark(clonedDossierTemplate.getId(), we); + + //set colors + var colors = colorsService.getColors(dossierTemplate.getId()); + var clonedColors = new ColorsEntity(); + BeanUtils.copyProperties(colors, clonedColors); + clonedColors.setDossierTemplateId(clonedDossierTemplate.getId()); + colorsService.saveColors(clonedColors); + + dossierTemplateRepository.save(clonedDossierTemplate); + }, () -> { throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)); }); 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 0705a649b..52231e876 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,26 +1,62 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; -import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; -import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient; -import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient; -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.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; - -import feign.FeignException; -import org.junit.Test; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; +import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +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.DossierTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient; +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.entity.configuration.ColorsEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +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.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; + +import feign.FeignException; public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @@ -36,6 +72,22 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @Autowired private DossierClient dossierClient; + @Autowired + private DictionaryClient dictionaryClient; + + @Autowired + private DossierAttributeConfigClient dossierAttributeConfigClient; + + @Autowired + private FileAttributeConfigClient fileAttributeConfigClient; + + @Autowired + private ReportTemplateClient reportTemplateClient; + + @Autowired + private WatermarkClient watermarkClient; + + @Test public void testDossierTemplate() { @@ -45,7 +97,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(allTemplates.size()).isEqualTo(1); assertThat(allTemplates.get(0)).isEqualTo(dossierTemplate); - // update CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); cru.setDossierTemplateId(dossierTemplate.getId()); @@ -55,7 +106,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru); assertThat(updated.getName()).isEqualTo("Template 1 Update"); - var loadedTemplate = dossierTemplateClient.getDossierTemplate(dossierTemplate.getId()); assertThat(loadedTemplate).isEqualTo(updated); @@ -68,9 +118,9 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var testDossier = dossierTesterAndProvider.provideTestDossier(updated); - try{ + try { dossierTemplateClient.deleteDossierTemplate(updated.getId(), "1"); - }catch (FeignException e){ + } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } @@ -82,7 +132,8 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @Test(expected = FeignException.class) - public void testDossierTemplateUniqueNameConflict(){ + public void testDossierTemplateUniqueNameConflict() { + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var dossierTemplate2 = dossierTemplateTesterAndProvider.provideTestTemplate(); } @@ -90,8 +141,91 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @Test public void testCloneDossierTemplate() { + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + Type type = Type.builder() + .id("t.id") + .type("t.getType()") + .dossierTemplateId(dossierTemplate.getId()) + .hexColor("#ddddd") + .recommendationHexColor("#cccccc") + .rank(999) + .isHint(false) + .isRecommendation(false) + .isCaseInsensitive(false) + .description("t.getDescription()") + .addToDictionaryAction(true) + .label("t.getLabel()") + .dossierId(null) + .version(23) + .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t.getType()").build())) + .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2001).value("dictEntry2").version(23).deleted(false).typeId("t.getType()").build())) + .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3001).value("dictEntry3").version(23).deleted(false).typeId("t.getType()").build())) + .build(); + dictionaryClient.addType(type); + dossierAttributeConfigClient.setDossierAttributesConfig(dossierTemplate.getId(), List.of(DossierAttributeConfig.builder() + .dossierTemplateId(dossierTemplate.getId()) + .editable(false) + .id("dossierAttributeId") + .label("labelDossierAttribute") + .type(DossierAttributeType.TEXT) + .placeholder("placeholderDossier") + .build())); + fileAttributeConfigClient.setFileAttributesGeneralConfig(dossierTemplate.getId(), FileAttributesGeneralConfiguration.builder() + .dossierTemplateId(dossierTemplate.getId()) + .delimiter("") + .filenameMappingColumnHeaderName("filenameMappingColumnHeaderName") + .build()); + fileAttributeConfigClient.setFileAttributesConfig(dossierTemplate.getId(), List.of(FileAttributeConfig.builder() + .dossierTemplateId(dossierTemplate.getId()) + .primaryAttribute(true) + .csvColumnHeader("12345") + .displayedInFileList(false) + .editable(false) + .filterable(false) + .id("fileAttributeId") + .label("labelFileAttribute") + .type(FileAttributeType.TEXT) + .placeholder("placeholderFile") + .build())); + ReportTemplateEntity rte = ReportTemplateEntity.builder() + .templateId("templateId") + .dossierTemplate(convert(dossierTemplate, DossierTemplateEntity.class)) + .dossierTemplateId(dossierTemplate.getId()) + .dossiers(null) + .activeByDefault(false) + .fileName("rte") + .multiFileReport(false) + .storageId("storageId") + .uploadDate(OffsetDateTime.now()) + .build(); + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder().template("some text".getBytes(StandardCharsets.UTF_8)).dossierTemplateId(dossierTemplate.getId()).fileName("Report Template").activeByDefault(true).multiFileReport(false).build()); + watermarkClient.saveWatermark(dossierTemplate.getId(), Watermark.builder() + .dossierTemplateId(dossierTemplate.getId()) + .fontSize(10) + .fontType("Arial") + .text("watermark") + .hexColor("#123456") + .opacity(1) + .orientation(WatermarkOrientation.HORIZONTAL) + .build()); + var col = Colors.builder() + .analysisColor("#111111") + .defaultColor("#222222") + .dossierTemplateId(dossierTemplate.getId()) + .dictionaryRequestColor("#333333") + .requestAdd("#444444") + .ignoredHintColor("#555555") + .requestRemove("#666666") + .requestRemove("#777777") + .notRedacted("#888888") + .previewColor("#999999") + .updatedColor("#aaaaaa") + .manualRedactionColor("#bbbbbb") + .build(); + dictionaryClient.setColors(dossierTemplate.getId(), col); + var allTemplates = dossierTemplateClient.getAllDossierTemplates(); assertThat(allTemplates.size()).isEqualTo(1); assertThat(allTemplates.get(0)).isEqualTo(dossierTemplate); @@ -100,7 +234,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(clonedDT.getName()).isEqualTo("Clone of " + dossierTemplate.getName()); var loadedTemplate = dossierTemplateClient.getDossierTemplate(clonedDT.getId()); - assertThat(loadedTemplate).isEqualTo(clonedDT); assertThat(loadedTemplate.getId()).isEqualTo(clonedDT.getId()); assertThat(loadedTemplate.getDescription()).isEqualTo(dossierTemplate.getDescription()); assertThat(loadedTemplate.getValidFrom()).isEqualTo(dossierTemplate.getValidFrom()); @@ -108,6 +241,13 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(loadedTemplate.getDownloadFileTypes()).isEqualTo(dossierTemplate.getDownloadFileTypes()); assertThat(loadedTemplate.getModifiedBy()).isEqualTo("user"); assertThat(loadedTemplate.getCreatedBy()).isEqualTo("user"); + + assertThat(dossierAttributeConfigClient.getDossierAttributes(dossierTemplate.getId()).get(0).getLabel()).isEqualTo(dossierAttributeConfigClient.getDossierAttributes(clonedDT.getId()).get(0).getLabel()); + assertThat(fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()).get(0).getCsvColumnHeader()).isEqualTo(fileAttributeConfigClient.getFileAttributeConfigs(clonedDT.getId()).get(0).getCsvColumnHeader()); + assertThat(fileAttributeConfigClient.getFileAttributesGeneralConfig(dossierTemplate.getId()).getFilenameMappingColumnHeaderName()).isEqualTo(fileAttributeConfigClient.getFileAttributesGeneralConfig(clonedDT.getId()).getFilenameMappingColumnHeaderName()); + assertThat(reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).get(0).getFileName()).isEqualTo(reportTemplateClient.getAvailableReportTemplates(clonedDT.getId()).get(0).getFileName()); + assertThat(watermarkClient.getWatermark(dossierTemplate.getId()).getText()).isEqualTo(watermarkClient.getWatermark(clonedDT.getId()).getText()); + assertThat(dictionaryClient.getColors(dossierTemplate.getId()).getRequestAdd()).isEqualTo(dictionaryClient.getColors(clonedDT.getId()).getRequestAdd()); } } From 99bfa5510b0dbd3e712d8443286d9e57d23e29e3 Mon Sep 17 00:00:00 2001 From: aoezyetimoglu Date: Fri, 18 Mar 2022 14:04:49 +0100 Subject: [PATCH 2/2] RED-3246: As an admin I want to clone a dossier template --- .../service/DossierTemplateCloneService.java | 237 ++++++++++++++++++ .../DossierTemplatePersistenceService.java | 149 +---------- .../controller/DossierTemplateController.java | 4 +- 3 files changed, 241 insertions(+), 149 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.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 new file mode 100644 index 000000000..30ac3a422 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -0,0 +1,237 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; +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.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +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.service.v1.api.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.storage.commons.service.StorageService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DossierTemplateCloneService { + + private final DossierTemplateRepository dossierTemplateRepository; + private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; + private final RulesPersistenceService rulesPersistenceService; + private final DossierTemplatePersistenceService dossierTemplatePersistenceService; + private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + private final DictionaryPersistenceService dictionaryPersistenceService; + private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + private final ReportTemplatePersistenceService reportTemplatePersistenceService; + private final WatermarkService watermarkService; + private final ColorsService colorsService; + private final StorageService storageService; + + + public DossierTemplateEntity cloneDossierTemplate(String dossierTemplateId, String nameOfClonedDossierTemplate, String cloningUserId) { + + dossierTemplatePersistenceService.validateDossierTemplateNameIsUnique(nameOfClonedDossierTemplate); + + DossierTemplateEntity clonedDossierTemplate = new DossierTemplateEntity(); + + dossierTemplateRepository.findById(dossierTemplateId).ifPresentOrElse((dossierTemplate) -> { + + OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); + clonedDossierTemplate.setId(UUID.randomUUID().toString()); + clonedDossierTemplate.setName(nameOfClonedDossierTemplate); + clonedDossierTemplate.setDescription(dossierTemplate.getDescription()); + clonedDossierTemplate.setDateAdded(now); + clonedDossierTemplate.setDateModified(now); + clonedDossierTemplate.setCreatedBy(cloningUserId); + clonedDossierTemplate.setModifiedBy(cloningUserId); + clonedDossierTemplate.setValidFrom(dossierTemplate.getValidFrom()); + clonedDossierTemplate.setValidTo(dossierTemplate.getValidTo()); + clonedDossierTemplate.setSoftDeleteTime(dossierTemplate.getSoftDeleteTime()); + clonedDossierTemplate.setDownloadFileTypes(dossierTemplate.getDownloadFileTypes()); + + //set rules + cloneRules(dossierTemplate.getId(), clonedDossierTemplate.getId()); + //set legal basis + cloneLegalBasisMapping(dossierTemplate.getId(), clonedDossierTemplate.getId()); + + clonedDossierTemplate.setDossierTemplateStatus(DossierTemplateStatus.valueOf(dossierTemplatePersistenceService.computeDossierTemplateStatus(clonedDossierTemplate) + .name())); + dossierTemplateRepository.save(clonedDossierTemplate); + + //set dictionaries + clonedDossierTemplate.setDossierTypes(cloneDictionaries(dossierTemplate.getId(), clonedDossierTemplate.getId())); + + //set dossier attributes + cloneDossierAttributesConfig(dossierTemplate.getId(), clonedDossierTemplate.getId()); + + //set file attributes + cloneFileAttributesGeneralConfig(dossierTemplate.getId(), clonedDossierTemplate.getId()); + + clonedDossierTemplate.setFileAttributeConfigs(cloneFileAttributesConfig(dossierTemplate.getId(), clonedDossierTemplate.getId())); + + //set report templates + clonedDossierTemplate.setReportTemplates(cloneReportTemplates(dossierTemplate, clonedDossierTemplate.getId())); + + //set watermarks + cloneWatermark(dossierTemplate.getId(), clonedDossierTemplate.getId()); + + //set colors + cloneColors(dossierTemplate.getId(), clonedDossierTemplate.getId()); + + dossierTemplateRepository.save(clonedDossierTemplate); + + }, () -> { + throw new NotFoundException(String.format(dossierTemplatePersistenceService.DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)); + }); + return clonedDossierTemplate; + } + + + private void cloneRules(String dossierTemplateId, String clonedDossierTemplateId) { + + rulesPersistenceService.setRules(rulesPersistenceService.getRules(dossierTemplateId).getValue(), clonedDossierTemplateId); + } + + + private void cloneLegalBasisMapping(String dossierTemplateId, String clonedDossierTemplateId) { + + legalBasisMappingPersistenceService.setLegalBasisMapping(clonedDossierTemplateId, convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class)); + } + + + private List cloneDictionaries(String dossierTemplateId, String clonedDossierTemplateId) { + + List clonedTypes = new ArrayList<>(); + var types = dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplateId); + for (TypeEntity t : types) { + TypeEntity te = dictionaryPersistenceService.addType(t.getType(), clonedDossierTemplateId, t.getHexColor(), t.getRecommendationHexColor(), t.getRank(), t.isHint(), t.isCaseInsensitive(), t.isRecommendation(), t.getDescription(), t.isAddToDictionaryAction(), t.getLabel(), null); + te.setDossierTemplateId(clonedDossierTemplateId); + clonedTypes.add(te); + } + return clonedTypes; + } + + + private void cloneDossierAttributesConfig(String dossierTemplateId, String clonedDossierTemplateId) { + + List dacList = new ArrayList<>(); + var dossierAttributesConfig = dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplateId); + dossierAttributesConfig.forEach(dossierAttributeConfigEntity -> { + var dac = DossierAttributeConfigEntity.builder() + .label(dossierAttributeConfigEntity.getLabel()) + .editable(dossierAttributeConfigEntity.isEditable()) + .placeholder(dossierAttributeConfigEntity.getPlaceholder()) + .type(dossierAttributeConfigEntity.getType()) + .build(); + dacList.add(dac); + }); + dossierAttributeConfigPersistenceService.setDossierAttributesConfig(clonedDossierTemplateId, dacList); + } + + + private void cloneFileAttributesGeneralConfig(String dossierTemplateId, String clonedDossierTemplateId) { + + var fileAttributesGeneralConfig = fileAttributeConfigPersistenceService.getFileAttributesGeneralConfiguration(dossierTemplateId); + var fagc = FileAttributesGeneralConfigurationEntity.builder() + .dossierTemplateId(clonedDossierTemplateId) + .delimiter(fileAttributesGeneralConfig.getDelimiter()) + .filenameMappingColumnHeaderName(fileAttributesGeneralConfig.getFilenameMappingColumnHeaderName()) + .build(); + fileAttributeConfigPersistenceService.setFileAttributesGeneralConfig(clonedDossierTemplateId, fagc); + } + + + private List cloneFileAttributesConfig(String dossierTemplateId, String clonedDossierTemplateId) { + + List facList = new ArrayList<>(); + var fileAttributesConfig = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId); + fileAttributesConfig.forEach(fileAttributeConfigEntity -> { + var fac = FileAttributeConfigEntity.builder() + .csvColumnHeader(fileAttributeConfigEntity.getCsvColumnHeader()) + .label(fileAttributeConfigEntity.getLabel()) + .primaryAttribute(fileAttributeConfigEntity.isPrimaryAttribute()) + .editable(fileAttributeConfigEntity.isEditable()) + .filterable(fileAttributeConfigEntity.isFilterable()) + .displayedInFileList(fileAttributeConfigEntity.isDisplayedInFileList()) + .placeholder(fileAttributeConfigEntity.getPlaceholder()) + .type(fileAttributeConfigEntity.getType()) + .build(); + facList.add(fac); + }); + fileAttributeConfigPersistenceService.setFileAttributesConfig(clonedDossierTemplateId, facList); + + return fileAttributeConfigPersistenceService.getFileAttributes(clonedDossierTemplateId); + } + + + private List cloneReportTemplates(DossierTemplateEntity dossierTemplate, String clonedDossierTemplateId) { + + var reportTemplates = dossierTemplate.getReportTemplates(); + for (ReportTemplateEntity rte : reportTemplates) { + var storedReportTemplate = storageService.getObject(rte.getStorageId()); + String storageId = clonedDossierTemplateId + "/" + rte.getFileName(); + String templateId = UUID.randomUUID().toString(); + try { + storageService.storeObject(storageId, storedReportTemplate.getInputStream()); + } catch (IOException e) { + throw new ConflictException("Could not clone report templates of dossier template."); + } + reportTemplatePersistenceService.insert(clonedDossierTemplateId, templateId, storageId, rte.getFileName(), rte.isActiveByDefault(), rte.isMultiFileReport()); + } + return reportTemplatePersistenceService.findByDossierTemplateId(clonedDossierTemplateId); + } + + + private void cloneWatermark(String dossierTemplateId, String clonedDossierTemplateId) { + + var watermark = watermarkService.getWatermark(dossierTemplateId); + WatermarkEntity we = WatermarkEntity.builder() + .dossierTemplateId(clonedDossierTemplateId) + .text(watermark.getText()) + .hexColor(watermark.getHexColor()) + .opacity(watermark.getOpacity()) + .fontType(watermark.getFontType()) + .fontSize(watermark.getFontSize()) + .orientation(watermark.getOrientation()) + .build(); + watermarkService.saveWatermark(clonedDossierTemplateId, we); + } + + + private void cloneColors(String dossierTemplateId, String clonedDossierTemplateId) { + + var colors = colorsService.getColors(dossierTemplateId); + var clonedColors = new ColorsEntity(); + BeanUtils.copyProperties(colors, clonedColors); + clonedColors.setDossierTemplateId(clonedDossierTemplateId); + colorsService.saveColors(clonedColors); + } + +} 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 cd58c9e27..615755a0d 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 @@ -1,11 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.io.IOException; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -15,25 +11,13 @@ import javax.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; 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.ColorsService; -import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource; -import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; @@ -46,13 +30,6 @@ public class DossierTemplatePersistenceService { private final DossierTemplateRepository dossierTemplateRepository; private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; private final RulesPersistenceService rulesPersistenceService; - private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; - private final DictionaryPersistenceService dictionaryPersistenceService; - private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; - private final ReportTemplatePersistenceService reportTemplatePersistenceService; - private final WatermarkService watermarkService; - private final ColorsService colorsService; - private final StorageService storageService; @Transactional @@ -93,7 +70,7 @@ public class DossierTemplatePersistenceService { } - private DossierTemplateStatus computeDossierTemplateStatus(DossierTemplateEntity dossierTemplate) { + public DossierTemplateStatus computeDossierTemplateStatus(DossierTemplateEntity dossierTemplate) { var legalBasis = legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId()); if (legalBasis == null || legalBasis.isEmpty()) { @@ -164,128 +141,4 @@ public class DossierTemplatePersistenceService { } - public DossierTemplateEntity cloneDossierTemplate(String dossierTemplateId, String nameOfClonedDossierTemplate, String cloningUserId) { - - validateDossierTemplateNameIsUnique(nameOfClonedDossierTemplate); - - DossierTemplateEntity clonedDossierTemplate = new DossierTemplateEntity(); - - dossierTemplateRepository.findById(dossierTemplateId).ifPresentOrElse((dossierTemplate) -> { - - OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); - clonedDossierTemplate.setId(UUID.randomUUID().toString()); - clonedDossierTemplate.setName(nameOfClonedDossierTemplate); - clonedDossierTemplate.setDescription(dossierTemplate.getDescription()); - clonedDossierTemplate.setDateAdded(now); - clonedDossierTemplate.setDateModified(now); - clonedDossierTemplate.setCreatedBy(cloningUserId); - clonedDossierTemplate.setModifiedBy(cloningUserId); - clonedDossierTemplate.setValidFrom(dossierTemplate.getValidFrom()); - clonedDossierTemplate.setValidTo(dossierTemplate.getValidTo()); - clonedDossierTemplate.setSoftDeleteTime(dossierTemplate.getSoftDeleteTime()); - clonedDossierTemplate.setDownloadFileTypes(dossierTemplate.getDownloadFileTypes()); - - //set rules - rulesPersistenceService.setRules(rulesPersistenceService.getRules(dossierTemplate.getId()).getValue(), clonedDossierTemplate.getId()); - //set legal basis - legalBasisMappingPersistenceService.setLegalBasisMapping(clonedDossierTemplate.getId(), convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId()), LegalBasis.class)); - - clonedDossierTemplate.setDossierTemplateStatus(DossierTemplateStatus.valueOf(computeDossierTemplateStatus(clonedDossierTemplate).name())); - - dossierTemplateRepository.save(clonedDossierTemplate); - - //set dictionaries - List clonedTypes = new ArrayList<>(); - var types = dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplate.getId()); - for (TypeEntity t : types) { - TypeEntity te = dictionaryPersistenceService.addType(t.getType(), clonedDossierTemplate.getId(), t.getHexColor(), t.getRecommendationHexColor(), t.getRank(), t.isHint(), t.isCaseInsensitive(), t.isRecommendation(), t.getDescription(), t.isAddToDictionaryAction(), t.getLabel(), null); - te.setDossierTemplateId(clonedDossierTemplate.getId()); - clonedTypes.add(te); - } - clonedDossierTemplate.setDossierTypes(clonedTypes); - - //set dossier attributes - var dossierAttributesConfig = dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplate.getId()); - List dacList = new ArrayList<>(); - dossierAttributesConfig.forEach(dossierAttributeConfigEntity -> { - var dac = DossierAttributeConfigEntity.builder() - .label(dossierAttributeConfigEntity.getLabel()) - .editable(dossierAttributeConfigEntity.isEditable()) - .placeholder(dossierAttributeConfigEntity.getPlaceholder()) - .type(dossierAttributeConfigEntity.getType()) - .build(); - dacList.add(dac); - }); - dossierAttributeConfigPersistenceService.setDossierAttributesConfig(clonedDossierTemplate.getId(), dacList); - - //set file attributes - var fileAttributesGeneralConfig = fileAttributeConfigPersistenceService.getFileAttributesGeneralConfiguration(dossierTemplate.getId()); - var fagc = FileAttributesGeneralConfigurationEntity.builder() - .dossierTemplateId(clonedDossierTemplate.getId()) - .delimiter(fileAttributesGeneralConfig.getDelimiter()) - .filenameMappingColumnHeaderName(fileAttributesGeneralConfig.getFilenameMappingColumnHeaderName()) - .build(); - fileAttributeConfigPersistenceService.setFileAttributesGeneralConfig(clonedDossierTemplate.getId(), fagc); - - var fileAttributesConfig = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplate.getId()); - List facList = new ArrayList<>(); - fileAttributesConfig.forEach(fileAttributeConfigEntity -> { - var fac = FileAttributeConfigEntity.builder() - .csvColumnHeader(fileAttributeConfigEntity.getCsvColumnHeader()) - .label(fileAttributeConfigEntity.getLabel()) - .primaryAttribute(fileAttributeConfigEntity.isPrimaryAttribute()) - .editable(fileAttributeConfigEntity.isEditable()) - .filterable(fileAttributeConfigEntity.isFilterable()) - .displayedInFileList(fileAttributeConfigEntity.isDisplayedInFileList()) - .placeholder(fileAttributeConfigEntity.getPlaceholder()) - .type(fileAttributeConfigEntity.getType()) - .build(); - facList.add(fac); - }); - fileAttributeConfigPersistenceService.setFileAttributesConfig(clonedDossierTemplate.getId(), facList); - clonedDossierTemplate.setFileAttributeConfigs(fileAttributeConfigPersistenceService.getFileAttributes(clonedDossierTemplate.getId())); - - //set report templates - var reportTemplates = dossierTemplate.getReportTemplates(); - for (ReportTemplateEntity rte : reportTemplates) { - var storedReportTemplate = storageService.getObject(rte.getStorageId()); - String storageId = clonedDossierTemplate.getId() + "/" + rte.getFileName(); - String templateId = UUID.randomUUID().toString(); - try { - storageService.storeObject(storageId, storedReportTemplate.getInputStream()); - } catch (IOException e) { - throw new ConflictException("Could not clone dossier template."); - } - reportTemplatePersistenceService.insert(clonedDossierTemplate.getId(), templateId, storageId, rte.getFileName(), rte.isActiveByDefault(), rte.isMultiFileReport()); - } - clonedDossierTemplate.setReportTemplates(reportTemplatePersistenceService.findByDossierTemplateId(clonedDossierTemplate.getId())); - - //set watermarks - var watermark = watermarkService.getWatermark(dossierTemplate.getId()); - WatermarkEntity we = WatermarkEntity.builder() - .dossierTemplateId(clonedDossierTemplate.getId()) - .text(watermark.getText()) - .hexColor(watermark.getHexColor()) - .opacity(watermark.getOpacity()) - .fontType(watermark.getFontType()) - .fontSize(watermark.getFontSize()) - .orientation(watermark.getOrientation()) - .build(); - watermarkService.saveWatermark(clonedDossierTemplate.getId(), we); - - //set colors - var colors = colorsService.getColors(dossierTemplate.getId()); - var clonedColors = new ColorsEntity(); - BeanUtils.copyProperties(colors, clonedColors); - clonedColors.setDossierTemplateId(clonedDossierTemplate.getId()); - colorsService.saveColors(clonedColors); - - dossierTemplateRepository.save(clonedDossierTemplate); - - }, () -> { - throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)); - }); - return clonedDossierTemplate; - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java index 64bdfb8da..a184b5e35 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java @@ -1,6 +1,7 @@ package com.iqser.red.service.peristence.v1.server.controller; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; @@ -22,6 +23,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma public class DossierTemplateController implements DossierTemplateResource { private final DossierTemplatePersistenceService dossierTemplatePersistenceService; + private final DossierTemplateCloneService dossierTemplateCloneService; @Override public DossierTemplate createOrUpdateDossierTemplate(@RequestBody CreateOrUpdateDossierTemplateRequest dossierTemplate) { @@ -45,6 +47,6 @@ public class DossierTemplateController implements DossierTemplateResource { @Override public DossierTemplate cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, String nameOfClonedDossierTemplate, String cloningUserId) { - return convert(dossierTemplatePersistenceService.cloneDossierTemplate(dossierTemplateId, nameOfClonedDossierTemplate, cloningUserId), DossierTemplate.class); + return convert(dossierTemplateCloneService.cloneDossierTemplate(dossierTemplateId, nameOfClonedDossierTemplate, cloningUserId), DossierTemplate.class); } }