Pull request #176: RED-2805: Incomplete dossier templates must not be used for dossiers

Merge in RED/persistence-service from RED-2805-ps1 to master

* commit '3cdd7fc15ad0b9d547b2720d8ff157075b9e15a6':
This commit is contained in:
Ali Oezyetimoglu 2022-01-11 17:43:52 +01:00
commit fbedd88304
10 changed files with 118 additions and 23 deletions

View File

@ -29,5 +29,5 @@ public class DossierTemplate {
private OffsetDateTime validTo;
private boolean deleted;
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
private DossierTemplateStatus dossierTemplateStatus;
}

View File

@ -0,0 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate;
public enum DossierTemplateStatus {
INCOMPLETE, INACTIVE, ACTIVE
}

View File

@ -1,20 +1,30 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.dossier;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Entity
@ -73,4 +83,8 @@ public class DossierTemplateEntity {
@JsonIgnore
@OneToMany(mappedBy = "dossierTemplate")
private List<FileAttributeConfigEntity> fileAttributeConfigs = new ArrayList<>();
@Transient
private DossierTemplateStatus dossierTemplateStatus;
}

View File

@ -6,6 +6,9 @@ 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.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.DossierTemplate;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -25,6 +28,8 @@ public class DossierTemplatePersistenceService {
public static final String DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE = "DossierTemplate with Id %s not found.";
private final DossierTemplateRepository dossierTemplateRepository;
private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
private final RulesPersistenceService rulesPersistenceService;
@Transactional
@ -41,6 +46,7 @@ public class DossierTemplatePersistenceService {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate.get());
dossierTemplate.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplate.get().setModifiedBy(createOrUpdateDossierRequest.getRequestingUser());
dossierTemplate.get().setDossierTemplateStatus(computeDossierTemplateStatus(dossierTemplate.get()));
return dossierTemplate.get();
} else {
throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, createOrUpdateDossierRequest.getDossierTemplateId()));
@ -53,11 +59,37 @@ public class DossierTemplatePersistenceService {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate);
dossierTemplate.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplate.setCreatedBy(createOrUpdateDossierRequest.getRequestingUser());
return dossierTemplateRepository.save(dossierTemplate);
rulesPersistenceService.setRules(RulesPersistenceService.DEFAULT_RULES, dossierTemplate.getId());
var loadedDossierTemplate = dossierTemplateRepository.save(dossierTemplate);
loadedDossierTemplate.setDossierTemplateStatus(computeDossierTemplateStatus(loadedDossierTemplate));
return loadedDossierTemplate;
}
}
private DossierTemplateStatus computeDossierTemplateStatus(DossierTemplateEntity dossierTemplate) {
var legalBasis = legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId());
if (legalBasis==null || legalBasis.isEmpty()) {
return DossierTemplateStatus.INCOMPLETE;
}
var rules = rulesPersistenceService.getRules(dossierTemplate.getId());
if (rules==null || rules.getVersion()==1) {
return DossierTemplateStatus.INCOMPLETE;
}
var now = OffsetDateTime.now();
boolean isNotInRange = !now.isAfter(dossierTemplate.getValidFrom()!=null ? dossierTemplate.getValidFrom() : OffsetDateTime.MIN) || !now.isBefore(dossierTemplate.getValidTo()!=null ? dossierTemplate.getValidTo() : OffsetDateTime.MAX);
if(isNotInRange) {
return DossierTemplateStatus.INACTIVE;
}
return DossierTemplateStatus.ACTIVE;
}
public void validateDossierTemplateNameIsUnique(String templateName){
getAllDossierTemplates().forEach(existing -> {
if(existing.getName().equals(templateName)){
@ -67,11 +99,18 @@ public class DossierTemplatePersistenceService {
}
public List<DossierTemplateEntity> getAllDossierTemplates() {
return dossierTemplateRepository.findAllWhereDeletedIsFalse();
var allDossierTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse();
allDossierTemplates.forEach(dossierTemplateEntity -> dossierTemplateEntity.setDossierTemplateStatus(computeDossierTemplateStatus(dossierTemplateEntity)));
return allDossierTemplates;
}
public DossierTemplateEntity getDossierTemplate(String dossierTemplateId) {
return dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId).orElseThrow(() -> new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)));
var dossierTemplate = dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId).orElseThrow(() -> new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)));
dossierTemplate.setDossierTemplateStatus(computeDossierTemplateStatus(dossierTemplate));
return dossierTemplate;
}
@Transactional

View File

@ -12,7 +12,7 @@ import javax.transaction.Transactional;
@SuppressWarnings("PMD.TooManyStaticImports")
public class RulesPersistenceService {
private final static String DEFAULT_RULES = "" +
public final static String DEFAULT_RULES = "" +
"package drools\n" +
"\n" +
"import com.iqser.red.service.redaction.v1.server.redaction.model.Section\n" +

View File

@ -4,7 +4,9 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -25,6 +27,8 @@ public class DossierService {
private final FileStatusPersistenceService fileStatusPersistenceService;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
public DossierEntity addDossier(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
@ -35,6 +39,10 @@ public class DossierService {
throw new ConflictException("Dossier with this name already exists");
}
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(createOrUpdateDossierRequest.getDossierTemplateId());
if(!dossierTemplate.getDossierTemplateStatus().equals(DossierTemplateStatus.ACTIVE)) {
throw new BadRequestException("Dossier template is not active.");
}
return dossierPersistenceService.insert(createOrUpdateDossierRequest);
@ -43,7 +51,13 @@ public class DossierService {
public DossierEntity updateDossier(CreateOrUpdateDossierRequest dossierRequest, String dossierId) {
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(dossierRequest.getDossierTemplateId());
if(!dossierTemplate.getDossierTemplateStatus().equals(DossierTemplateStatus.ACTIVE)) {
throw new BadRequestException("Dossier template is not active.");
}
DossierEntity dossier = dossierPersistenceService.findByDossierId(dossierId);
if (dossier.getDossierName()
.equals(dossierRequest.getDossierName()) || dossierPersistenceService.findAllDossiers()
.stream()

View File

@ -2,14 +2,20 @@ package com.iqser.red.service.peristence.v1.server.integration.service;
import com.google.common.collect.Sets;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient;
import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@ -19,6 +25,12 @@ public class DossierTemplateTesterAndProvider {
@Autowired
private DossierTemplateClient dossierTemplateClient;
@Autowired
private RulesClient rulesClient;
@Autowired
private LegalBasisClient legalBasisClient;
public DossierTemplate provideTestTemplate() {
CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest();
cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL));
@ -26,7 +38,7 @@ public class DossierTemplateTesterAndProvider {
cru.setDescription("Template 1");
cru.setRequestingUser("1");
cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
cru.setValidTo(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
cru.setValidTo(OffsetDateTime.now().plusHours(1).truncatedTo(ChronoUnit.MILLIS));
DossierTemplate result = dossierTemplateClient.createOrUpdateDossierTemplate(cru);
@ -36,6 +48,11 @@ public class DossierTemplateTesterAndProvider {
assertThat(loadedTemplate).isEqualTo(result);
rulesClient.setRules(loadedTemplate.getId(), JSONPrimitive.of("ABCD"));
legalBasisClient.setLegalBasisMapping(loadedTemplate.getId(), List.of(new LegalBasis("name", "description", "reason")));
loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getId());
return loadedTemplate;
}

View File

@ -2,16 +2,23 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient;
import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
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 feign.FeignException;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Collections;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@ -53,11 +60,10 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedTemplate).isEqualTo(updated);
dossierTemplateClient.getAllDossierTemplates().forEach(template -> dossierTemplateClient.deleteDossierTemplate(template.getId(), "1"));
assertThat(dossierTemplateClient.getAllDossierTemplates().isEmpty()).isTrue();
assertThat(loadedTemplate.getDossierTemplateStatus()).isEqualTo(DossierTemplateStatus.ACTIVE);
updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru);
assertThat(updated.getName()).isEqualTo("Template 1 Update");
var testDossier = dossierTesterAndProvider.provideTestDossier(updated);

View File

@ -27,7 +27,7 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(0);
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(2); //1. beim Aufrufen von getLegalBasisMapping(); 2. bei provideTestTemplate(), damit es ACTIVE ist
try {
legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
@ -40,7 +40,7 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest {
mappings.add(LegalBasis.builder().name("test 1").description("test 1").reason("test 1").build());
mappings.add(LegalBasis.builder().name("test 2").description("test 2").reason("test 2").build());
legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), mappings);
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(2);
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(3);
var mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId());
@ -72,7 +72,7 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest {
legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), Lists.newArrayList());
assertThat(legalBasisClient.getLegalBasisMapping(dossierTemplate.getId())).isEmpty();
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(6);
assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(7);
}
}

View File

@ -24,11 +24,11 @@ public class RulesTest extends AbstractPersistenceServerServiceTest {
rulesClient.setRules(dossierTemplate.getId(), JSONPrimitive.of("lorem ipsum"));
assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(1);
assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(3); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate(), damit es ACTIVE ist
assertThat(rulesClient.getRules(dossierTemplate.getId())).isEqualTo(JSONPrimitive.of("lorem ipsum"));
rulesClient.setRules(dossierTemplate.getId(), JSONPrimitive.of("lorem ipsum dolor sit amet"));
assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(2);
assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(4);
assertThat(rulesClient.getRules(dossierTemplate.getId())).isEqualTo(JSONPrimitive.of("lorem ipsum dolor sit amet"));