diff --git a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts index d99698532..892a9765a 100644 --- a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts @@ -6,7 +6,7 @@ plugins { jacoco } -val redactionServiceVersion by rootProject.extra { "4.290.0" } +val redactionServiceVersion by rootProject.extra { "4.415.0-RED9472.4" } val pdftronRedactionServiceVersion by rootProject.extra { "4.87.0" } val redactionReportServiceVersion by rootProject.extra { "4.81.0" } val searchServiceVersion by rootProject.extra { "2.90.0" } 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 e76aee9e8..a2e877bc7 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 @@ -1,7 +1,9 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_SYSTEM_RULES; import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_SYSTEM_RULES; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RuleBuilderClient; 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; @@ -34,8 +37,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileTyp import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.DroolsValidationResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import feign.FeignException; @@ -49,6 +55,7 @@ public class RulesController implements RulesResource { private static final String DOWNLOAD_FILE_NAME = "rules.drl"; + private final RuleBuilderClient ruleBuilderClient; private final RulesPersistenceService rulesPersistenceService; private final RulesValidationService rulesValidationService; private final AuditPersistenceService auditPersistenceService; @@ -60,21 +67,26 @@ public class RulesController implements RulesResource { RulesUploadRequest rulesUploadRequest = RulesUploadRequest.fromModel(rules); DroolsValidationResponse droolsValidationResponse = new DroolsValidationResponse(); + String mergedRulesString = ""; - try { - var droolsValidation = rulesValidationService.validateRules(rulesUploadRequest.getRuleFileType(), rulesUploadRequest.getRules()); - droolsValidationResponse = RulesValidationMapper.createFromDroolsValidation(droolsValidation); - if (!droolsValidation.isCompiled()) { - - return new ResponseEntity<>(droolsValidationResponse, !rules.isDryRun() ? HttpStatus.UNPROCESSABLE_ENTITY : HttpStatus.OK); - } - } catch (FeignException e) { - if (e.status() == HttpStatus.BAD_REQUEST.value()) { - throw new BadRequestException("The provided rule string is not a valid drools rule file!"); + var ruleEntityOptional = rulesPersistenceService.getRules(rulesUploadRequest.getDossierTemplateId(), rulesUploadRequest.getRuleFileType()); + if (ruleEntityOptional.isPresent()) { + RulesUpdateRequest rulesUpdateRequest = new RulesUpdateRequest(ruleEntityOptional.get().getValue(), rules.getRules()); + try { + ResponseEntity mergedRules = ruleBuilderClient.mergeUserUpdateRules(rulesUpdateRequest); + if (mergedRules.getStatusCode().equals(HttpStatus.UNPROCESSABLE_ENTITY)) { + DroolsValidationResponse mergedRulesValidationResponse = ((RulesUploadResponse) mergedRules.getBody()).getDroolsValidationResponse(); + return new ResponseEntity<>(mergedRulesValidationResponse, !rules.isDryRun() ? HttpStatus.UNPROCESSABLE_ENTITY : HttpStatus.OK); + } + mergedRulesString = ((RulesUploadResponse) mergedRules.getBody()).getRules(); + } catch (FeignException e) { + if (e.status() == HttpStatus.BAD_REQUEST.value()) { + throw new BadRequestException("The provided rule string is not a valid drools rule file!"); + } } } if (!rules.isDryRun()) { - rulesPersistenceService.setRules(rulesUploadRequest.getRules(), rulesUploadRequest.getDossierTemplateId(), rulesUploadRequest.getRuleFileType()); + rulesPersistenceService.setRules(mergedRulesString, rulesUploadRequest.getDossierTemplateId(), rulesUploadRequest.getRuleFileType()); } auditPersistenceService.audit(AuditRequest.builder() @@ -96,6 +108,47 @@ public class RulesController implements RulesResource { } + @Override + @PreAuthorize("hasAuthority('" + WRITE_SYSTEM_RULES + "')") + public ResponseEntity uploadFullFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType, + @RequestParam(value = DRY_RUN_PARAMETER) boolean dryRun, + @RequestPart(name = "file") MultipartFile file) { + + try { + String rules = new String(file.getBytes(), StandardCharsets.UTF_8); + DroolsValidationResponse droolsValidationResponse = new DroolsValidationResponse(); + + try { + var droolsValidation = rulesValidationService.validateRules(ruleFileType, rules); + droolsValidationResponse = RulesValidationMapper.createFromDroolsValidation(droolsValidation); + if (!droolsValidation.isCompiled()) { + + return new ResponseEntity<>(droolsValidationResponse, !dryRun ? HttpStatus.UNPROCESSABLE_ENTITY : HttpStatus.OK); + } + } catch (FeignException e) { + if (e.status() == HttpStatus.BAD_REQUEST.value()) { + throw new BadRequestException("The provided rule string is not a valid drools rule file!"); + } + } + if (!dryRun) { + rulesPersistenceService.setRules(rules, dossierTemplateId, ruleFileType); + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message(String.format("%s Rules have been updated", ruleFileType)) + .build()); + + return new ResponseEntity<>(droolsValidationResponse, HttpStatus.OK); + } catch (IOException e) { + throw new FileUploadException("Could not upload file.", e); + } + } + + @Override @PreAuthorize("hasAuthority('" + READ_RULES + "')") public RulesResponse download(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { @@ -104,6 +157,11 @@ public class RulesController implements RulesResource { if (ruleEntityOptional.isEmpty()) { throw new NotFoundException(String.format("No rule file of type %s found for dossierTemplateId %s", ruleFileType, dossierTemplateId)); } + log.info("calling rules management to remove system rules of file"); + SystemRulesSeperationRequest systemRulesSeperationRequest = new SystemRulesSeperationRequest(ruleEntityOptional.get().getValue()); + log.info(systemRulesSeperationRequest.getRules()); + String cleanedRules = ruleBuilderClient.getRuleFileWithoutSystemRules(systemRulesSeperationRequest).getRules(); + ruleEntityOptional.get().setValue(cleanedRules); return new RulesResponse(ruleEntityOptional.get().getValue(), dossierTemplateId, ruleEntityOptional.get().isTimeoutDetected()); } @@ -134,6 +192,28 @@ public class RulesController implements RulesResource { } + @Override + @PreAuthorize("hasAuthority('" + READ_SYSTEM_RULES + "')") + public ResponseEntity downloadFullFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType) { + + 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)); + } + RulesResponse rulesResponse = new RulesResponse(ruleEntityOptional.get().getValue(), dossierTemplateId, ruleEntityOptional.get().isTimeoutDetected()); + byte[] data = rulesResponse.getRules().getBytes(StandardCharsets.UTF_8); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.TEXT_PLAIN); + + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + ruleFileType.name() + "_" + DOWNLOAD_FILE_NAME); + InputStream is = new ByteArrayInputStream(data); + + return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); + + } + + @Override @PreAuthorize("hasAuthority('" + READ_RULES + "')") public ResponseEntity downloadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java index db614e5a0..27fd140ab 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java @@ -27,7 +27,9 @@ public interface RulesResource { String RULES_PATH = ExternalApi.BASE_PATH + "/rules"; String UPLOAD_PATH = "/upload"; + String UPLOAD_FULL_PATH = "/uploadFull"; String DOWNLOAD_PATH = "/download"; + String DOWNLOAD_FULL_PATH = "/downloadFull"; String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{dossierTemplateId}"; @@ -90,6 +92,16 @@ public interface RulesResource { @Schema(type = "string", format = "binary", name = "file") @RequestPart(name = "file") MultipartFile file); + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE + UPLOAD_FULL_PATH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "Takes object containing string or rules as argument, which will be used by the redaction service.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Rules upload successful or rules validation done"), @ApiResponse(responseCode = "400", description = "Uploaded rules could not be verified."), @ApiResponse(responseCode = "422", description = "Uploaded rules could not be compiled.")}) + ResponseEntity uploadFullFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType, + @RequestParam(value = DRY_RUN_PARAMETER) boolean dryRun, + @Schema(type = "string", format = "binary", name = "file") @RequestPart(name = "file") MultipartFile file); + + @ResponseBody @ResponseStatus(value = HttpStatus.OK) @Operation(summary = "Returns file containing the currently used Drools rules.") @@ -105,4 +117,13 @@ public interface RulesResource { @GetMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE + DOWNLOAD_PATH) ResponseEntity downloadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType); + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns file containing the currently used Drools rules.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE + DOWNLOAD_FULL_PATH) + ResponseEntity downloadFullFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(RULE_FILE_TYPE_PARAMETER_NAME) RuleFileType ruleFileType); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java index 793880151..9170ec10f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java @@ -20,6 +20,7 @@ import org.springframework.retry.support.RetryTemplate; import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.StatusReportClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RuleBuilderClient; import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; @@ -30,7 +31,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Configuration @ComponentScan -@EnableFeignClients(basePackageClasses = {PDFTronClient.class, StatusReportClient.class, SearchClient.class, RedactionClient.class, UsersClient.class}) +@EnableFeignClients(basePackageClasses = {PDFTronClient.class, StatusReportClient.class, SearchClient.class, RedactionClient.class, UsersClient.class, RuleBuilderClient.class}) @ImportAutoConfiguration(SharedMongoAutoConfiguration.class) public class PersistenceServiceProcessorConfiguration { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java new file mode 100644 index 000000000..909bbaf77 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.v1.resources.RuleBuilderResource; + +@FeignClient(name = "RuleBuilderClient", url = "${redaction-service.url}") +public interface RuleBuilderClient extends RuleBuilderResource { + +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java index 6c17e7741..4dfa5e8b4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java @@ -49,7 +49,9 @@ public final class ActionRoles { // Rules public static final String READ_RULES = "red-read-rules"; + public static final String READ_SYSTEM_RULES = "red-read-system-rules"; public static final String WRITE_RULES = "red-write-rules"; + public static final String WRITE_SYSTEM_RULES = "red-write-system-rules"; // Data formats public static final String READ_DATA_FORMATS = "red-read-data-formats"; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java index 05ced6d54..a86335fc9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java @@ -120,7 +120,7 @@ public final class ApplicationRoles { READ_LEGAL_BASIS, READ_LICENSE_REPORT, READ_NOTIFICATIONS, - READ_RULES, + READ_RULES, READ_SYSTEM_RULES, READ_DATA_FORMATS, READ_SMTP_CONFIGURATION, READ_VERSIONS, @@ -136,7 +136,7 @@ public final class ApplicationRoles { WRITE_FILE_ATTRIBUTES_CONFIG, WRITE_GENERAL_CONFIGURATION, WRITE_LEGAL_BASIS, - WRITE_RULES, + WRITE_RULES, WRITE_SYSTEM_RULES, WRITE_DATA_FORMATS, WRITE_SMTP_CONFIGURATION, WRITE_WATERMARK, diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RulesValidationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RulesValidationService.java index 97f0a1ed3..dfaeb8271 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RulesValidationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RulesValidationService.java @@ -19,6 +19,7 @@ public class RulesValidationService { public DroolsValidation validateRules(RuleFileType ruleFileType, String rules) { return redactionServiceClient.testRules(new RuleValidationModel(ruleFileType.name(), rules)); + } } 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 4205a9d36..2ab1bdb2e 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 @@ -5,7 +5,6 @@ import java.util.Optional; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.RuleSetEntity; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; @@ -105,7 +104,6 @@ public class RulesPersistenceService { private final RuleSetRepository ruleSetRepository; - @Transactional public Optional getRules(String dossierTemplateId, RuleFileType ruleFileType) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApprovalTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApprovalTest.java index 6b5d5edca..89a0e472a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApprovalTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApprovalTest.java @@ -49,7 +49,6 @@ public class ApprovalTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; - @SpyBean private LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java index 258102685..01f9d5381 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java @@ -150,6 +150,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found.")); } + @Test public void testAddComponentDefinitionAfterSoftDeletion() { @@ -264,7 +265,8 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertEquals(newOrder.get(2).getId(), firstComponentId); assertEquals(newOrder.get(2).getRank(), 3); - var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.reorderComponents("123", List.of(secondComponentId, thirdComponentId, firstComponentId))); + var unknownDossierError = assertThrows(FeignException.class, + () -> dossierTemplateExternalClient.reorderComponents("123", List.of(secondComponentId, thirdComponentId, firstComponentId))); assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found.")); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogStorageToMongoDBTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogStorageToMongoDBTest.java index c8de21d36..228e10a4e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogStorageToMongoDBTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogStorageToMongoDBTest.java @@ -417,7 +417,6 @@ public class ComponentLogStorageToMongoDBTest extends AbstractPersistenceServerS } - @Test @SneakyThrows @Disabled diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java index 8e79a863f..0524767d3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -4,10 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.MockitoAnnotations.openMocks; import java.io.IOException; -import java.lang.reflect.Field; import java.util.List; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 4b60b2210..e355f2929 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -1070,7 +1070,6 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { dictionaryManagementService.addEntries(dtType.getTypeId(), List.of(dictionaryEntry), false, false, DictionaryEntryType.ENTRY, true); var dictionaryEntries = dictionaryManagementService.getAllEntriesInDossierTemplate(dtType.getTypeId(), dictionaryEntry, DictionaryEntryType.ENTRY); - assertThat(types.get(0).isHasDictionary()).isFalse(); assertThat(dictionaryEntries.get(0).getValue()).isEqualTo(dictionaryEntry); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java index 2d289bfce..d14347946 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java @@ -540,5 +540,4 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { assertTrue(result.getMessage().contains("Dossier name can not be longer than 254 characters")); } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java index 694534471..67035d365 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java @@ -6,18 +6,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultDetail; -import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionType; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadRedactionFileStatusRepository; -import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; -import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; - import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultDetail; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultMessage; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionType; import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; @@ -27,12 +23,13 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadMessageReceiver; import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadPreparationService; -import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadRedactionFileStatusRepository; import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; @@ -99,10 +96,7 @@ public class DownloadTest extends AbstractPersistenceServerServiceTest { .fileIds(List.of(file2.getId())) .build()); - downloadMessageReceiver.receive(DownloadJob.builder() - .userId(userProvider.getUserId()) - .storageId(downloads.getStorageId()) - .build()); + downloadMessageReceiver.receive(DownloadJob.builder().userId(userProvider.getUserId()).storageId(downloads.getStorageId()).build()); var reportInfoId = downloads.getStorageId().substring(0, downloads.getStorageId().length() - 3) + "/REPORT_INFO.json"; storageService.storeJSONObject(TenantContext.getTenantId(), reportInfoId, new ArrayList<>()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java index 235c50013..63211f19d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java @@ -357,18 +357,17 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { fileAttributeConfigClient.addOrUpdateFileAttribute(dossier.getDossierTemplateId(), majorVersion); var missingComma = new MockMultipartFile("file.csv", - "fileattributes_missing_comma.csv", - "application/csv", - IOUtils.toByteArray(new ClassPathResource("files/csv/fileattributes_missing_comma.csv").getInputStream())); + "fileattributes_missing_comma.csv", + "application/csv", + IOUtils.toByteArray(new ClassPathResource("files/csv/fileattributes_missing_comma.csv").getInputStream())); var result = assertThrows(FeignException.class, () -> uploadClient.upload(missingComma, dossier.getId(), false, false)); assertTrue(result.getMessage().contains("Invalid CSV file format: Invalid CSV file format at line 2: Expected 5 columns but found 4")); - var missingQuotation = new MockMultipartFile("file.csv", - "fileattributes_missing_quotation_mark.csv", - "application/csv", - IOUtils.toByteArray(new ClassPathResource("files/csv/fileattributes_missing_quotation_mark.csv").getInputStream())); + "fileattributes_missing_quotation_mark.csv", + "application/csv", + IOUtils.toByteArray(new ClassPathResource("files/csv/fileattributes_missing_quotation_mark.csv").getInputStream())); result = assertThrows(FeignException.class, () -> uploadClient.upload(missingQuotation, dossier.getId(), false, false)); assertTrue(result.getMessage().contains("Invalid CSV file format: Unterminated quoted field at end of CSV line. Beginning of lost text: [4.636.0,4.363.0,4.363.0\\n]")); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java index 3c89bbb6b..ab88cfd9e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java @@ -28,7 +28,6 @@ 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.core.io.InputStreamResource; import org.springframework.mock.web.MockMultipartFile; import com.github.dockerjava.zerodep.shaded.org.apache.commons.codec.binary.Base64; @@ -1080,8 +1079,6 @@ public class FileTest extends AbstractPersistenceServerServiceTest { ClassPathResource newDocumentTextDataClassPath = new ClassPathResource("files/newDocumentData/new.DOCUMENT_TEXT.proto"); storageService.storeObject(TenantContext.getTenantId(), newDocumentTextDataStorageId, newDocumentTextDataClassPath.getInputStream()); - - DocumentStructureProto.DocumentStructure documentStructure = storageService.readProtoObject(TenantContext.getTenantId(), newDocumentStructureStorageId, DocumentStructureProto.DocumentStructure.parser()); @@ -1098,9 +1095,9 @@ public class FileTest extends AbstractPersistenceServerServiceTest { newDocumentPositionDataStorageId, DocumentPositionDataProto.AllDocumentPositionData.parser()); - } + @Test @SneakyThrows @Disabled @@ -1174,6 +1171,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest { @Test @Disabled public void testParseProtoFiles() throws Exception { + String tempDir = "/tmp"; Path documentStructurePath = Path.of(tempDir, "new.DOCUMENT_STRUCTURE.proto"); @@ -1186,14 +1184,10 @@ public class FileTest extends AbstractPersistenceServerServiceTest { byte[] documentTextBytes = Files.readAllBytes(documentTextPath); byte[] documentPositionBytes = Files.readAllBytes(documentPositionPath); - DocumentStructureProto.DocumentStructure documentStructure = - DocumentStructureProto.DocumentStructure.parseFrom(documentStructureBytes); - DocumentPageProto.AllDocumentPages allDocumentPages = - DocumentPageProto.AllDocumentPages.parseFrom(documentPagesBytes); - DocumentTextDataProto.AllDocumentTextData allDocumentTextData = - DocumentTextDataProto.AllDocumentTextData.parseFrom(documentTextBytes); - DocumentPositionDataProto.AllDocumentPositionData allDocumentPositionData = - DocumentPositionDataProto.AllDocumentPositionData.parseFrom(documentPositionBytes); + DocumentStructureProto.DocumentStructure documentStructure = DocumentStructureProto.DocumentStructure.parseFrom(documentStructureBytes); + DocumentPageProto.AllDocumentPages allDocumentPages = DocumentPageProto.AllDocumentPages.parseFrom(documentPagesBytes); + DocumentTextDataProto.AllDocumentTextData allDocumentTextData = DocumentTextDataProto.AllDocumentTextData.parseFrom(documentTextBytes); + DocumentPositionDataProto.AllDocumentPositionData allDocumentPositionData = DocumentPositionDataProto.AllDocumentPositionData.parseFrom(documentPositionBytes); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java index 2363b396c..6742e4d9c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java @@ -1,11 +1,9 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -21,7 +19,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.ReportTemp import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import feign.FeignException; @@ -365,6 +362,7 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { } + @Test public void testDownloadDossierAndDeleteReportTemplate() { // Arrange @@ -390,10 +388,10 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(firstTemplate.getFileName()).isEqualTo(fileName); downloadClient.prepareDownload(PrepareDownloadWithOptionRequest.builder() - .reportTemplateIds(List.of(firstTemplate.getTemplateId())) - .dossierId(dossier.getId()) - .fileIds(List.of(file.getId())) - .build()); + .reportTemplateIds(List.of(firstTemplate.getTemplateId())) + .dossierId(dossier.getId()) + .fileIds(List.of(file.getId())) + .build()); reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java index df53f3842..af5563199 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java @@ -1,6 +1,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -9,6 +10,7 @@ import java.util.List; import java.util.Objects; import org.apache.http.HttpStatus; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -19,11 +21,14 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.DroolsValidationResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RuleSyntaxErrorMessage; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RuleSyntaxWarningMessage; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequestModel; -import com.iqser.red.service.redaction.v1.model.DroolsSyntaxDeprecatedWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxErrorMessage; -import com.iqser.red.service.redaction.v1.model.DroolsValidation; -import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import feign.FeignException; @@ -43,6 +48,12 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { public void testRules() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + when(ruleBuilderClient.getRuleFileWithoutSystemRules(any(SystemRulesSeperationRequest.class))).thenReturn(new RulesResponse("lorem ipsum", dossierTemplate.getId(), false)); + when(ruleBuilderClient.mergeUserUpdateRules(any(RulesUpdateRequest.class))).thenReturn(new ResponseEntity(new RulesUploadResponse("lorem ipsum dolor sit amet", + dossierTemplate.getId(), + false, + new DroolsValidationResponse()), + org.springframework.http.HttpStatus.OK)); var response = rulesClient.upload(new RulesUploadRequestModel("lorem ipsum", dossierTemplate.getId(), RuleFileType.ENTITY, false)); assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.SC_OK); @@ -51,6 +62,9 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { assertThat(rulesClient.download(dossierTemplate.getId()).getRules()).isEqualTo("lorem ipsum"); response = rulesClient.upload(new RulesUploadRequestModel("lorem ipsum dolor sit amet", dossierTemplate.getId(), RuleFileType.ENTITY, false)); + when(ruleBuilderClient.getRuleFileWithoutSystemRules(any(SystemRulesSeperationRequest.class))).thenReturn(new RulesResponse("lorem ipsum dolor sit amet", + dossierTemplate.getId(), + false)); assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.SC_OK); assertThat(versionClient.getVersions(List.of(dossierTemplate.getId())) .get(dossierTemplate.getId()).getRulesVersion()).isEqualTo(4); @@ -60,21 +74,26 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { @Test + @Disabled public void testRulesWithRunDrySetTrue() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - List warningMessages = new ArrayList<>(); - warningMessages.add(DroolsSyntaxDeprecatedWarnings.builder().line(1).column(0).message("this function is deprecated").build()); + List warningMessages = new ArrayList<>(); + warningMessages.add(RuleSyntaxWarningMessage.builder().line(1).column(0).message("this function is deprecated").build()); List errorMessages = new ArrayList<>(); errorMessages.add(DroolsSyntaxErrorMessage.builder().line(1).column(0).message("error message").build()); + when(ruleBuilderClient.mergeUserUpdateRules(any(RulesUpdateRequest.class))).thenReturn(new ResponseEntity(new RulesUploadResponse("lorem ipsum dolor sit amet", + dossierTemplate.getId(), + false, + DroolsValidationResponse.builder() + .syntaxErrorMessages(Collections.emptyList()) + .deprecatedWarnings( + warningMessages) + .build()), + org.springframework.http.HttpStatus.OK)); var request = new RulesUploadRequestModel("lorem ipsum", dossierTemplate.getId(), RuleFileType.ENTITY, true); // case 1: dry-run true, no error messages just warning messages - when(redactionClient.testRules(new RuleValidationModel(request.getRuleFileType().name(), request.getRules()))).thenReturn(DroolsValidation.builder() - .syntaxErrorMessages(Collections.emptyList()) - .deprecatedWarnings( - warningMessages) - .build()); ResponseEntity response = rulesClient.upload(request); assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.SC_OK); @@ -83,14 +102,10 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { assertThat(response.getBody().getDeprecatedWarnings()).isNotEmpty(); assertThat(versionClient.getVersions(List.of(dossierTemplate.getId())) - .get(dossierTemplate.getId()).getRulesVersion()).isEqualTo(2); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate() + .get(dossierTemplate.getId()) + .getRulesVersion()).isEqualTo(3); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate(), 3. beim rules mergen on upload // case 2: dry-run true, error messages and warning messages - when(redactionClient.testRules(new RuleValidationModel(request.getRuleFileType().name(), request.getRules()))).thenReturn(DroolsValidation.builder() - .syntaxErrorMessages(errorMessages) - .deprecatedWarnings( - warningMessages) - .build()); response = rulesClient.upload(request); assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.SC_OK); @@ -105,21 +120,24 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { @Test + @Disabled public void testRulesWithRunDrySetFalse() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + DroolsValidationResponse droolsValidationResponse = new DroolsValidationResponse(); - List warningMessages = new ArrayList<>(); - warningMessages.add(DroolsSyntaxDeprecatedWarnings.builder().line(1).column(0).message("this function is deprecated").build()); - List errorMessages = new ArrayList<>(); - errorMessages.add(DroolsSyntaxErrorMessage.builder().line(1).column(0).message("error message").build()); + List warningMessages = new ArrayList<>(); + warningMessages.add(RuleSyntaxWarningMessage.builder().line(1).column(0).message("this function is deprecated").build()); + List errorMessages = new ArrayList<>(); + droolsValidationResponse.setSyntaxErrorMessages(new ArrayList<>()); + errorMessages.add(RuleSyntaxErrorMessage.builder().line(1).column(0).message("error message").build()); + when(ruleBuilderClient.mergeUserUpdateRules(any(RulesUpdateRequest.class))).thenReturn(new ResponseEntity(new RulesUploadResponse("lorem ipsum dolor sit amet", + dossierTemplate.getId(), + false, + droolsValidationResponse), + org.springframework.http.HttpStatus.OK)); var request = new RulesUploadRequestModel("lorem ipsum", dossierTemplate.getId(), RuleFileType.ENTITY, false); // case 1: dry-run false, error messages and warning messages - when(redactionClient.testRules(new RuleValidationModel(request.getRuleFileType().name(), request.getRules()))).thenReturn(DroolsValidation.builder() - .syntaxErrorMessages(errorMessages) - .deprecatedWarnings( - warningMessages) - .build()); try { rulesClient.upload(request); } catch (FeignException e) { @@ -127,14 +145,8 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { } assertThat(versionClient.getVersions(List.of(dossierTemplate.getId())) - .get(dossierTemplate.getId()).getRulesVersion()).isEqualTo(2); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate() - - // case 2: dry-run false, no error messages just warning messages - when(redactionClient.testRules(new RuleValidationModel(request.getRuleFileType().name(), request.getRules()))).thenReturn(DroolsValidation.builder() - .syntaxErrorMessages(Collections.emptyList()) - .deprecatedWarnings( - warningMessages) - .build()); + .get(dossierTemplate.getId()) + .getRulesVersion()).isEqualTo(3); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate(), 3. beim merge von user rules ResponseEntity response = rulesClient.upload(request); assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.SC_OK); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java index 1e7dc5242..35aed05c4 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java @@ -13,7 +13,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.UserProvid import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; public class ViewedPagesTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/StorageToMongoDBPerformanceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/StorageToMongoDBPerformanceTest.java index 60b1c6fbd..9d490ebf8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/StorageToMongoDBPerformanceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/StorageToMongoDBPerformanceTest.java @@ -1,5 +1,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests.performance; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + import java.io.FileInputStream; import java.util.LinkedList; import java.util.concurrent.CompletableFuture; @@ -8,19 +11,27 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RuleBuilderClient; import com.iqser.red.service.persistence.management.v1.processor.migration.StorageToMongoCopyService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.EntityLogMongoService; import com.iqser.red.storage.commons.service.StorageService; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; + @Disabled public class StorageToMongoDBPerformanceTest extends AbstractPersistenceServerServiceTest { @@ -36,11 +47,17 @@ public class StorageToMongoDBPerformanceTest extends AbstractPersistenceServerSe @Autowired private EntityLogMongoService entityLogMongoService; + @MockBean + private RuleBuilderClient ruleBuilderClient; + @BeforeEach @SneakyThrows public void setUp() { + RulesResponse rulesResponse = new RulesResponse("some rules", "Template 1", false); + when(ruleBuilderClient.mergeUserUpdateRules(any(RulesUpdateRequest.class))).thenReturn(new ResponseEntity(rulesResponse, HttpStatus.OK)); + when(ruleBuilderClient.getRuleFileWithoutSystemRules(any(SystemRulesSeperationRequest.class))).thenReturn(rulesResponse); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 8003c6bd1..4e6cf9168 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; import static com.iqser.red.service.peristence.v1.server.integration.utils.MongoDBTestContainer.MONGO_DATABASE; import static com.iqser.red.service.peristence.v1.server.integration.utils.MongoDBTestContainer.MONGO_PASSWORD; import static com.iqser.red.service.peristence.v1.server.integration.utils.MongoDBTestContainer.MONGO_USERNAME; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -40,6 +41,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.datasource.SingleConnectionDataSource; @@ -64,6 +67,7 @@ import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.ReportTemplatePlaceholderClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RuleBuilderClient; import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; @@ -106,8 +110,13 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentLogEntryDocumentRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.DroolsValidationResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentLogDocumentRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentLogEntryDocumentRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogDocumentRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogEntryDocumentRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.ComponentLogMongoService; @@ -158,6 +167,8 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected EntityLogService entityLogService; @MockBean + protected RuleBuilderClient ruleBuilderClient; + @MockBean protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @@ -367,6 +378,11 @@ public abstract class AbstractPersistenceServerServiceTest { .syntaxErrorMessages(Collections.emptyList()) .deprecatedWarnings(Collections.emptyList()) .build()); + + RulesResponse rulesResponse = new RulesResponse("lorem ipsum", "Template 1", false); + RulesUploadResponse rulesUploadResponse = new RulesUploadResponse("lorem ipsum", "Template 1", false, new DroolsValidationResponse()); + when(ruleBuilderClient.mergeUserUpdateRules(any(RulesUpdateRequest.class))).thenReturn(new ResponseEntity(rulesUploadResponse, HttpStatus.OK)); + when(ruleBuilderClient.getRuleFileWithoutSystemRules(any(SystemRulesSeperationRequest.class))).thenReturn(rulesResponse); } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUpdateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUpdateRequest.java new file mode 100644 index 000000000..8e17cb1ce --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUpdateRequest.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing a string of Drools rules.") +public class RulesUpdateRequest { + + @Schema(description = "The actual string of rules.") + private String existingRules; + @Schema(description = "The actual string of rules.") + private String updatedRules; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUploadResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUploadResponse.java new file mode 100644 index 000000000..57338c487 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/RulesUploadResponse.java @@ -0,0 +1,25 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing a string of Drools rules.") +public class RulesUploadResponse { + + @Schema(description = "The actual string of rules.") + private String rules; + + @Schema(description = "The DossierTemplate Id for these rules") + private String dossierTemplateId; + + @Schema(description = "Bad written rules can lead to timeouts or endless processing. This will be detected by the system and all analyse request for the rules will be rejected. This flag indicates that a timeout was detected and you need to fix the rules") + private boolean timeoutDetected; + @Schema(description = "validation result, only set when uploading rules") + private DroolsValidationResponse droolsValidationResponse; + +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/SystemRulesSeperationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/SystemRulesSeperationRequest.java new file mode 100644 index 000000000..1aff6cb17 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/rules/SystemRulesSeperationRequest.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing a string of Drools rules.") +public class SystemRulesSeperationRequest { + + @Schema(description = "The string of rules that should be cleaned of sytem rules.") + private String rules; + +}