From b42b5762ec471f155a7f68ff53b3362f9786f290 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 26 Sep 2024 12:33:41 +0200 Subject: [PATCH] RED-9472: seperation of system rules refactored endpoints. now removing system rules on download merging user rules with systemrules on upload --- .../v1/resources/RuleBuilderResource.java | 21 +++++---- .../controller/RuleBuilderController.java | 31 +++++++++--- .../model/drools/RuleFileBluePrint.java | 47 +++++++++++++++++++ .../v1/server/service/RuleBuilderService.java | 31 +++++++++--- .../server/service/drools/RuleFileParser.java | 2 + 5 files changed, 109 insertions(+), 23 deletions(-) diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RuleBuilderResource.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RuleBuilderResource.java index 5f0563f1..a0711376 100644 --- a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RuleBuilderResource.java +++ b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RuleBuilderResource.java @@ -1,24 +1,25 @@ package com.iqser.red.service.redaction.v1.resources; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; -import com.iqser.red.service.redaction.v1.model.RuleBuilderModel; - import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.bind.annotation.RequestBody; -import io.swagger.v3.oas.annotations.media.Schema; +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.redaction.v1.model.RuleBuilderModel; public interface RuleBuilderResource { @PostMapping(value = "/rule-builder-model", produces = MediaType.APPLICATION_JSON_VALUE) RuleBuilderModel getRuleBuilderModel(); - @PostMapping(value="/rulefile-system", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - RulesResponse getRuleFileWithoutSystemRules(@Schema(type = "string", format = "UTF_8", name = "file") @RequestPart(name = "ruleFile") String ruleFile); - @PostMapping(value="/rulefile", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - RulesResponse getRuleFileWithSeperatedSystemRules(@Schema(type = "string", format = "UTF_8", name = "file") @RequestPart(name = "ruleFile") String ruleFile); + @PostMapping(value = "/internal-api/rules/user-rules", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + RulesResponse getRuleFileWithoutSystemRules(@RequestBody SystemRulesSeperationRequest systemRulesSeperationRequest); + + + @PostMapping(value = "/internal-api/rules/system-rules", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + RulesResponse getRuleFileWithSeperatedSystemRules(@RequestBody RulesUpdateRequest rulesUpdateRequest); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RuleBuilderController.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RuleBuilderController.java index f690127f..5a57e521 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RuleBuilderController.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RuleBuilderController.java @@ -3,9 +3,15 @@ package com.iqser.red.service.redaction.v1.server.controller; import org.springframework.web.bind.annotation.RestController; 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.redaction.v1.model.RuleBuilderModel; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import com.iqser.red.service.redaction.v1.resources.RuleBuilderResource; +import com.iqser.red.service.redaction.v1.server.model.drools.RuleType; import com.iqser.red.service.redaction.v1.server.service.RuleBuilderService; +import com.iqser.red.service.redaction.v1.server.service.drools.DroolsValidationService; +import com.iqser.red.service.redaction.v1.server.utils.exception.RulesValidationException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; public class RuleBuilderController implements RuleBuilderResource { private final RuleBuilderService ruleBuilderService; + private final DroolsValidationService droolsValidationService; @Override @@ -26,19 +33,31 @@ public class RuleBuilderController implements RuleBuilderResource { @Override - public RulesResponse getRuleFileWithoutSystemRules(String rulesString) { + public RulesResponse getRuleFileWithoutSystemRules(SystemRulesSeperationRequest systemRulesSeperationRequest) { RulesResponse rulesResponse = new RulesResponse(); - String filteredRules = this.ruleBuilderService.getRuleFileWithoutSystemRules(rulesString); - log.info("Filtered rules: {}", filteredRules); + String filteredRules = this.ruleBuilderService.cleanRuleFileOfSystemRules(systemRulesSeperationRequest.getRules(), true); + try { + droolsValidationService.testRules(new RuleValidationModel("ENTITY", filteredRules)); + } catch (Exception e) { + throw new RulesValidationException("Could not test rules: " + e.getMessage(), e); + } + rulesResponse.setRules(filteredRules); return rulesResponse; } @Override - public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) { - - return this.ruleBuilderService.getRuleFileWithSeperatedSystemRules(rulesString); + public RulesResponse getRuleFileWithSeperatedSystemRules(RulesUpdateRequest rulesUpdateRequest) { + RulesResponse rulesResponse = new RulesResponse(); + String mergedRules = ruleBuilderService.getRuleFileWithSeperatedSystemRules(rulesUpdateRequest.getExistingRules(), rulesUpdateRequest.getUpdatedRules()); + try { + droolsValidationService.testRules(new RuleValidationModel("ENTITY", mergedRules)); + } catch (Exception e) { + throw new RulesValidationException("Could not test rules: " + e.getMessage(), e); + } + rulesResponse.setRules(mergedRules); + return rulesResponse; } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/drools/RuleFileBluePrint.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/drools/RuleFileBluePrint.java index 98d6cf0a..8ac3abcb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/drools/RuleFileBluePrint.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/model/drools/RuleFileBluePrint.java @@ -57,6 +57,47 @@ public final class RuleFileBluePrint { } + public void dropAllRulesExceptSystemRules(List systemRules) { + + log.info("removing all rules except the system rules"); + + List rulesToBeRemoved = ruleClasses.stream() + .filter(ruleClass -> filterOutRule(ruleClass.ruleType(), systemRules)) + .collect(Collectors.toList()); + log.info("rules to be removed {}", rulesToBeRemoved); + ruleClasses.removeAll(rulesToBeRemoved); + } + + + public void dropImports() { + + this.imports = ""; + } + + + public void dropQueries() { + + this.queries.clear(); + } + + + public int countRuleOccurences(RuleType ruleType) { + + log.info("counting occurences of files {}", ruleType.name()); + + List rulesToBeRemoved = ruleClasses.stream() + .filter(ruleClass -> Objects.equals(ruleClass.ruleType(), ruleType)) + .collect(Collectors.toList()); + return rulesToBeRemoved.size(); + } + + + private boolean filterOutRule(RuleType ruleType, List filteredRules) { + + return !filteredRules.contains(ruleType.name()); + } + + public Set getImportSplitByKeyword() { return Arrays.stream(imports.replaceAll("\n", "").split("import")) @@ -108,4 +149,10 @@ public final class RuleFileBluePrint { return "RuleFileBluePrint[imports=" + imports + ", globals=" + globals + ", queries=" + queries + ", ruleClasses=" + ruleClasses + ']'; } + + public void addRuleClass(RuleClass ruleClass) { + + this.ruleClasses.add(ruleClass); + } + } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java index c849802f..9e5f180e 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java @@ -7,7 +7,6 @@ import java.util.List; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse; import com.iqser.red.service.redaction.v1.model.RuleBuilderModel; import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint; import com.iqser.red.service.redaction.v1.server.model.drools.RuleType; @@ -33,23 +32,41 @@ public class RuleBuilderService { } - public String getRuleFileWithoutSystemRules(String rulesString) { + public String cleanRuleFileOfSystemRules(String rulesString, boolean removeImports) { RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString); - log.info("Starting to remove system rules from ruleFile {}", ruleFileBluePrint); + log.info("Starting to remove system rules from ruleFile"); for (String systemRule : systemRules) { ruleFileBluePrint.dropRulesByIdentifier(RuleType.fromString(systemRule)); } - log.info("Finished removing system rules for ruleFile {}", ruleFileBluePrint); + ruleFileBluePrint.dropQueries(); + if (removeImports) { + ruleFileBluePrint.dropQueries(); + } + log.info("Finished removing system rules for ruleFile"); return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrint); } - public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) { + public String getRuleFileWithSeperatedSystemRules(String existingRules, String updatedRules) { - RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString); - return null; + RuleFileBluePrint ruleFileBluePrintExisting = RuleFileParser.buildBluePrintFromRulesString(existingRules); + ruleFileBluePrintExisting.dropAllRulesExceptSystemRules(systemRules); + RuleFileBluePrint ruleFileBluePrintUpdate = RuleFileParser.buildBluePrintFromRulesString(updatedRules); + for (String systemRule : systemRules) { + if (ruleFileBluePrintUpdate.countRuleOccurences(RuleType.fromString(systemRule)) > 0) { + throw new RuntimeException("System rules are not allowed in an update."); + + } + } + ruleFileBluePrintExisting.setImports(ruleFileBluePrintUpdate.getImports()); + ruleFileBluePrintUpdate.getRuleClasses() + .forEach(ruleClass -> { + ruleFileBluePrintExisting.addRuleClass(ruleClass); + }); + + return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrintExisting); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/RuleFileParser.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/RuleFileParser.java index efd2976c..c16f179c 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/RuleFileParser.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/RuleFileParser.java @@ -203,4 +203,6 @@ public class RuleFileParser { .collect(Collectors.toList()); } + private List getImportsFromRuleFile(String ruleString) + }