RED-9472: seperation of system rules

refactored endpoints.

now removing system rules on download

merging user rules with systemrules on upload
This commit is contained in:
yhampe 2024-09-26 12:33:41 +02:00
parent fb8f227ac9
commit b42b5762ec
5 changed files with 109 additions and 23 deletions

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -57,6 +57,47 @@ public final class RuleFileBluePrint {
}
public void dropAllRulesExceptSystemRules(List<String> systemRules) {
log.info("removing all rules except the system rules");
List<RuleClass> 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<RuleClass> rulesToBeRemoved = ruleClasses.stream()
.filter(ruleClass -> Objects.equals(ruleClass.ruleType(), ruleType))
.collect(Collectors.toList());
return rulesToBeRemoved.size();
}
private boolean filterOutRule(RuleType ruleType, List<String> filteredRules) {
return !filteredRules.contains(ruleType.name());
}
public Set<String> 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);
}
}

View File

@ -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);
}
}

View File

@ -203,4 +203,6 @@ public class RuleFileParser {
.collect(Collectors.toList());
}
private List<String> getImportsFromRuleFile(String ruleString)
}