break cyclic service injection

This commit is contained in:
Kilian Schuettler 2024-07-26 14:50:25 +02:00
parent a01030ad91
commit 0cd97ca9a4
10 changed files with 58 additions and 63 deletions

View File

@ -24,13 +24,15 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ExportDownloadRequest;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateExportService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateImportService;
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.service.DossierManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateStatsService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService;
import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateResource;
import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory;
import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel;
@ -42,7 +44,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStats;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ExportDownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;
import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity;
@ -61,7 +62,8 @@ public class DossierTemplateController implements DossierTemplateResource {
private final AuditPersistenceService auditPersistenceService;
private final DossierManagementService dossierManagementService;
private final DossierACLService dossierACLService;
private final UserService userService;
private final DossierTemplateImportService dossierTemplateImportService;
private final DossierTemplateExportService dossierTemplateExportService;
@Override
@ -224,15 +226,16 @@ public class DossierTemplateController implements DossierTemplateResource {
try {
ExportDownloadRequest request = ExportDownloadRequest.builder().dossierTemplateId(dossierTemplateId).userId(KeycloakSecurity.getUserId()).build();
var response = dossierTemplateManagementService.prepareExportDownload(request);
dossierTemplateManagementService.validateDossierTemplateForDuplicateRanks(request.getDossierTemplateId());
String storageId = dossierTemplateExportService.prepareExportDownload(request);
auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId())
.objectId(response.getValue())
.objectId(storageId)
.category(AuditCategory.DOWNLOAD.name())
.message("Export Download was prepared")
.details(Map.of("dossierTemplateId", request.getDossierTemplateId()))
.build());
return new DownloadResponse(response.getValue());
return new DownloadResponse(storageId);
} catch (FeignException e) {
throw processFeignException(e);
}
@ -265,15 +268,15 @@ public class DossierTemplateController implements DossierTemplateResource {
.userId(KeycloakSecurity.getUserId())
.archive(file.getBytes())
.build();
DossierTemplate loadedDossierTemplate = dossierTemplateManagementService.importDossierTemplate(request);
String importedDossierTemplateId = dossierTemplateImportService.importDossierTemplate(request);
auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId())
.objectId(loadedDossierTemplate.getId())
.objectId(importedDossierTemplateId)
.category(AuditCategory.DOSSIER_TEMPLATE.name())
.message("Dossier template was imported")
.details(Map.of("dossierTemplateId", loadedDossierTemplate.getId()))
.details(Map.of("dossierTemplateId", importedDossierTemplateId))
.build());
return convert(loadedDossierTemplate);
return convert(dossierTemplateManagementService.getDossierTemplate(importedDossierTemplateId));
} catch (IOException e) {
throw new BadRequestException(e.getMessage(), e);
} catch (FeignException e) {

View File

@ -100,18 +100,17 @@ public class DossierTemplateExportService {
RabbitTemplate rabbitTemplate;
public JSONPrimitive<String> prepareExportDownload(ExportDownloadRequest request) {
public String prepareExportDownload(ExportDownloadRequest request) {
var mimeType = "application/zip";
dossierTemplatePersistenceService.validateDossierTemplateForDuplicateRanks(request.getDossierTemplateId());
String downloadFilename = request.getDossierTemplateId() + ".zip";
String storageId = StorageIdUtils.getStorageId(request.getUserId(), request.getDossierTemplateId());
downloadStatusPersistenceService.createStatus(request.getUserId(), storageId, downloadFilename, mimeType);
addToExportDownloadQueue(ExportDownloadMessage.builder().dossierTemplateId(request.getDossierTemplateId()).storageId(storageId).userId(request.getUserId()).build(), 1);
return new JSONPrimitive<>(storageId);
return storageId;
}

View File

@ -39,6 +39,7 @@ import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zi
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zipreaders.ZipEntryIterator;
import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.ReportTemplateService;
import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService;
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
@ -88,6 +89,7 @@ public class DossierTemplateImportService {
LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
RulesPersistenceService rulesPersistenceService;
DossierTemplatePersistenceService dossierTemplatePersistenceService;
DossierTemplateManagementService dossierTemplateManagementService;
DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService;
FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
ColorsService colorsService;
@ -158,7 +160,7 @@ public class DossierTemplateImportService {
} catch (Exception e) {
log.error("Error with message: {} occurred during import, undo import", e.getMessage(), e);
dossierTemplatePersistenceService.deleteDossierTemplate(templateImportInfo.getDossierTemplateId());
dossierTemplateManagementService.deleteDossierTemplateCompletely(templateImportInfo.getDossierTemplateId());
throw e;
}
@ -185,8 +187,8 @@ public class DossierTemplateImportService {
var loadedDossierTemplate = dossierTemplateRepository.save(dossierTemplateEntity);
loadedDossierTemplate.setDossierTemplateStatus(dossierTemplatePersistenceService.computeDossierTemplateStatus(loadedDossierTemplate));
dossierTemplateId = loadedDossierTemplate.getId();
templateImportInfo.setDossierTemplateId(dossierTemplateId);
// set colors
this.updateColors(dossierTemplateId, request.getColors());
@ -258,7 +260,7 @@ public class DossierTemplateImportService {
setRulesWhenCompiled(request, dossierTemplateId);
setComponentMappings(dossierTemplateId, request.getComponentMappings());
setFileAttributeGeneralConfig(request, dossierTemplateId);
templateImportInfo.setDossierTemplateId(dossierTemplateId);
}

View File

@ -10,7 +10,6 @@ import com.iqser.red.service.persistence.management.v1.processor.dataexchange.mo
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.TemplateImportInfo;
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.service.DossierService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.ImportResponse;
@ -77,7 +76,7 @@ public class FileExchangeImportService {
}
return templateImportInfo.getDossierTemplateId();
} catch (Exception e) {
dossierTemplateManagementService.deleteDossierTemplate(templateImportInfo.getDossierTemplateId());
dossierTemplateManagementService.deleteDossierTemplateCompletely(templateImportInfo.getDossierTemplateId());
throw e;
}
}

View File

@ -33,6 +33,7 @@ import com.iqser.red.service.persistence.management.v1.processor.utils.TypeMappe
import com.iqser.red.service.persistence.management.v1.processor.validation.DictionaryValidator;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary;
import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter;
import jakarta.transaction.Transactional;
@ -441,4 +442,10 @@ public class DictionaryManagementService {
}
public List<TypeRankSummary> getTypeRankSummaryList(String dossierTemplateId) {
return dictionaryPersistenceService.getTypeRankSummaryList(dossierTemplateId);
}
}

View File

@ -92,7 +92,6 @@ public class DossierTemplateCloneService {
}
DossierTemplateEntity clonedDossierTemplate = DossierTemplateEntity.copyDossierTemplateEntityWithoutChildEntities(dossierTemplate.get());
dossierTemplatePersistenceService.validateDossierTemplateForDuplicateRanks(dossierTemplateId);
OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);
clonedDossierTemplate.setId(UUID.randomUUID().toString());
clonedDossierTemplate.setName(cloneDossierTemplateRequest.getName());

View File

@ -3,18 +3,15 @@ package com.iqser.red.service.persistence.management.v1.processor.service;
import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateExportService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateImportService;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ExportDownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -24,11 +21,11 @@ import lombok.extern.slf4j.Slf4j;
@RequiredArgsConstructor
public class DossierTemplateManagementService {
private final DossierTemplateExportService dossierTemplateExportService;
private final DossierTemplateImportService dossierTemplateImportService;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
private final DossierTemplateCloneService dossierTemplateCloneService;
private final DossierDeletionService dossierDeletionService;
private final DictionaryManagementService dictionaryManagementService;
private final ComponentMappingService componentMappingService;
public DossierTemplate createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest dossierTemplate) {
@ -49,8 +46,10 @@ public class DossierTemplateManagementService {
}
public void deleteDossierTemplate(String dossierTemplateId) {
public void deleteDossierTemplateCompletely(String dossierTemplateId) {
dictionaryManagementService.deleteByDossierTemplateId(dossierTemplateId);
componentMappingService.deleteByDossierTemplateId(dossierTemplateId);
dossierDeletionService.deleteAllDossiersInTemplate(dossierTemplateId);
dossierTemplatePersistenceService.deleteDossierTemplate(dossierTemplateId);
}
@ -64,20 +63,23 @@ public class DossierTemplateManagementService {
public DossierTemplate cloneDossierTemplate(String dossierTemplateId, CloneDossierTemplateRequest cloneDossierTemplateRequest) {
validateDossierTemplateForDuplicateRanks(dossierTemplateId);
return convert(dossierTemplateCloneService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest), DossierTemplate.class);
}
public JSONPrimitive<String> prepareExportDownload(ExportDownloadRequest request) {
public void validateDossierTemplateForDuplicateRanks(String dossierTemplateId) {
return dossierTemplateExportService.prepareExportDownload(request);
}
public DossierTemplate importDossierTemplate(ImportDossierTemplateRequest request) {
String dossierTemplateId = dossierTemplateImportService.importDossierTemplate(request);
return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class);
var duplicateRanks = dictionaryManagementService.getTypeRankSummaryList(dossierTemplateId)
.stream()
.filter(t -> t.getTypesCount() > 1)
.toList();
if (!duplicateRanks.isEmpty()) {
String errorMessage = "Duplicate ranks found in dossier template " + dossierTemplateId + "\n" + duplicateRanks.stream()
.map(t -> String.format(" Rank %d has %d entries", t.getRank(), t.getTypesCount()))
.collect(Collectors.joining("\n"));
throw new BadRequestException(errorMessage);
}
}
}

View File

@ -17,6 +17,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.Confl
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository;
import com.iqser.red.service.persistence.management.v1.processor.utils.ColorUtils;
import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel;
@ -35,7 +36,7 @@ public class WatermarkService {
private final static int DEFAULT_OPACITY = 30;
private final WatermarkRepository watermarkRepository;
private final DossierRepository dossierRepository;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
private final DossierTemplateRepository dossierTemplateRepository;
@Transactional
@ -70,7 +71,7 @@ public class WatermarkService {
validateWatermarkNameIsUnique(watermark.getName(), loadedWatermark.get().getDossierTemplateId(), loadedWatermark.get().getId());
BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId", "createdBy", "dateAdded", "dateModified");
loadedWatermark.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(loadedWatermark.get().getDossierTemplateId());
var dossierTemplate = dossierTemplateRepository.findById(watermark.getDossierTemplateId()).orElseThrow(() -> new NotFoundException("Dossier Template not found"));
loadedWatermark.get().setDossierTemplate(dossierTemplate);
return loadedWatermark.get();
} else { // if not found by id -> add it as a new watermark
@ -79,7 +80,7 @@ public class WatermarkService {
WatermarkEntity watermarkEntity = new WatermarkEntity();
BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified");
watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
var dossierTemplate = dossierTemplateRepository.findById(watermark.getDossierTemplateId()).orElseThrow(() -> new NotFoundException("Dossier Template not found"));
watermarkEntity.setDossierTemplate(dossierTemplate);
return watermarkRepository.save(watermarkEntity);
}
@ -89,7 +90,7 @@ public class WatermarkService {
WatermarkEntity watermarkEntity = new WatermarkEntity();
BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified");
watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
var dossierTemplate = dossierTemplateRepository.findById(watermark.getDossierTemplateId()).orElseThrow(() -> new NotFoundException("Dossier Template not found"));
watermarkEntity.setDossierTemplate(dossierTemplate);
return watermarkRepository.save(watermarkEntity);
}

View File

@ -44,9 +44,6 @@ public class DossierTemplatePersistenceService {
final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
final RulesPersistenceService rulesPersistenceService;
final DictionaryPersistenceService dictionaryPersistenceService;
final DictionaryManagementService dictionaryManagementService;
final ComponentMappingService componentMappingService;
final TypeRepository typeRepository;
static int MAX_NAME_LENGTH = 255;
@ -236,8 +233,6 @@ public class DossierTemplatePersistenceService {
public void deleteDossierTemplate(String dossierTemplateId) {
rulesPersistenceService.deleteRulesByDossierTemplateId(dossierTemplateId);
dictionaryManagementService.deleteByDossierTemplateId(dossierTemplateId);
componentMappingService.deleteByDossierTemplateId(dossierTemplateId);
dossierTemplateRepository.deleteById(dossierTemplateId);
}
@ -249,18 +244,5 @@ public class DossierTemplatePersistenceService {
}
public void validateDossierTemplateForDuplicateRanks(String dossierTemplateId) {
var duplicateRanks = dictionaryPersistenceService.getTypeRankSummaryList(dossierTemplateId)
.stream()
.filter(t -> t.getTypesCount() > 1)
.collect(Collectors.toList());
if (!duplicateRanks.isEmpty()) {
String errorMessage = "Duplicate ranks found in dossier template " + dossierTemplateId + "\n" + duplicateRanks.stream()
.map(t -> String.format(" Rank %d has %d entries", t.getRank(), t.getTypesCount()))
.collect(Collectors.joining("\n"));
throw new BadRequestException(errorMessage);
}
}
}

View File

@ -21,6 +21,7 @@ import org.springframework.mock.web.MockMultipartFile;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateImportService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate;
@ -35,7 +36,7 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
public static final String DOSSIERTEMPLATES_PATH = "files/dossiertemplates/";
@Autowired
private DossierTemplateManagementService dossierTemplateManagementService;
private DossierTemplateImportService dossierTemplateImportService;
@Autowired
private DossierTemplateClient dossierTemplateClient;
@ -125,7 +126,7 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
private DossierTemplate testDossierTemplateImport(byte[] archive) {
var request = ImportDossierTemplateRequest.builder().archive(archive).updateExistingDossierTemplate(false).userId("system").build();
DossierTemplate dossierTemplate = dossierTemplateManagementService.importDossierTemplate(request);
DossierTemplate dossierTemplate = d.importDossierTemplate(request);
assertThat(dossierTemplate).isNotNull();
assertThat(dossierTemplate.getId()).isNotBlank();
return dossierTemplate;
@ -147,9 +148,9 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
.userId("system")
.dossierTemplateId(dossierTemplate.getId())
.build();
DossierTemplate reimportedTemplate = dossierTemplateManagementService.importDossierTemplate(request);
assertThat(reimportedTemplate).isNotNull();
assertThat(reimportedTemplate.getId()).isNotBlank();
String reimportedTemplateId = dossierTemplateImportService.importDossierTemplate(request);
assertThat(reimportedTemplateId).isNotNull();
assertThat(reimportedTemplateId).isNotBlank();
}