@jss-rule-engine/core
Version:
Rule engine for Sitecore JSS
86 lines (59 loc) • 3.42 kB
text/typescript
import { ParsedRuleXmlData, RuleEngineContext } from "./types/ruleEngine";
export default async function (parsedRule:ParsedRuleXmlData | null, ruleEngineContext: RuleEngineContext) {
var ruleResult = true;
ruleEngineContext.ruleExecutionResult = {
ruleResults: [],
parsedRule: parsedRule,
};
if (!parsedRule || !parsedRule.rules) {
return null;
}
await Promise.all(parsedRule.rules.map(async (rule) => {
var result = true;
if (rule.conditions && rule.conditions.length > 0) {
await Promise.all(rule.conditions.map(async (condition) => {
ruleEngineContext.ruleEngine?.debugMessage('Running condition:')
ruleEngineContext.ruleEngine?.debugMessage(condition)
var conditionId = condition.id ? condition.id : condition.className;
var conditionFunction = ruleEngineContext.ruleEngine?.ruleDefinitions.get(conditionId);
if (typeof (conditionFunction) === "undefined" || !conditionFunction || !condition) {
console.warn('Rule definitions missing for id ' + conditionId);
ruleEngineContext.ruleEngine?.debugMessage('Rule definitions missing for id ' + conditionId)
throw new Error('Rule definitions missing for id ' + conditionId);
}
ruleEngineContext.ruleEngine?.debugMessage('Running condition function')
var conditionResult = await conditionFunction(condition, ruleEngineContext);
ruleEngineContext.ruleEngine?.debugMessage('Condition result:')
ruleEngineContext.ruleEngine?.debugMessage(conditionResult)
if (condition.except) {
conditionResult = !conditionResult;
}
if (typeof (conditionResult) !== 'undefined') {
result = result && conditionResult;
}
}))
}
ruleResult = ruleResult && result;
ruleEngineContext.ruleEngine?.debugMessage('Rule result:', ruleResult);
console.log('Rule result: ', ruleResult);
ruleEngineContext.ruleExecutionResult?.ruleResults?.push(result);
if (result && !ruleEngineContext.skipActions && rule.actions && rule.actions.length > 0) {
ruleEngineContext.ruleEngine?.debugMessage('Running actions:')
ruleEngineContext.ruleEngine?.debugMessage(rule.actions)
rule.actions.forEach((ruleAction) => {
var actionFunction = ruleEngineContext.ruleEngine?.commandDefinitions.get(ruleAction.id);
if (typeof (actionFunction) === "undefined" || !ruleAction) {
throw new Error('Rule definitions missing for id ' + ruleAction.id);
}
ruleEngineContext.ruleEngine?.debugMessage(actionFunction)
actionFunction(ruleAction, ruleEngineContext);
})
}
console.log('Rule execution result', ruleEngineContext.ruleExecutionResult);
}))
ruleEngineContext.ruleEngine?.debugMessage('Rule execution result: ', ruleResult)
if(ruleEngineContext.ruleExecutionResult){
ruleEngineContext.ruleExecutionResult.result = ruleResult;
}
return ruleResult;
}