/// <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);
         }
     }
 }
Exemple #4
0
        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);
        }