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:
parent
fb8f227ac9
commit
b42b5762ec
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -203,4 +203,6 @@ public class RuleFileParser {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<String> getImportsFromRuleFile(String ruleString)
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user