public ActionResult RenderActivity(ActivityViewModel model) { if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to edit workflows"))) { return(new HttpUnauthorizedResult()); } var activity = _activitiesManager.GetActivityByName(model.Name); if (activity == null) { return(HttpNotFound()); } dynamic shape = New.Activity(activity); if (model.State != null) { var state = FormParametersHelper.ToDynamic(FormParametersHelper.ToString(model.State)); shape.State(state); } else { shape.State(FormParametersHelper.FromJsonString("{}")); } shape.Metadata.Alternates.Add("Activity__" + activity.Name); return(new ShapeResult(this, shape)); }
public void TriggerEvent(string name, IContent target, Func <Dictionary <string, object> > tokensContext) { var tokens = tokensContext(); var activity = _activitiesManager.GetActivityByName(name); if (activity == null) { Logger.Error("Activity {0} was not found", name); return; } var startedWorkflows = new List <ActivityRecord>(); // look for workflow definitions with a corresponding starting activity // it's important to return activities at this point and not workflows, // as a workflow definition could have multiple entry points with the same type of activity startedWorkflows.AddRange(_activityRepository.Table.Where( x => x.Name == name && x.Start && x.WorkflowDefinitionRecord.Enabled ) ); var awaitingActivities = new List <AwaitingActivityRecord>(); // and any running workflow paused on this kind of activity for this content // it's important to return activities at this point as a workflow could be awaiting // on several ones. When an activity is restarted, all the other ones of the same workflow are cancelled. var awaitingQuery = _awaitingActivityRepository.Table.Where(x => x.ActivityRecord.Name == name && x.ActivityRecord.Start == false); awaitingQuery = target == null || target.ContentItem == null ? awaitingQuery.Where(x => x.WorkflowRecord.ContentItemRecord == null) : awaitingQuery.Where(x => x.WorkflowRecord.ContentItemRecord == target.ContentItem.Record); awaitingActivities.AddRange(awaitingQuery.ToList()); // if no activity record is matching the event, do nothing if (!startedWorkflows.Any() && !awaitingActivities.Any()) { return; } // if no activity record is matching the event, do nothing if (!startedWorkflows.Any() && !awaitingActivities.Any()) { return; } // resume halted workflows foreach (var awaitingActivityRecord in awaitingActivities) { var workflowContext = new WorkflowContext { Content = target, Tokens = tokens, Record = awaitingActivityRecord.WorkflowRecord }; workflowContext.Tokens["Workflow"] = workflowContext; var activityContext = CreateActivityContext(awaitingActivityRecord.ActivityRecord, tokens); // check the condition try { if (!activity.CanExecute(workflowContext, activityContext)) { continue; } } catch (Exception e) { Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); continue; } ResumeWorkflow(awaitingActivityRecord, workflowContext, tokens); } // start new workflows foreach (var activityRecord in startedWorkflows) { var workflowContext = new WorkflowContext { Content = target, Tokens = tokens, }; workflowContext.Tokens["Workflow"] = workflowContext; var workflowRecord = new WorkflowRecord { WorkflowDefinitionRecord = activityRecord.WorkflowDefinitionRecord, State = "{}", ContentItemRecord = workflowContext.Content == null || workflowContext.Content.ContentItem == null ? null : workflowContext.Content.ContentItem.Record }; workflowContext.Record = workflowRecord; var activityContext = CreateActivityContext(activityRecord, tokens); // check the condition try { if (!activity.CanExecute(workflowContext, activityContext)) { continue; } } catch (Exception e) { Logger.Error("Error while evaluating an activity condition on {0}: {1}", name, e.ToString()); continue; } StartWorkflow(workflowContext, activityRecord, tokens); } }
public void TriggerEvent(string name, Func <Dictionary <string, object> > environmentContext) { var environment = environmentContext(); var activity = _activitiesManager.GetActivityByName(name); var startedWorkflows = _activityDefinitionService.GetStartActivityDefinitions(name).AsQueryable(); var awaitingActivities = _activityDefinitionService.GetAwaitingActivityDefinitions(name).AsQueryable(); if (!startedWorkflows.Any() && !awaitingActivities.Any()) { return; } foreach (var awaitingActivityDefinition in awaitingActivities) { var workflowContext = new WorkflowContext { Environment = environment }; var activityContext = CreateActivityContext(awaitingActivityDefinition.ActivityDefinition, environment); try { if (!activity.CanExecute(workflowContext, activityContext)) { continue; } } catch (Exception e) { continue; } ResumeWorkflow(awaitingActivityDefinition, workflowContext, environment); } foreach (var activityRecord in startedWorkflows) { var workflowContext = new WorkflowContext { Environment = environment }; var workflowRecord = new WorkflowInstance { WorkflowDefinition = activityRecord.WorkflowDefinition }; workflowContext.WorkflowInstance = workflowRecord; var activityContext = CreateActivityContext(activityRecord, environment); try { if (!activity.CanExecute(workflowContext, activityContext)) { continue; } } catch (Exception e) { continue; } StartWorkflow(workflowContext, activityRecord, environment); } }