diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java index 44fae6cbb..c8bd3500f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java @@ -65,6 +65,11 @@ public class FileAttributeConfigPersistenceService { } } + @Transactional + public void updatePrimaryAttribute(String fileAttribute) { + fileAttributeConfigRepository.updatePrimaryAttributeValueToTrue(fileAttribute); + } + public FileAttributesGeneralConfigurationEntity setFileAttributesGeneralConfig(String dossierTemplateId, FileAttributesGeneralConfigurationEntity fileAttributesConfig) { fileAttributesConfig.setDossierTemplateId(dossierTemplateId); fileAttributesConfig.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId)); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributeConfigRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributeConfigRepository.java index a40232d67..b2b15366a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributeConfigRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileAttributeConfigRepository.java @@ -16,6 +16,10 @@ public interface FileAttributeConfigRepository extends JpaRepository findByIdOrDossierTemplateIdAndLabel(String dossierTemplateId, String fileAttributeId, String label); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java index 9e1960de1..487bd42ca 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java @@ -26,6 +26,7 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.im import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -73,6 +74,8 @@ public class DossierTemplateImportService { private final ReportTemplateService reportTemplateService; private final DictionaryService dictionaryService; private final EntryPersistenceService entryPersistenceService; + private final ReportTemplatePersistenceService reportTemplatePersistenceService; + private final StorageService storageService; private final ObjectMapper objectMapper = new ObjectMapper(); public String importDossierTemplate(@RequestBody ImportDossierTemplateRequest request) { @@ -155,6 +158,26 @@ public class DossierTemplateImportService { this.deleteTypes(currentTypes, new HashSet<>()); } + //set report templates + var existingReports = reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplateId); + + List reportsUpdated = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(request.getReportTemplateUploadRequests())) { + request.getReportTemplateUploadRequests().forEach(reportRequest -> { + reportRequest.setDossierTemplateId(dossierTemplateId); + var report = reportTemplateService.uploadTemplate(reportRequest); + reportsUpdated.add(report.getTemplateId()); + }); + } + // delete the reports that were not in the import + existingReports.forEach(r -> { + String storageId = r.getStorageId(); + if (!reportsUpdated.contains(r.getTemplateId())) { + storageService.deleteObject(storageId); + reportTemplatePersistenceService.delete(r.getTemplateId()); + } + }); + } else { // creates new dossier template if (StringUtils.isEmpty(dossierTemplateMeta.getName())) { @@ -222,6 +245,14 @@ public class DossierTemplateImportService { } } + + //set report templates + if (CollectionUtils.isNotEmpty(request.getReportTemplateUploadRequests())) { + request.getReportTemplateUploadRequests().forEach(reportRequest -> { + reportRequest.setDossierTemplateId(dossierTemplateId); + reportTemplateService.uploadTemplate(reportRequest); + }); + } } // set legal basis if (CollectionUtils.isNotEmpty(request.getLegalBases())) { @@ -234,19 +265,12 @@ public class DossierTemplateImportService { convert(request.getFileAttributesGeneralConfiguration(), FileAttributesGeneralConfigurationEntity.class)); } - //set report templates - if (CollectionUtils.isNotEmpty(request.getReportTemplateUploadRequests())) { - request.getReportTemplateUploadRequests().forEach(reportRequest -> { - reportRequest.setDossierTemplateId(dossierTemplateId); - reportTemplateService.uploadTemplate(reportRequest); - }); - } return dossierTemplateId; } - private void addEntries(Map> entries, String typeId, String initialTypeId, DictionaryEntryType dictionaryType) { - if (entries != null && !entries.isEmpty() && entries.get(initialTypeId) != null && !entries.get(initialTypeId).isEmpty()) { - dictionaryService.addEntries(typeId, entries.get(initialTypeId), true, true, dictionaryType); + private void addEntries(Map> entries, String typeId, String typeName, DictionaryEntryType dictionaryType) { + if (entries != null && !entries.isEmpty() && entries.get(typeName) != null && !entries.get(typeName).isEmpty()) { + dictionaryService.addEntries(typeId, entries.get(typeName), true, true, dictionaryType); } else { // no entries, delete current entries List existing = entryPersistenceService.getEntries(typeId, dictionaryType, null) .stream() @@ -342,9 +366,9 @@ public class DossierTemplateImportService { } typeIdsAdded.add(typeId); - this.addEntries(request.getEntries(), typeId, type.getTypeId(), DictionaryEntryType.ENTRY); - this.addEntries(request.getFalsePositives(), typeId, type.getTypeId(), DictionaryEntryType.FALSE_POSITIVE); - this.addEntries(request.getFalseRecommendations(), typeId, type.getTypeId(), DictionaryEntryType.FALSE_RECOMMENDATION); + this.addEntries(request.getEntries(), typeId, type.getType(), DictionaryEntryType.ENTRY); + this.addEntries(request.getFalsePositives(), typeId, type.getType(), DictionaryEntryType.FALSE_POSITIVE); + this.addEntries(request.getFalseRecommendations(), typeId, type.getType(), DictionaryEntryType.FALSE_RECOMMENDATION); } // remove additional types and not included in the archive this.deleteTypes(currentTypes, typeIdsAdded); @@ -416,6 +440,9 @@ public class DossierTemplateImportService { fa.setId(fileAttributeConfigPersistenceService.getFileAttributeByIdOrName(dossierTemplateId, fa.getId(), fa.getLabel())); FileAttributeConfigEntity fileAttributeAdded = fileAttributeConfigPersistenceService.addOrUpdateFileAttribute(dossierTemplateId, convert(fa, FileAttributeConfigEntity.class)); fileAttributeIdsAdded.add(fileAttributeAdded.getId()); + if (fa.isPrimaryAttribute()) { + fileAttributeConfigPersistenceService.updatePrimaryAttribute(fileAttributeAdded.getId()); + } }); // remove existing file attributes and not included in archive Set attributesToRemove = currentFileAttributeIds.stream().filter(fa -> !fileAttributeIdsAdded.contains(fa)).collect(Collectors.toSet()); 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 4c536faf4..a4c8166c1 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 @@ -19,6 +19,7 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do 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.importexport.ExportDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; 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.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; @@ -35,6 +36,7 @@ import java.time.OffsetDateTime; import java.util.*; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +import static org.assertj.core.api.Assertions.as; import static org.assertj.core.api.Assertions.assertThat; public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @@ -81,6 +83,9 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { @Autowired private StorageService storageService; + @Autowired + private LegalBasisClient legalBasisClient; + @Test public void testDownload() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); @@ -361,6 +366,21 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(statuses).isNotEmpty(); assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); + // add legal basis + legalBasisClient.addOrUpdateLegalBasis(dossierTemplate.getId(), new LegalBasis("name2", "description2", "reason2")); + var legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(legalBasis.size()).isEqualTo(2); + + //add report + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .template("some text2222".getBytes(StandardCharsets.UTF_8)) + .dossierTemplateId(dossierTemplate.getId()) + .fileName("Report Template 2") + .activeByDefault(true) + .multiFileReport(false) + .build()); + var reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(reports.size()).isEqualTo(2); ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() .dossierTemplateId(dossierTemplate.getId()) .updateExistingDossierTemplate(true) @@ -374,6 +394,12 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); assertThat(watermarkClient.getWatermarksForDossierTemplateId(updatedDossierTemplate.getId()).size()).isEqualTo(1); + reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(reports.size()).isEqualTo(1); + + legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(legalBasis.size()).isEqualTo(1); + } @Test @@ -454,6 +480,46 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { } + @Test + @SneakyThrows + public void testImportDossierTemplateUpdateTemplate() { + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + setupDossierTemplate(dossierTemplate); + // prepare an archive + dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder() + .userId("1") + .dossierTemplateId(dossierTemplate.getId()) + .build()); + String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); + dossierTemplateClient.createExportDownload("1", storageId); + + var statuses = downloadClient.getDownloadStatus("1"); + assertThat(statuses).isNotEmpty(); + assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); + + ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() + .dossierTemplateId(dossierTemplate.getId()) + .updateExistingDossierTemplate(true) + .userId("1") + .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) + .build(); + + assertThat(dossierTemplate.getDateModified()).isNull(); + var fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); + assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); + var updatedDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); + var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); + assertThat(allDossierTemplates.size()).isEqualTo(1); + assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); + assertThat(updatedDossierTemplate.getId()).isEqualTo(dossierTemplate.getId()); + var typeIdForT = "t:" + dossierTemplate.getId(); + var updatedEntries = dictionaryClient.getEntriesForType("t:" + dossierTemplate.getId(), null, DictionaryEntryType.ENTRY); + assertThat(updatedEntries.size()).isEqualTo(2); + fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); + assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); + + } + private void setupDossierTemplate(DossierTemplate dossierTemplate) { Type type = Type.builder() .type("t") @@ -470,9 +536,9 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .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())) + .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t:" + dossierTemplate.getId()).build())) + .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2001).value("dictEntry2").version(23).deleted(false).typeId("t:" + dossierTemplate.getId()).build())) + .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3001).value("dictEntry3").version(23).deleted(false).typeId("t:" + dossierTemplate.getId()).build())) .hasDictionary(true) .systemManaged(false) .build(); @@ -491,9 +557,9 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .label("t2.getLabel()") .dossierId(null) .version(23) - .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t2.getType()").build())) - .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2001).value("dictEntry2").version(23).deleted(false).typeId("t2.getType()").build())) - .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3001).value("dictEntry3").version(23).deleted(false).typeId("t2.getType()").build())) + .entries(List.of(DictionaryEntry.builder().entryId(1011).value("dictEntry1").version(23).deleted(false).typeId("t2:" + dossierTemplate.getId()).build())) + .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2011).value("dictEntry2").version(23).deleted(false).typeId("t2:" + dossierTemplate.getId()).build())) + .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3011).value("dictEntry3").version(23).deleted(false).typeId("t2:" + dossierTemplate.getId()).build())) .hasDictionary(true) .systemManaged(false) .build(); @@ -527,17 +593,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .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())