/// <summary> /// Called by the runtime to apply a collection of rules to the specified event. /// </summary> /// <param name="context">The <see cref="RuleProContext"/> to associate with this event and execution.</param> /// <param name="cancellationToken">A token to observe while waiting for the task to complete.</param> /// <returns> /// The <see cref="RuleProResult"/> of the run task, which determines whether the context remains in the executing state, or transitions to the closed state. /// </returns> public virtual async Task ExecuteAsync(RuleProContext context, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (context == null) { throw new ArgumentNullException(nameof(context)); } foreach (var action in context.RuleItem.Actions) { switch (action.Code) { case RuleActionCode.Categorize: { int categoryId; if (int.TryParse(action.Value, out categoryId)) { var eventManager = context.Resolve <EventManager>(); await eventManager.BulkSetCategoriesAsync(context.EventItem.User.Id, new[] { context.EventItem.Id }, categoryId, cancellationToken); } } break; case RuleActionCode.Remove: { var eventManager = context.Resolve <EventManager>(); await eventManager.BulkDeleteAsync(context.EventItem.User.Id, new[] { context.EventItem.Id }, cancellationToken); } break; } } }
/// <summary> /// Called by the runtime to execute a command. /// </summary> public virtual Task InvokeAsync(RuleItem rule, EventResult eventItem, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (eventItem == null) { throw new ArgumentNullException(nameof(eventItem)); } var context = new RuleProContext(Resolver, rule, eventItem); if (Evaluator.Evaluate(context)) { return(Processor.ExecuteAsync(context, cancellationToken)); } return(Task.FromResult(false)); }
/// <summary> /// Called by the runtime to execute a command. /// </summary> public virtual async Task InvokeAsync(IEnumerable <RuleItem> rules, EventResult eventItem, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (rules == null) { throw new ArgumentNullException(nameof(rules)); } if (eventItem == null) { throw new ArgumentNullException(nameof(eventItem)); } foreach (var rule in rules) { var context = new RuleProContext(Resolver, rule, eventItem); if (Evaluator.Evaluate(context)) { await Processor.ExecuteAsync(context, cancellationToken); } } }
public virtual bool Evaluate(RuleProContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } bool succeeded = true; foreach (var condition in context.RuleItem.Conditions) { switch (condition.Code) { case RuleConditionCode.StartDateGreaterThan: { DateTime value; succeeded &= DateTime.TryParse(condition.Value, out value) ? (context.EventItem.StartDate > value) : false; } break; case RuleConditionCode.StartDateLessThan: { DateTime value; succeeded &= DateTime.TryParse(condition.Value, out value) ? (context.EventItem.StartDate < value) : false; } break; case RuleConditionCode.ClientIdContains: { succeeded &= context.EventItem.ClientId?.Contains(condition.Value) ?? false; } break; case RuleConditionCode.CustomUriContains: { succeeded &= context.EventItem.CustomUri?.Contains(condition.Value) ?? false; } break; case RuleConditionCode.ReferrerUrlContains: { succeeded &= context.EventItem.ReferrerUrl?.Contains(condition.Value) ?? false; } break; case RuleConditionCode.ProjectIdEquals: { int value; succeeded &= int.TryParse(condition.Value, out value) ? (context.EventItem.Project?.Id == value) : (context.EventItem.Project?.Id == null && condition.Value == null); } break; case RuleConditionCode.ContactStateEquals: { ObjectState value; succeeded &= Enum.TryParse(condition.Value, out value) ? (context.EventItem.ContactState == value) : false; } break; case RuleConditionCode.ContactMailContains: { succeeded &= context.EventItem.Contact?.Email?.Address?.Contains(condition.Value) ?? false; } break; } } return(succeeded); }