RED-3246: As an admin I want to clone a dossier template

This commit is contained in:
aoezyetimoglu 2022-03-18 14:04:49 +01:00
parent ba37f0eed1
commit 99bfa5510b
3 changed files with 241 additions and 149 deletions

View File

@ -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<TypeEntity> cloneDictionaries(String dossierTemplateId, String clonedDossierTemplateId) {
List<TypeEntity> 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<DossierAttributeConfigEntity> 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<FileAttributeConfigEntity> cloneFileAttributesConfig(String dossierTemplateId, String clonedDossierTemplateId) {
List<FileAttributeConfigEntity> 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<ReportTemplateEntity> 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);
}
}

View File

@ -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<TypeEntity> 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<DossierAttributeConfigEntity> 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<FileAttributeConfigEntity> 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;
}
}

View File

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