RED-3392 Fixed bug when changing dossierTemplate and update dossier dictionary type and entries
This commit is contained in:
parent
afc847895e
commit
3f368cbbb6
@ -1,23 +1,26 @@
|
||||
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
|
||||
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
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.TypeEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||
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.EntryRepository;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.transaction.Transactional;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId;
|
||||
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ -29,26 +32,29 @@ public class DictionaryPersistenceService {
|
||||
|
||||
private final DossierRepository dossierRepository;
|
||||
|
||||
public TypeEntity addType(String type, String dossierTemplateId, String hexColor, int rank, boolean isHint,
|
||||
boolean caseInsensitive, boolean isRecommendation, String description,
|
||||
boolean addToDictionaryAction, String label, String dossierId) {
|
||||
private final EntryRepository entryRepository;
|
||||
|
||||
|
||||
public TypeEntity addType(String type, String dossierTemplateId, String hexColor, int rank, boolean isHint, boolean caseInsensitive, boolean isRecommendation,
|
||||
String description, boolean addToDictionaryAction, String label, String dossierId) {
|
||||
|
||||
checkRankAlreadyExists(type, dossierTemplateId, rank, dossierId);
|
||||
|
||||
TypeEntity t = new TypeEntity();
|
||||
t.setId(toTypeId(type, dossierTemplateId, dossierId));
|
||||
t.setType(type);
|
||||
t.setDossier(dossierId == null ? null : dossierRepository.getOne(dossierId));
|
||||
t.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId));
|
||||
t.setHexColor(hexColor);
|
||||
t.setRank(rank);
|
||||
t.setDescription(description);
|
||||
t.setHint(isHint);
|
||||
t.setCaseInsensitive(caseInsensitive);
|
||||
t.setRecommendation(isRecommendation);
|
||||
t.setAddToDictionaryAction(addToDictionaryAction);
|
||||
t.setLabel(label);
|
||||
t.setVersion(1);
|
||||
TypeEntity t = TypeEntity.builder()
|
||||
.id(toTypeId(type, dossierTemplateId, dossierId))
|
||||
.type(type)
|
||||
.dossier(dossierId == null ? null : dossierRepository.getOne(dossierId))
|
||||
.dossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId))
|
||||
.hexColor(hexColor)
|
||||
.rank(rank)
|
||||
.description(description)
|
||||
.isHint(isHint)
|
||||
.isCaseInsensitive(caseInsensitive)
|
||||
.isRecommendation(isRecommendation)
|
||||
.addToDictionaryAction(addToDictionaryAction)
|
||||
.label(label)
|
||||
.version(1)
|
||||
.build();
|
||||
|
||||
return typeRepository.save(t);
|
||||
|
||||
@ -73,57 +79,100 @@ public class DictionaryPersistenceService {
|
||||
}
|
||||
|
||||
|
||||
private void checkRankAlreadyExists(String type, String dossierTemplateId, int rank, String dossierId) {
|
||||
|
||||
Optional<TypeEntity> existingTypeValueForRank = getTypeForRank(dossierTemplateId, rank, dossierId);
|
||||
// not the current type - which we are about to upsert -> throw exception
|
||||
if (existingTypeValueForRank.isPresent() && !existingTypeValueForRank.get().getType().equalsIgnoreCase(type)) {
|
||||
throw new BadRequestException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.get().getType());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<TypeEntity> getCumulatedTypes(String dossierTemplateId, String dossierId) {
|
||||
|
||||
return typeRepository.findAllTypesByDossierTemplateIdOrDossierId(dossierTemplateId, dossierId);
|
||||
}
|
||||
|
||||
|
||||
public List<TypeEntity> getAllTypesForDossierTemplate(String dossierTemplateId) {
|
||||
|
||||
return typeRepository.getAllTypesForDossierTemplate(dossierTemplateId);
|
||||
}
|
||||
|
||||
|
||||
public List<TypeEntity> getAllTypesForDossier(String dossierId) {
|
||||
|
||||
return typeRepository.findByDossierId(dossierId);
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void deleteType(String typeId) {
|
||||
|
||||
typeRepository.deleteById(typeId);
|
||||
}
|
||||
|
||||
|
||||
public TypeEntity getType(String typeId) {
|
||||
|
||||
return typeRepository.findById(typeId).orElseThrow(() -> new NotFoundException("Type: " + typeId + " not found"));
|
||||
}
|
||||
|
||||
|
||||
private void checkRankAlreadyExists(String type, String dossierTemplateId, int rank, String dossierId) {
|
||||
|
||||
Optional<TypeEntity> existingTypeValueForRank = getTypeForRank(dossierTemplateId, rank, dossierId);
|
||||
// not the current type - which we are about to upsert -> throw exception
|
||||
if (existingTypeValueForRank.isPresent() && !existingTypeValueForRank.get().getType().equalsIgnoreCase(type)) {
|
||||
throw new BadRequestException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.get()
|
||||
.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void incrementVersion(String typeId) {
|
||||
|
||||
typeRepository.updateByIdSetIncrementVersionByOne(typeId);
|
||||
}
|
||||
|
||||
|
||||
public long getVersion(String dossierTemplateId) {
|
||||
|
||||
return typeRepository.getVersionForDossierTemplateId(dossierTemplateId);
|
||||
}
|
||||
|
||||
|
||||
public long getVersionForDossier(String dossierId) {
|
||||
|
||||
return typeRepository.getVersionForDossierId(dossierId);
|
||||
}
|
||||
|
||||
|
||||
public List<DictionarySummaryResponse> getDictionarySummaryForDossierTemplateId(Set<String> dossierTemplateIds) {
|
||||
|
||||
return typeRepository.findDictionarySummaryList(dossierTemplateIds);
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void updateTypeIdAndIncrementVersionByOne(String typeId, String newTypeId, String newDossierTemplateId) {
|
||||
|
||||
Optional<TypeEntity> typeEntity = typeRepository.findById(typeId);
|
||||
if (typeEntity.isEmpty()) {
|
||||
throw new NotFoundException("Type '" + typeId + "' does not exist.");
|
||||
}
|
||||
|
||||
checkRankAlreadyExists(typeEntity.get().getType(), newDossierTemplateId, typeEntity.get().getRank(), typeEntity.get().getDossierId());
|
||||
|
||||
typeRepository.saveAndFlush(TypeEntity.builder()
|
||||
.id(newTypeId)
|
||||
.type(typeEntity.get().getType())
|
||||
.dossier(dossierRepository.getOne(typeEntity.get().getDossierId()))
|
||||
.dossierTemplate(dossierTemplateRepository.getOne(newDossierTemplateId))
|
||||
.hexColor(typeEntity.get().getHexColor())
|
||||
.rank(typeEntity.get().getRank())
|
||||
.description(typeEntity.get().getDescription())
|
||||
.isHint(typeEntity.get().isHint())
|
||||
.isCaseInsensitive(typeEntity.get().isCaseInsensitive())
|
||||
.isRecommendation(typeEntity.get().isRecommendation())
|
||||
.addToDictionaryAction(typeEntity.get().isAddToDictionaryAction())
|
||||
.label(typeEntity.get().getLabel())
|
||||
.version(typeEntity.get().getVersion() + 1)
|
||||
.build());
|
||||
|
||||
entryRepository.updateTypeIdAndIncrementVersionByOne(typeId, newTypeId);
|
||||
typeRepository.deleteById(typeId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
||||
import java.util.List;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity;
|
||||
|
||||
public interface EntryRepository extends JpaRepository<DictionaryEntryEntity, Long> {
|
||||
|
||||
@ -13,9 +14,17 @@ public interface EntryRepository extends JpaRepository<DictionaryEntryEntity, Lo
|
||||
@Query("update DictionaryEntryEntity e set e.deleted = true , e.version = :version where e.type.id =:typeId and e.value in :values")
|
||||
void deleteAllByTypeIdAndVersionAndValueIn(String typeId, long version, List<String> values);
|
||||
|
||||
|
||||
@Modifying
|
||||
@Query("update DictionaryEntryEntity e set e.version = :version where e.type.id =:typeId and e.value in :values")
|
||||
void updateVersionWhereTypeIdAndValueIn(long version, String typeId, List<String> values);
|
||||
|
||||
|
||||
@Modifying
|
||||
@Query("update DictionaryEntryEntity e set e.type.id = :newTypeId, e.version = e.version + 1 where e.type.id =:typeId")
|
||||
void updateTypeIdAndIncrementVersionByOne(String typeId, String newTypeId);
|
||||
|
||||
|
||||
List<DictionaryEntryEntity> findByTypeId(String typeId);
|
||||
|
||||
}
|
||||
|
||||
@ -1,22 +1,26 @@
|
||||
package com.iqser.red.service.peristence.v1.server.service;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||
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.persistence.DossierPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||
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.persistence.DictionaryPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* Provides the internal interface between dossier request and the actual persistence.
|
||||
*/
|
||||
@ -31,13 +35,14 @@ public class DossierService {
|
||||
|
||||
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
|
||||
|
||||
private final DictionaryPersistenceService dictionaryPersistenceService;
|
||||
|
||||
|
||||
public DossierEntity addDossier(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
|
||||
|
||||
if (dossierPersistenceService.findAllDossiers()
|
||||
.stream()
|
||||
.anyMatch(p -> p.getHardDeletedTime() == null && p.getDossierName()
|
||||
.equals(createOrUpdateDossierRequest.getDossierName()))) {
|
||||
.anyMatch(p -> p.getHardDeletedTime() == null && p.getDossierName().equals(createOrUpdateDossierRequest.getDossierName()))) {
|
||||
throw new ConflictException("Dossier with this name already exists");
|
||||
}
|
||||
|
||||
@ -60,17 +65,20 @@ public class DossierService {
|
||||
|
||||
DossierEntity dossier = dossierPersistenceService.findByDossierId(dossierId);
|
||||
|
||||
if (dossier.getDossierName()
|
||||
.equals(dossierRequest.getDossierName()) || dossierPersistenceService.findAllDossiers()
|
||||
if (dossier.getDossierName().equals(dossierRequest.getDossierName()) || dossierPersistenceService.findAllDossiers()
|
||||
.stream()
|
||||
.filter(p -> p.getHardDeletedTime() == null && p.getDossierName()
|
||||
.equals(dossierRequest.getDossierName()))
|
||||
.filter(p -> p.getHardDeletedTime() == null && p.getDossierName().equals(dossierRequest.getDossierName()))
|
||||
.findAny()
|
||||
.isEmpty()) {
|
||||
|
||||
if (!dossier.getDossierTemplateId().equalsIgnoreCase(dossierRequest.getDossierTemplateId())) {
|
||||
var canUpdateDossierTemplate = fileStatusPersistenceService.getStatusesForDossier(dossierId).isEmpty();
|
||||
if (!canUpdateDossierTemplate) {
|
||||
if (fileStatusPersistenceService.getStatusesForDossier(dossierId).isEmpty()) {
|
||||
|
||||
String typeId = TypeIdUtils.toTypeId("dossier_redaction", dossier.getDossierTemplateId(), dossier.getId());
|
||||
String newTypeId = TypeIdUtils.toTypeId("dossier_redaction", dossierRequest.getDossierTemplateId(), dossier.getId());
|
||||
dictionaryPersistenceService.updateTypeIdAndIncrementVersionByOne(typeId, newTypeId, dossierRequest.getDossierTemplateId());
|
||||
|
||||
} else {
|
||||
throw new BadRequestException("Cannot update Dossier Template. Dossier already has files");
|
||||
}
|
||||
}
|
||||
@ -88,11 +96,13 @@ public class DossierService {
|
||||
dossierPersistenceService.markDossierAsDeleted(dossierId, softDeleteTime);
|
||||
}
|
||||
|
||||
|
||||
public void hardDeleteDossier(String dossierId) {
|
||||
|
||||
dossierPersistenceService.hardDelete(dossierId);
|
||||
}
|
||||
|
||||
|
||||
public void undeleteDossier(String dossierId) {
|
||||
|
||||
dossierPersistenceService.undelete(dossierId);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user