diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java index 8822390c2..e76aee9e8 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.FileUploadException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; @@ -99,8 +100,11 @@ public class RulesController implements RulesResource { @PreAuthorize("hasAuthority('" + READ_RULES + "')") public RulesResponse download(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { - var ruleEntity = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); - return new RulesResponse(ruleEntity.getValue(), dossierTemplateId, ruleEntity.isTimeoutDetected()); + var ruleEntityOptional = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + if (ruleEntityOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId)); + } + return new RulesResponse(ruleEntityOptional.get().getValue(), dossierTemplateId, ruleEntityOptional.get().isTimeoutDetected()); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java index 4523ee997..b189940d1 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java @@ -18,6 +18,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; @@ -38,6 +39,7 @@ import com.iqser.red.persistence.service.v2.external.api.impl.mapper.ComponentMa import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.RuleSetEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; 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.model.ComponentMappingDownloadModel; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentDefinitionService; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService; @@ -502,9 +504,11 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource { private ResponseEntity downloadRules(String dossierTemplateId, RuleFileType ruleFileType) { - RuleSetEntity ruleEntity = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); - - var data = ruleEntity.getValue().getBytes(StandardCharsets.UTF_8); + Optional ruleEntityOptional = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + if (ruleEntityOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId)); + } + var data = ruleEntityOptional.get().getValue().getBytes(StandardCharsets.UTF_8); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java index ea56f5fa6..d4dd83926 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java @@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.v1.internal.api.controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.RulesTimeoutDetectedException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; import com.iqser.red.service.persistence.service.v1.api.internal.resources.RulesResource; @@ -22,20 +23,27 @@ public class RulesInternalController implements RulesResource { public JSONPrimitive getRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { - return new JSONPrimitive<>(rulesPersistenceService.getRules(dossierTemplateId, ruleFileType).getValue()); + var rulesOptional = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + if (rulesOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId)); + } + return new JSONPrimitive<>(rulesOptional.get().getValue()); } @Override public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { - var rules = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + var rulesOptional = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + if (rulesOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId)); + } - if (rules.isTimeoutDetected()) { + if (rulesOptional.get().isTimeoutDetected()) { throw new RulesTimeoutDetectedException(dossierTemplateId); } - return rules.getVersion(); + return rulesOptional.get().getVersion(); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateExportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateExportService.java index 2421099d4..ac82dd6ce 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateExportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateExportService.java @@ -9,6 +9,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.Optional; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -199,7 +200,11 @@ public class DossierTemplateExportService { } // add rule set - RuleSetEntity ruleSet = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.ENTITY); + Optional ruleSetOptional = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.ENTITY); + if (ruleSetOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", RuleFileType.ENTITY, dossierTemplate.getId())); + } + RuleSetEntity ruleSet = ruleSetOptional.get(); fileSystemBackedArchiver.addEntries(new FileSystemBackedArchiver.ArchiveModel(folder, getFilename(ExportFilename.RULES, RULE_EXT), ruleSet.getValue().getBytes(StandardCharsets.UTF_8))); @@ -209,7 +214,11 @@ public class DossierTemplateExportService { objectMapper.writeValueAsBytes(rulesExportModel))); // add component rule set try { - RuleSetEntity componentRuleSet = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.COMPONENT); + Optional componentRuleSetOptional = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.COMPONENT); + if (componentRuleSetOptional.isEmpty()) { + throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", RuleFileType.COMPONENT, dossierTemplate.getId())); + } + RuleSetEntity componentRuleSet = componentRuleSetOptional.get(); fileSystemBackedArchiver.addEntries(new FileSystemBackedArchiver.ArchiveModel(folder, getFilename(ExportFilename.COMPONENT_RULES, RULE_EXT), componentRuleSet.getValue().getBytes(StandardCharsets.UTF_8))); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index 6d56e875e..c525a0be1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -168,11 +168,14 @@ public class DossierTemplateCloneService { private void cloneRules(String dossierTemplateId, String clonedDossierTemplateId) { for (RuleFileType ruleFileType : RuleFileType.values()) { - try { - rulesPersistenceService.setRules(rulesPersistenceService.getRules(dossierTemplateId, ruleFileType).getValue(), clonedDossierTemplateId, ruleFileType); - } catch (NotFoundException e) { - log.debug("No {} rules found, will not be cloned!", ruleFileType); - } + var rulesOptional = rulesPersistenceService.getRules(dossierTemplateId, ruleFileType); + + if (rulesOptional.isEmpty()) { + log.debug("No {} rules found, will not be cloned!", ruleFileType); + } else { + rulesPersistenceService.setRules(rulesOptional.get().getValue(), clonedDossierTemplateId, ruleFileType); + } + } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java index a1bd54ad1..95b902fa8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java @@ -140,15 +140,14 @@ public class DossierTemplatePersistenceService { if (legalBasis == null || legalBasis.isEmpty()) { return DossierTemplateStatus.INCOMPLETE; } - try { - rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.ENTITY); - } catch (NotFoundException e) { + + var rulesOptional = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.ENTITY); + if (rulesOptional.isEmpty()) { return DossierTemplateStatus.INCOMPLETE; } if (applicationType.equals("DocuMine")) { - try { - rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.COMPONENT); - } catch (NotFoundException e) { + var componentRulesOptional = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.COMPONENT); + if (componentRulesOptional.isEmpty()) { return DossierTemplateStatus.INCOMPLETE; } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java index cc80d2b39..4205a9d36 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java @@ -1,5 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; +import java.util.Optional; + import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.RuleSetEntity; @@ -105,10 +107,9 @@ public class RulesPersistenceService { @Transactional - public RuleSetEntity getRules(String dossierTemplateId, RuleFileType ruleFileType) { + public Optional getRules(String dossierTemplateId, RuleFileType ruleFileType) { - return ruleSetRepository.findByDossierTemplateIdAndRuleFileType(dossierTemplateId, ruleFileType.name()) - .orElseThrow(() -> new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId))); + return ruleSetRepository.findByDossierTemplateIdAndRuleFileType(dossierTemplateId, ruleFileType.name()); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java index 37b71d4cd..67b9fab84 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java @@ -246,7 +246,7 @@ public class DossierTemplateCloneServiceTest { OffsetDateTime validTo = OffsetDateTime.now().plusYears(4); dummyTemplate.setValidTo(validTo); - when(rulesPersistenceService.getRules(anyString(), any())).thenReturn(new RuleSetEntity()); + when(rulesPersistenceService.getRules(anyString(), any())).thenReturn(Optional.of(new RuleSetEntity())); when(legalBasisMappingPersistenceService.getLegalBasisMapping(anyString())).thenReturn(List.of(LegalBasisEntity.builder() .name("dummy-name") .description("dummy-description") diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java index 1f16eac6b..844c4d50b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java @@ -1,6 +1,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; import java.io.ByteArrayOutputStream; import java.io.File; @@ -9,22 +11,31 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; 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.exception.BadRequestException; 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.RuleFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.iqser.red.service.redaction.v1.model.DroolsBlacklistErrorMessage; +import com.iqser.red.service.redaction.v1.model.DroolsValidation; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -122,6 +133,31 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT assertThat(dt2.getName()).isEqualTo("Copy of EFSA sanitisation GFL v1"); } + @Test + void testDossierTemplateImportDMWithError() { + + TenantContext.setTenantId("redaction"); + + List blacklistErrorMessages = new ArrayList<>(); + List blacklistedKeywords = new ArrayList<>(); + blacklistedKeywords.add("System."); + blacklistErrorMessages.add(DroolsBlacklistErrorMessage.builder().blacklistedKeywords(blacklistedKeywords).build()); + when(redactionClient.testRules(new RuleValidationModel(RuleFileType.COMPONENT.name(), Mockito.any()))).thenReturn(DroolsValidation.builder() + .syntaxErrorMessages(Collections.emptyList()) + .deprecatedWarnings(Collections.emptyList()) + .blacklistErrorMessages(blacklistErrorMessages) + .build()); + + var archive = loadFileFromClasspath("Flora.zip"); + var request = ImportDossierTemplateRequest.builder().archive(archive).updateExistingDossierTemplate(false).userId("system").build(); + var e = assertThrows(BadRequestException.class, + () -> dossierTemplateManagementService.importDossierTemplate(request)); + + var reportTemplates = reportTemplateRepository.findAll(); + assertThat(reportTemplates).hasSize(2); + var alldossierTemplates = dossierTemplateManagementService.getAllDossierTemplates(); + assertThat(alldossierTemplates).hasSize(1); + } @SneakyThrows