RED-6270: Changed data access to avoid lazy loading, making it possible to run the dossier-template import outside an enclosing transaction

This commit is contained in:
Viktor Seifert 2023-05-05 16:30:09 +02:00
parent 9b9c79fc99
commit c6045189e6
4 changed files with 34 additions and 12 deletions

View File

@ -35,7 +35,6 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry;
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.LegalBasisEntity;
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;
@ -357,11 +356,7 @@ public class DossierTemplateImportService {
if (CollectionUtils.isNotEmpty(request.getTypes())) {
this.updateTypes(request, dossierTemplateId);
} else { // no types to add, but remove existing ones
List<TypeEntity> currentTypes = dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId)
.getDossierTypes()
.stream()
.filter(t -> t.getDossierId() == null)
.collect(Collectors.toList());
List<TypeEntity> currentTypes = dossierTemplatePersistenceService.getTypesForDossierTemplate(dossierTemplateId);
this.deleteTypes(currentTypes, new HashSet<>());
}
@ -390,11 +385,7 @@ public class DossierTemplateImportService {
if (CollectionUtils.isNotEmpty(request.getLegalBases())) {
legalBasisMappingPersistenceService.setLegalBasisMapping(dossierTemplateId, request.getLegalBases());
} else { // delete existing
var existingLegalBasis = legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId)
.stream()
.map(LegalBasisEntity::getName)
.collect(Collectors.toList());
legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId, existingLegalBasis);
legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId);
}
} else {

View File

@ -12,11 +12,13 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
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.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
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.DossierTemplateStatus;
@ -32,6 +34,8 @@ public class DossierTemplatePersistenceService {
private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
private final RulesPersistenceService rulesPersistenceService;
private final TypeRepository typeRepository;
@Transactional
public DossierTemplateEntity createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest createOrUpdateDossierRequest) {
@ -134,6 +138,13 @@ public class DossierTemplatePersistenceService {
}
@Transactional
public List<TypeEntity> getTypesForDossierTemplate(String dossierTemplateId) {
return typeRepository.findAllByDossierTemplateIdAndDossierId(dossierTemplateId, null);
}
@Transactional
public void deleteDossierTemplate(String dossierTemplateId, String deletingUserId) {

View File

@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@ -37,6 +38,16 @@ public class LegalBasisMappingPersistenceService {
}
@Transactional
public void deleteLegalBasis(String dossierTemplateId) {
var mapping = getLegalBasisMappingOrCreate(dossierTemplateId);
mapping.setLegalBasis(Collections.emptyList());
mapping.setVersion(mapping.getVersion() + 1);
legalBasisMappingRepository.save(mapping);
}
private LegalBasisMappingEntity getLegalBasisMappingOrCreate(String dossierTemplateId) {
return legalBasisMappingRepository.findById(dossierTemplateId).orElseGet(() -> {

View File

@ -37,6 +37,9 @@ public interface TypeRepository extends JpaRepository<TypeEntity, String> {
List<TypeEntity> findAllTypesByDossierTemplateIdOrDossierId(String dossierTemplateId, String dossierId);
List<TypeEntity> findAllByDossierTemplateIdAndDossierId(String dossierTemplateId, String dossierId);
@Query("select coalesce(sum(t.version),0) from TypeEntity t where t.dossierId = :dossierId")
long getVersionForDossierId(String dossierId);
@ -45,7 +48,13 @@ public interface TypeRepository extends JpaRepository<TypeEntity, String> {
long getVersionForDossierTemplateId(String dossierTemplateId);
@Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e)) " + "from DossierTemplateEntity dt " + "left join TypeEntity t on t.dossierTemplateId = dt.id " + "left join DictionaryEntryEntity e on e.typeId = t.id " + "where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.id is null or e.deleted = false) " + "group by dt.id, t.id, t.type, t.label ")
@Query("""
select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e))
from DossierTemplateEntity dt
left join TypeEntity t on t.dossierTemplateId = dt.id
left join DictionaryEntryEntity e on e.typeId = t.id
where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.entryId is null or e.deleted = false)
group by dt.id, t.id, t.type, t.label""")
List<DictionarySummaryResponse> findDictionarySummaryList(Set<String> dossierTemplateIds);