From 0c1670461b70210a6c95fa90694d237b7f9cded4 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 01/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- ...er.red.service.java-conventions.gradle.kts | 2 +- .../api/impl/controller/RulesController.java | 102 ++++++++++++++++-- .../api/external/resource/RulesResource.java | 21 ++++ ...sistenceServiceProcessorConfiguration.java | 3 +- .../redactionservice/RuleBuilderClient.java | 10 ++ .../v1/processor/roles/ActionRoles.java | 2 + .../v1/processor/roles/ApplicationRoles.java | 4 +- .../service/RulesValidationService.java | 1 + .../persistence/RulesPersistenceService.java | 2 - .../integration/tests/ApprovalTest.java | 1 - .../tests/ComponentDefinitionTests.java | 4 +- .../ComponentLogStorageToMongoDBTest.java | 1 - .../tests/ComponentOverrideTest.java | 2 - .../integration/tests/DictionaryTest.java | 1 - .../server/integration/tests/DossierTest.java | 1 - .../integration/tests/DownloadTest.java | 16 +-- .../integration/tests/FileAttributeTest.java | 13 ++- .../v1/server/integration/tests/FileTest.java | 18 ++-- .../integration/tests/ReportTemplateTest.java | 12 +-- .../server/integration/tests/RulesTest.java | 78 ++++++++------ .../integration/tests/ViewedPagesTest.java | 1 - .../StorageToMongoDBPerformanceTest.java | 17 +++ .../AbstractPersistenceServerServiceTest.java | 18 +++- .../rules/RulesUpdateRequest.java | 19 ++++ .../rules/RulesUploadResponse.java | 25 +++++ .../rules/SystemRulesSeperationRequest.java | 17 +++ 26 files changed, 295 insertions(+), 96 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java create mode 100644 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 create mode 100644 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 create mode 100644 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 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; + +} From d2380d47b2d62f36d1d927c6bbade5e359ec6d86 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 02/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- ...er.red.service.java-conventions.gradle.kts | 2 +- .../api/impl/controller/RulesController.java | 102 ++++++++++++++++-- .../api/external/resource/RulesResource.java | 21 ++++ ...sistenceServiceProcessorConfiguration.java | 3 +- .../redactionservice/RuleBuilderClient.java | 10 ++ .../v1/processor/roles/ActionRoles.java | 2 + .../v1/processor/roles/ApplicationRoles.java | 4 +- .../service/RulesValidationService.java | 1 + .../persistence/RulesPersistenceService.java | 2 - .../integration/tests/ApprovalTest.java | 1 - .../tests/ComponentDefinitionTests.java | 4 +- .../ComponentLogStorageToMongoDBTest.java | 1 - .../integration/tests/DictionaryTest.java | 1 - .../server/integration/tests/DossierTest.java | 1 - .../integration/tests/DownloadTest.java | 16 +-- .../integration/tests/FileAttributeTest.java | 13 ++- .../integration/tests/ReportTemplateTest.java | 12 +-- .../server/integration/tests/RulesTest.java | 78 ++++++++------ .../integration/tests/ViewedPagesTest.java | 1 - .../StorageToMongoDBPerformanceTest.java | 17 +++ .../AbstractPersistenceServerServiceTest.java | 11 ++ .../rules/RulesUpdateRequest.java | 19 ++++ .../rules/RulesUploadResponse.java | 25 +++++ .../rules/SystemRulesSeperationRequest.java | 17 +++ 24 files changed, 283 insertions(+), 81 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java create mode 100644 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 create mode 100644 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 create mode 100644 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 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 370f0c9d4..e4997b98b 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.89.0-RED10196.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 1b086c7fe..7bc836c3c 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; @@ -35,8 +38,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; @@ -50,6 +56,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; @@ -62,21 +69,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()); fileStatusPersistenceService.resetErrorCounter(rules.getDossierTemplateId()); } @@ -99,6 +111,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) { @@ -107,6 +160,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()); } @@ -137,6 +195,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 d9e7aa7a7..84463b84f 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 @@ -28,7 +28,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}"; @@ -91,6 +93,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.") @@ -112,4 +124,13 @@ public interface RulesResource { @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No content")}) @PutMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) void unlockRules(@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 1790b52b0..8fc2088fd 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 1c2bba587..ab54c40cb 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 @@ -6,7 +6,6 @@ import org.springframework.http.ResponseEntity; 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; @@ -106,7 +105,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/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 b8c80ef18..5aa8377c3 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 @@ -1103,7 +1103,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 1204fd54e..2114f72d2 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 @@ -543,5 +543,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 93ba08588..a4f0302b8 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]") || result.getMessage().contains("Invalid CSV file format: Unterminiertes Anführungszeichen am Ende einer CSV-Zeile. Anfang des verlorenen Textes: [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/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 ecc744a57..ca14ab99c 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 @@ -5,6 +5,7 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -34,6 +35,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; @@ -58,6 +61,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.dataexchange.service.SystemManagedTypesImport; @@ -165,6 +169,8 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected EntityLogService entityLogService; @MockBean + protected RuleBuilderClient ruleBuilderClient; + @MockBean protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @@ -381,6 +387,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; + +} From 94f288fc0ff45ab0384d76fdf5ecc31b9ee1ba9b Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 18 Nov 2024 09:45:26 +0100 Subject: [PATCH 03/17] RED-9472: solving merge conflicts --- .../AbstractPersistenceServerServiceTest.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) 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 ca14ab99c..f1ac53605 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 @@ -5,7 +5,6 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -16,6 +15,15 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import org.assertj.core.util.Lists; +import org.bson.BsonArray; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.quartz.Scheduler; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.MessageListenerContainer; @@ -107,6 +115,11 @@ 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.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; @@ -139,16 +152,6 @@ import com.mongodb.client.MongoDatabase; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.Lists; -import org.bson.BsonArray; -import org.bson.BsonDocument; -import org.bson.BsonString; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.quartz.Scheduler; - @Slf4j @ExtendWith(SpringExtension.class) @EnableFeignClients(basePackageClasses = FileClient.class) From 65d72a60ac6bd8af6f40e91b05dae57d2029eee5 Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 18 Nov 2024 11:05:31 +0100 Subject: [PATCH 04/17] RED-9472: solving merge conflicts --- .../v1/external/api/impl/controller/RulesController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7bc836c3c..5ab60c1ac 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 @@ -83,7 +83,7 @@ public class RulesController implements RulesResource { 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!"); + throw new BadRequestException("The provided rule file is not a valid drools rule file!"); } } } From e5dd3e7abc15340729c5cefd6f8090de7c5ff8f6 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 05/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- ...er.red.service.java-conventions.gradle.kts | 2 +- .../api/impl/controller/RulesController.java | 102 ++++++++++++++++-- .../api/external/resource/RulesResource.java | 21 ++++ ...sistenceServiceProcessorConfiguration.java | 3 +- .../redactionservice/RuleBuilderClient.java | 10 ++ .../v1/processor/roles/ActionRoles.java | 2 + .../v1/processor/roles/ApplicationRoles.java | 4 +- .../service/RulesValidationService.java | 1 + .../persistence/RulesPersistenceService.java | 2 - .../integration/tests/ApprovalTest.java | 1 - .../tests/ComponentDefinitionTests.java | 4 +- .../ComponentLogStorageToMongoDBTest.java | 1 - .../integration/tests/DictionaryTest.java | 1 - .../server/integration/tests/DossierTest.java | 1 - .../integration/tests/DownloadTest.java | 16 +-- .../integration/tests/FileAttributeTest.java | 13 ++- .../integration/tests/ReportTemplateTest.java | 12 +-- .../server/integration/tests/RulesTest.java | 78 ++++++++------ .../integration/tests/ViewedPagesTest.java | 1 - .../StorageToMongoDBPerformanceTest.java | 17 +++ .../AbstractPersistenceServerServiceTest.java | 11 ++ .../rules/RulesUpdateRequest.java | 19 ++++ .../rules/RulesUploadResponse.java | 25 +++++ .../rules/SystemRulesSeperationRequest.java | 17 +++ 24 files changed, 283 insertions(+), 81 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java create mode 100644 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 create mode 100644 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 create mode 100644 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 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 370f0c9d4..e4997b98b 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.89.0-RED10196.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 1b086c7fe..7bc836c3c 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; @@ -35,8 +38,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; @@ -50,6 +56,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; @@ -62,21 +69,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()); fileStatusPersistenceService.resetErrorCounter(rules.getDossierTemplateId()); } @@ -99,6 +111,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) { @@ -107,6 +160,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()); } @@ -137,6 +195,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 81e87db57..ce3c70938 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 @@ -28,7 +28,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 RESET_PATH = "/reset"; String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; @@ -92,6 +94,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.") @@ -113,4 +125,13 @@ public interface RulesResource { @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No content")}) @PutMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE + RESET_PATH, produces = MediaType.APPLICATION_JSON_VALUE) void unlockRules(@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 1790b52b0..8fc2088fd 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 1c2bba587..ab54c40cb 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 @@ -6,7 +6,6 @@ import org.springframework.http.ResponseEntity; 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; @@ -106,7 +105,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/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 b8c80ef18..5aa8377c3 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 @@ -1103,7 +1103,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 1204fd54e..2114f72d2 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 @@ -543,5 +543,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 93ba08588..a4f0302b8 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]") || result.getMessage().contains("Invalid CSV file format: Unterminiertes Anführungszeichen am Ende einer CSV-Zeile. Anfang des verlorenen Textes: [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/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 ecc744a57..ca14ab99c 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 @@ -5,6 +5,7 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -34,6 +35,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; @@ -58,6 +61,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.dataexchange.service.SystemManagedTypesImport; @@ -165,6 +169,8 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected EntityLogService entityLogService; @MockBean + protected RuleBuilderClient ruleBuilderClient; + @MockBean protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @@ -381,6 +387,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; + +} From f31d9170f81f6376d91485e5cf989a3be0bd4bbb Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 06/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- .../AbstractPersistenceServerServiceTest.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) 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 ca14ab99c..f1ac53605 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 @@ -5,7 +5,6 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -16,6 +15,15 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import org.assertj.core.util.Lists; +import org.bson.BsonArray; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.quartz.Scheduler; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.MessageListenerContainer; @@ -107,6 +115,11 @@ 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.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; @@ -139,16 +152,6 @@ import com.mongodb.client.MongoDatabase; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.Lists; -import org.bson.BsonArray; -import org.bson.BsonDocument; -import org.bson.BsonString; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.quartz.Scheduler; - @Slf4j @ExtendWith(SpringExtension.class) @EnableFeignClients(basePackageClasses = FileClient.class) From 482cad2a465667bae47ae78d7caf6488f7b868e5 Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 18 Nov 2024 11:05:31 +0100 Subject: [PATCH 07/17] RED-9472: solving merge conflicts --- .../v1/external/api/impl/controller/RulesController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7bc836c3c..5ab60c1ac 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 @@ -83,7 +83,7 @@ public class RulesController implements RulesResource { 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!"); + throw new BadRequestException("The provided rule file is not a valid drools rule file!"); } } } From 7153681eb6b6d65f644f14aaf35f7b105b39dd6a Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 08/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- ...er.red.service.java-conventions.gradle.kts | 2 +- .../api/impl/controller/RulesController.java | 102 ++++++++++++++++-- .../api/external/resource/RulesResource.java | 21 ++++ ...sistenceServiceProcessorConfiguration.java | 3 +- .../redactionservice/RuleBuilderClient.java | 10 ++ .../v1/processor/roles/ActionRoles.java | 2 + .../v1/processor/roles/ApplicationRoles.java | 4 +- .../service/RulesValidationService.java | 1 + .../persistence/RulesPersistenceService.java | 2 - .../integration/tests/ApprovalTest.java | 1 - .../tests/ComponentDefinitionTests.java | 4 +- .../ComponentLogStorageToMongoDBTest.java | 1 - .../server/integration/tests/DossierTest.java | 1 - .../integration/tests/DownloadTest.java | 16 +-- .../integration/tests/FileAttributeTest.java | 13 ++- .../integration/tests/ReportTemplateTest.java | 12 +-- .../server/integration/tests/RulesTest.java | 78 ++++++++------ .../integration/tests/ViewedPagesTest.java | 1 - .../StorageToMongoDBPerformanceTest.java | 17 +++ .../AbstractPersistenceServerServiceTest.java | 11 ++ .../rules/RulesUpdateRequest.java | 19 ++++ .../rules/RulesUploadResponse.java | 25 +++++ .../rules/SystemRulesSeperationRequest.java | 17 +++ 23 files changed, 283 insertions(+), 80 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RuleBuilderClient.java create mode 100644 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 create mode 100644 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 create mode 100644 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 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 ce50d8ab3..7aa222798 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.90.0-RED10115.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 1b086c7fe..7bc836c3c 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; @@ -35,8 +38,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; @@ -50,6 +56,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; @@ -62,21 +69,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()); fileStatusPersistenceService.resetErrorCounter(rules.getDossierTemplateId()); } @@ -99,6 +111,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) { @@ -107,6 +160,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()); } @@ -137,6 +195,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 81e87db57..ce3c70938 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 @@ -28,7 +28,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 RESET_PATH = "/reset"; String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; @@ -92,6 +94,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.") @@ -113,4 +125,13 @@ public interface RulesResource { @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No content")}) @PutMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + RULE_FILE_TYPE_PATH_VARIABLE + RESET_PATH, produces = MediaType.APPLICATION_JSON_VALUE) void unlockRules(@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 1790b52b0..8fc2088fd 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 1c2bba587..ab54c40cb 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 @@ -6,7 +6,6 @@ import org.springframework.http.ResponseEntity; 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; @@ -106,7 +105,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 044a66552..114b55c5e 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/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 1204fd54e..2114f72d2 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 @@ -543,5 +543,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 93ba08588..a4f0302b8 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]") || result.getMessage().contains("Invalid CSV file format: Unterminiertes Anführungszeichen am Ende einer CSV-Zeile. Anfang des verlorenen Textes: [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/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 ecc744a57..ca14ab99c 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 @@ -5,6 +5,7 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -34,6 +35,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; @@ -58,6 +61,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.dataexchange.service.SystemManagedTypesImport; @@ -165,6 +169,8 @@ public abstract class AbstractPersistenceServerServiceTest { @MockBean protected EntityLogService entityLogService; @MockBean + protected RuleBuilderClient ruleBuilderClient; + @MockBean protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @@ -381,6 +387,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; + +} From 1991cfb8e597ac55c8ee778f5f28535be4c1573e Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 09/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- .../AbstractPersistenceServerServiceTest.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) 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 ca14ab99c..f1ac53605 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 @@ -5,7 +5,6 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -16,6 +15,15 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import org.assertj.core.util.Lists; +import org.bson.BsonArray; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.quartz.Scheduler; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.MessageListenerContainer; @@ -107,6 +115,11 @@ 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.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; @@ -139,16 +152,6 @@ import com.mongodb.client.MongoDatabase; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.Lists; -import org.bson.BsonArray; -import org.bson.BsonDocument; -import org.bson.BsonString; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.quartz.Scheduler; - @Slf4j @ExtendWith(SpringExtension.class) @EnableFeignClients(basePackageClasses = FileClient.class) From a02e48c17a5d1ae7da794c2dd8c24eeec400fe86 Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 18 Nov 2024 11:05:31 +0100 Subject: [PATCH 10/17] RED-9472: solving merge conflicts --- .../v1/external/api/impl/controller/RulesController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7bc836c3c..5ab60c1ac 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 @@ -83,7 +83,7 @@ public class RulesController implements RulesResource { 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!"); + throw new BadRequestException("The provided rule file is not a valid drools rule file!"); } } } From 11b799f8f4cc54d843cfe8b1ef9647a934c57a9b Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 13:05:53 +0200 Subject: [PATCH 11/17] RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules now calling respected endpoints in rules controller RED-9472: seperation of system rules removed rulesbuilder to fix failing pipeline and break circular dependency RED-9472: seperation of system rules added removal of system rules on download added partial merge of user updated rules on upload RED-9472: seperation of system rules upgdatet redaction version RED-9472: seperation of system rules added endpoints for full rule files (including system rules) added roles RED-9472: seperation of system rules changed path of full file paths RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests by mocking rulebuilder service RED-9472: seperation of system rules fixed failing tests added validatioresponse to rulesresponse RED-9472: seperation of system rules added a new model for rule upload RED-9472: seperation of system rules disabled tests for getting tag RED-9472: seperation of system rules RED-9472: seperation of system rules changed tests for new response of rulebuilderclient --- .../integration/utils/AbstractPersistenceServerServiceTest.java | 1 + 1 file changed, 1 insertion(+) 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 f1ac53605..d6712bda4 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 @@ -5,6 +5,7 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; From d26a0189fed0d6c77fd3f12aa0012c4aff3c2d6f Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 18 Nov 2024 09:45:26 +0100 Subject: [PATCH 12/17] RED-9472: solving merge conflicts --- .../integration/utils/AbstractPersistenceServerServiceTest.java | 1 - 1 file changed, 1 deletion(-) 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 d6712bda4..f1ac53605 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 @@ -5,7 +5,6 @@ import static com.iqser.red.service.peristence.v1.server.integration.utils.Mongo 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.mock; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; From 730ac8653dbd445ecd31b92c0d39286c06514d77 Mon Sep 17 00:00:00 2001 From: Yannik Hampe Date: Fri, 22 Nov 2024 10:24:39 +0100 Subject: [PATCH 13/17] Update com.iqser.red.service.java-conventions.gradle.kts --- .../kotlin/com.iqser.red.service.java-conventions.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e4997b98b..7aa222798 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 @@ -7,7 +7,7 @@ plugins { } val redactionServiceVersion by rootProject.extra { "4.415.0-RED9472.4" } -val pdftronRedactionServiceVersion by rootProject.extra { "4.89.0-RED10196.0" } +val pdftronRedactionServiceVersion by rootProject.extra { "4.90.0-RED10115.0" } val redactionReportServiceVersion by rootProject.extra { "4.81.0" } val searchServiceVersion by rootProject.extra { "2.90.0" } From 650a32545073977d50326f46b91bb39ce7f009cb Mon Sep 17 00:00:00 2001 From: yhampe Date: Mon, 25 Nov 2024 09:31:36 +0100 Subject: [PATCH 14/17] RED-9393 user stats controller added authority check --- .../kotlin/com.iqser.red.service.java-conventions.gradle.kts | 2 +- .../management/v1/processor/roles/ApplicationRoles.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 7aa222798..d2e885e60 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.415.0-RED9472.4" } +val redactionServiceVersion by rootProject.extra { "4.434.0-RED9472.1" } val pdftronRedactionServiceVersion by rootProject.extra { "4.90.0-RED10115.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-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 a86335fc9..398c10639 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 @@ -75,7 +75,7 @@ public final class ApplicationRoles { READ_MANUAL_REDACTIONS, READ_NOTIFICATIONS, READ_REDACTION_LOG, - READ_RULES, + READ_RULES, READ_SYSTEM_RULES, READ_DATA_FORMATS, READ_USERS, READ_VERSIONS, From 0e6455da102ccc4f170f913920ad107c6b4a662b Mon Sep 17 00:00:00 2001 From: yhampe Date: Tue, 3 Dec 2024 10:29:46 +0100 Subject: [PATCH 15/17] RED-9472 adjusted permissions/action roles --- .../management/v1/processor/roles/ApplicationRoles.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 398c10639..24ae410cb 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 @@ -26,7 +26,7 @@ public final class ApplicationRoles { GET_TENANTS, CREATE_TENANT, READ_USERS, - READ_ALL_USERS, + READ_ALL_USERS, READ_SYSTEM_RULES, WRITE_SYSTEM_RULES, WRITE_USERS, READ_SMTP_CONFIGURATION, WRITE_SMTP_CONFIGURATION, @@ -75,7 +75,6 @@ public final class ApplicationRoles { READ_MANUAL_REDACTIONS, READ_NOTIFICATIONS, READ_REDACTION_LOG, - READ_RULES, READ_SYSTEM_RULES, READ_DATA_FORMATS, READ_USERS, READ_VERSIONS, @@ -120,7 +119,6 @@ public final class ApplicationRoles { READ_LEGAL_BASIS, READ_LICENSE_REPORT, READ_NOTIFICATIONS, - READ_RULES, READ_SYSTEM_RULES, READ_DATA_FORMATS, READ_SMTP_CONFIGURATION, READ_VERSIONS, @@ -135,8 +133,7 @@ public final class ApplicationRoles { WRITE_DOSSIER_TEMPLATES, WRITE_FILE_ATTRIBUTES_CONFIG, WRITE_GENERAL_CONFIGURATION, - WRITE_LEGAL_BASIS, - WRITE_RULES, WRITE_SYSTEM_RULES, + WRITE_LEGAL_BASIS, WRITE_RULES, WRITE_SYSTEM_RULES, WRITE_DATA_FORMATS, WRITE_SMTP_CONFIGURATION, WRITE_WATERMARK, From 83b163a93be396d848ba562f45ab13b66fc2195d Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 4 Dec 2024 09:05:37 +0100 Subject: [PATCH 16/17] RED-9472 adjusted permissions/action roles --- .../v1/processor/roles/ApplicationRoles.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) 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 24ae410cb..f07fb503f 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 @@ -25,8 +25,7 @@ public final class ApplicationRoles { UPDATE_LICENSE, GET_TENANTS, CREATE_TENANT, - READ_USERS, - READ_ALL_USERS, READ_SYSTEM_RULES, WRITE_SYSTEM_RULES, + READ_USERS, READ_ALL_USERS, READ_SYSTEM_RULES, WRITE_SYSTEM_RULES, WRITE_USERS, READ_SMTP_CONFIGURATION, WRITE_SMTP_CONFIGURATION, @@ -78,7 +77,7 @@ public final class ApplicationRoles { READ_DATA_FORMATS, READ_USERS, READ_VERSIONS, - READ_WATERMARK, + READ_WATERMARK, READ_RULES, REANALYZE_DOSSIER, REANALYZE_FILE, REQUEST_MANUAL_REDACTION, @@ -119,7 +118,7 @@ public final class ApplicationRoles { READ_LEGAL_BASIS, READ_LICENSE_REPORT, READ_NOTIFICATIONS, - READ_DATA_FORMATS, + READ_DATA_FORMATS, READ_RULES, READ_SMTP_CONFIGURATION, READ_VERSIONS, READ_WATERMARK, @@ -132,8 +131,7 @@ public final class ApplicationRoles { WRITE_DOSSIER_ATTRIBUTES_CONFIG, WRITE_DOSSIER_TEMPLATES, WRITE_FILE_ATTRIBUTES_CONFIG, - WRITE_GENERAL_CONFIGURATION, - WRITE_LEGAL_BASIS, WRITE_RULES, WRITE_SYSTEM_RULES, + WRITE_GENERAL_CONFIGURATION, WRITE_LEGAL_BASIS, WRITE_RULES, WRITE_SYSTEM_RULES, WRITE_DATA_FORMATS, WRITE_SMTP_CONFIGURATION, WRITE_WATERMARK, From 5b1a3bf56ae8ea8d5d2413ac37bf210a5d001cb5 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 12 Dec 2024 08:43:46 +0100 Subject: [PATCH 17/17] RED-9472 fixing 500 bug when calling upload endpoint --- .../api/impl/controller/RulesController.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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 5ab60c1ac..c2bbc3ffa 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 @@ -75,16 +75,27 @@ public class RulesController implements RulesResource { if (ruleEntityOptional.isPresent()) { RulesUpdateRequest rulesUpdateRequest = new RulesUpdateRequest(ruleEntityOptional.get().getValue(), rules.getRules()); try { - ResponseEntity mergedRules = ruleBuilderClient.mergeUserUpdateRules(rulesUpdateRequest); + ResponseEntity mergedRules = ruleBuilderClient.mergeUserUpdateRules(rulesUpdateRequest); + + if (mergedRules == null || mergedRules.getBody() == null) { + throw new BadRequestException("Failed to merge rules - received null response from service"); + } + if (mergedRules.getStatusCode().equals(HttpStatus.UNPROCESSABLE_ENTITY)) { - DroolsValidationResponse mergedRulesValidationResponse = ((RulesUploadResponse) mergedRules.getBody()).getDroolsValidationResponse(); + DroolsValidationResponse mergedRulesValidationResponse = mergedRules.getBody().getDroolsValidationResponse(); return new ResponseEntity<>(mergedRulesValidationResponse, !rules.isDryRun() ? HttpStatus.UNPROCESSABLE_ENTITY : HttpStatus.OK); } - mergedRulesString = ((RulesUploadResponse) mergedRules.getBody()).getRules(); + + mergedRulesString = mergedRules.getBody().getRules(); + if (mergedRulesString == null) { + throw new BadRequestException("Failed to merge rules - merged result is null"); + } + } catch (FeignException e) { if (e.status() == HttpStatus.BAD_REQUEST.value()) { throw new BadRequestException("The provided rule file is not a valid drools rule file!"); } + throw new BadRequestException("Failed to merge rules: " + e.getMessage()); } } if (!rules.isDryRun()) {