Exemple #1
0
        // We don't have place in activity configuration pane to display activity-wide configuration errors that are not binded to specific controls.
        // Report them via Action Stream.
        private void ReportGenericValidationErrors(string userId, string activityLabel, string planName, ValidationErrorsDTO validationErrors)
        {
            var genericErrors = new List <string>();

            foreach (var error in validationErrors.ValidationErrors)
            {
                if (error.ControlNames == null || error.ControlNames.Count == 0)
                {
                    genericErrors.Add(error.ErrorMessage);
                }
            }

            if (genericErrors.Count > 0)
            {
                var errors = string.Join(" ", genericErrors.Select(x =>
                {
                    if (!x.TrimEnd().EndsWith("."))
                    {
                        return(x + ".");
                    }

                    return(x);
                }));

                _pusherNotifier.NotifyUser(new NotificationMessageDTO
                {
                    NotificationType = NotificationType.GenericFailure,
                    Subject          = "Plan Failed",
                    Message          = $"Validation of activity '{activityLabel}' from plan \"{planName}\" failed: {errors}",
                    Collapsed        = false
                }, userId);
            }
        }
Exemple #2
0
        public async Task <ActivateActivitiesDTO> Activate(Guid curPlanId, bool planBuilderActivate)
        {
            var result = new ActivateActivitiesDTO();

            List <Task <ActivityDTO> > activitiesTask = new List <Task <ActivityDTO> >();

            using (var uow = ObjectFactory.GetInstance <IUnitOfWork>())
            {
                var plan = uow.PlanRepository.GetById <PlanDO>(curPlanId);

                if (plan.PlanState == PlanState.Deleted)
                {
                    EventManager.PlanActivationFailed(plan, "Cannot activate deleted plan");
                    throw new ApplicationException("Cannot activate deleted plan");
                }

                try
                {
                    foreach (var curActionDO in plan.GetDescendants().OfType <ActivityDO>())
                    {
                        activitiesTask.Add(_activity.Activate(curActionDO));
                    }

                    await Task.WhenAll(activitiesTask);
                }
                catch (AggregateException ex)
                {
                    foreach (Exception e in ex.InnerExceptions)
                    {
                        if (e is InvalidTokenRuntimeException)
                        {
                            ReportAuthError(uow, plan.Fr8Account, (InvalidTokenRuntimeException)e);
                        }
                    }

                    EventManager.PlanActivationFailed(plan, "Unable to activate plan");
                    throw;
                }
                catch (InvalidTokenRuntimeException ex)
                {
                    ReportAuthError(uow, plan.Fr8Account, (InvalidTokenRuntimeException)ex);
                    EventManager.PlanActivationFailed(plan, "Unable to activate plan");
                    throw;
                }

                foreach (var resultActivate in activitiesTask.Select(x => x.Result))
                {
                    var errors = new ValidationErrorsDTO(ExtractValidationErrors(resultActivate));

                    if (errors.ValidationErrors.Count > 0)
                    {
                        result.ValidationErrors[resultActivate.Id] = errors;
                    }
                }

                if (result.ValidationErrors.Count == 0 && plan.PlanState != PlanState.Executing)
                {
                    plan.PlanState   = IsMonitoringPlan(uow, plan) ? PlanState.Active : PlanState.Executing;
                    plan.LastUpdated = DateTimeOffset.UtcNow;
                    uow.SaveChanges();
                }
            }

            return(result);
        }