// 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); } }
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); }