Pull request #544: RED-2200 - Dossier Template export and import

Merge in RED/persistence-service from bugfix/RED-5313 to master

* commit '132d8c5a0ecf7209bdf7d2658cc162844e7bc7fb':
  RED-2200 - Dossier Template export and import
  RED-2200 - Dossier Template export and import
This commit is contained in:
Corina Olariu 2022-10-06 21:37:04 +02:00 committed by Timo Bejan
commit 40eaea7562
4 changed files with 121 additions and 30 deletions

View File

@ -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));

View File

@ -16,6 +16,10 @@ public interface FileAttributeConfigRepository extends JpaRepository<FileAttribu
@Query("update FileAttributeConfigEntity e set e.primaryAttribute = false where e.dossierTemplate.id = :dossierTemplateId")
void updateAllPrimaryAttributeValuesToFalse(String dossierTemplateId);
@Modifying
@Query("update FileAttributeConfigEntity e set e.primaryAttribute = true where e.id = :fileAttributeId")
void updatePrimaryAttributeValueToTrue(String fileAttributeId);
@Query("select fa from FileAttributeConfigEntity fa where fa.dossierTemplate.id = :dossierTemplateId and (fa.id = :fileAttributeId or fa.label = :label)")
Optional<FileAttributeConfigEntity> findByIdOrDossierTemplateIdAndLabel(String dossierTemplateId, String fileAttributeId, String label);
}

View File

@ -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<String> 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<String, List<String>> 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<String, List<String>> 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<String> 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<String> attributesToRemove = currentFileAttributeIds.stream().filter(fa -> !fileAttributeIdsAdded.contains(fa)).collect(Collectors.toSet());

View File

@ -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())