Ejemplo n.º 1
0
        public void By_default_execution_exceptions_are_unhandled()
        {
            var workflowTasks   = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents("token"), _domain);
            var hostedWorkflows = new WorkflowHost(_domain, new[] { new WorkflowThrowsExceptionOnSignal(new ApplicationException("")) });

            Assert.ThrowsAsync <ApplicationException>(async() => await workflowTasks.ExecuteForAsync(hostedWorkflows));
        }
Ejemplo n.º 2
0
        public void Delete(WorkflowTask request)
        {
            using (Execute)
            {
                Execute.Run(ssn =>
                {
                    if (!(request?.Id > 0))
                    {
                        throw new HttpError(HttpStatusCode.NotFound, $"No Id provided for delete.");
                    }

                    var en = DocEntityWorkflowTask.GetWorkflowTask(request?.Id);
                    if (null == en)
                    {
                        throw new HttpError(HttpStatusCode.NotFound, $"No WorkflowTask could be found for Id {request?.Id}.");
                    }
                    if (en.IsRemoved)
                    {
                        return;
                    }

                    if (!DocPermissionFactory.HasPermission(en, currentUser, DocConstantPermission.DELETE))
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, "You do not have DELETE permission for this route.");
                    }

                    en.Remove();

                    DocCacheClient.RemoveSearch(DocConstantModelName.WORKFLOWTASK);
                    DocCacheClient.RemoveById(request.Id);
                });
            }
        }
Ejemplo n.º 3
0
        public WorkflowTask Post(WorkflowTask request)
        {
            if (request == null)
            {
                throw new HttpError(HttpStatusCode.NotFound, "Request cannot be null.");
            }

            request.VisibleFields = request.VisibleFields ?? new List <string>();

            WorkflowTask ret = null;

            using (Execute)
            {
                Execute.Run(ssn =>
                {
                    if (!DocPermissionFactory.HasPermissionTryAdd(currentUser, "WorkflowTask"))
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, "You do not have ADD permission for this route.");
                    }

                    ret = _AssignValues(request, DocConstantPermission.ADD, ssn);
                });
            }
            return(ret);
        }
Ejemplo n.º 4
0
        private WorkflowTask GetWorkflowTask(WorkflowTask request)
        {
            var          id    = request?.Id;
            WorkflowTask ret   = null;
            var          query = DocQuery.ActiveQuery ?? Execute;

            DocPermissionFactory.SetVisibleFields <WorkflowTask>(currentUser, "WorkflowTask", request.VisibleFields);

            DocEntityWorkflowTask entity = null;

            if (id.HasValue)
            {
                entity = DocEntityWorkflowTask.GetWorkflowTask(id.Value);
            }
            if (null == entity)
            {
                throw new HttpError(HttpStatusCode.NotFound, $"No WorkflowTask found for Id {id.Value}");
            }

            if (!DocPermissionFactory.HasPermission(entity, currentUser, DocConstantPermission.VIEW))
            {
                throw new HttpError(HttpStatusCode.Forbidden, "You do not have VIEW permission for this route.");
            }

            ret = entity?.ToDto();
            return(ret);
        }
Ejemplo n.º 5
0
        public void should_create_workflow()
        {
            var initialTask = new WorkflowTask("task 1");

            initialTask.AssignTo(new Responsibility("*****@*****.**"));

            var endTask = new WorkflowTask("task 2");

            endTask.AssignTo(new Responsibility("*****@*****.**"));
            endTask.DependsOn(initialTask);

            var workflow = new Workflow("workflow");

            workflow.AddTask(initialTask);
            workflow.AddTask(endTask);

            ResolveSession().Save(workflow);

            ResolveSession().Clear();
            workflow = ResolveSession().Query <Workflow>().Single();

            Assert.True(workflow.Id > 0);
            Assert.Equal("workflow", workflow.Name);

            Assert.Equal(2, workflow.Tasks.Count);
            Assert.Equal("task 1", workflow.Tasks[0].Name);
            Assert.Single(workflow.Tasks[0].Responsibilities);
            Assert.Equal("*****@*****.**", workflow.Tasks[0].Responsibilities[0].Email);

            Assert.Equal("task 2", workflow.Tasks[1].Name);
            Assert.Single(workflow.Tasks[1].Responsibilities);
            Assert.Equal("*****@*****.**", workflow.Tasks[1].Responsibilities[0].Email);

            Assert.Single(workflow.Tasks[1].TaskDependsOns);
        }
Ejemplo n.º 6
0
        public async Task On_execution_send_decisions_to_amazon_swf()
        {
            var hostedWorkflows = new WorkflowHost(_domain, new[] { new WorkflowCompleteOnSignal("result") });
            var workflowTasks   = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents("token"), _domain);

            await workflowTasks.ExecuteForAsync(hostedWorkflows);

            AssertThatInterpretedDecisionsAreSentOverWorkflowClient("token", Times.Once());
        }
Ejemplo n.º 7
0
        public async Task Throws_exception_when_workflow_history_events_are_queried_after_execution()
        {
            var hostedWorkflow  = new WorkflowCompleteOnSignal();
            var hostedWorkflows = new WorkflowHost(_domain, new[] { hostedWorkflow });
            var workflowTasks   = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents("token"), _domain);
            await workflowTasks.ExecuteForAsync(hostedWorkflows);

            Assert.Throws <InvalidOperationException>(() => hostedWorkflow.AccessHistoryEvents());
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Converts a list of workflowTaskInstances into a list of UI-ready workflowTasks
        /// </summary>
        /// <param name="taskInstances"></param>
        /// <param name="sorted">Depending on the caller, the response may not be sorted</param>
        /// <param name="instance"></param>
        /// <returns></returns>
        public List <WorkflowTask> ConvertToWorkflowTaskList(List <WorkflowTaskInstancePoco> taskInstances, bool sorted = true, WorkflowInstancePoco instance = null)
        {
            List <WorkflowTask> workflowItems = new List <WorkflowTask>();

            if (!taskInstances.Any())
            {
                return(workflowItems);
            }

            bool useInstanceFromTask = instance == null;

            foreach (WorkflowTaskInstancePoco taskInstance in taskInstances)
            {
                instance = useInstanceFromTask ? taskInstance.WorkflowInstance : instance;

                // ignore workflows where node has been deleted
                if (instance.Node == null || instance.Node.Path.Contains(Constants.System.RecycleBinContentString))
                {
                    continue;
                }

                var item = new WorkflowTask
                {
                    InstanceGuid = instance.Guid,
                    TaskId       = taskInstance.Id,

                    Type        = instance.TypeDescription,
                    TypeId      = instance.Type,
                    CurrentStep = taskInstance.ApprovalStep,

                    Status         = taskInstance.Status,
                    StatusName     = taskInstance.StatusName,
                    CssStatus      = taskInstance.StatusName.ToLower().Replace(' ', '-'),
                    InstanceStatus = instance.WorkflowStatus.ToString().ToLower(),

                    NodeId   = instance.NodeId,
                    NodeName = instance.Node.Name,

                    RequestedById = instance.AuthorUserId,
                    RequestedBy   = instance.AuthorUser?.Name,
                    RequestedOn   = taskInstance.CreatedDate.ToFriendlyDate(),
                    Comment       = useInstanceFromTask || string.IsNullOrEmpty(taskInstance.Comment) ? instance.AuthorComment : taskInstance.Comment,

                    ApprovalGroupId = taskInstance.UserGroup?.GroupId,
                    ApprovalGroup   = taskInstance.UserGroup?.Name,
                    CompletedBy     = taskInstance.ActionedByUser?.Name,
                    CompletedOn     = taskInstance.CompletedDate?.ToFriendlyDate(),

                    Permissions = _configService.GetRecursivePermissionsForNode(instance.Node)
                };

                workflowItems.Add(item);
            }

            return(sorted ? workflowItems.OrderByDescending(x => x.CurrentStep).ToList() : workflowItems.ToList());
        }
Ejemplo n.º 9
0
        public async Task <WorkflowTask> CompleteTask(WorkflowTask workFlowTask)
        {
            var payloadAsJson = (new
            {
                Action = "complete",
                Variables = workFlowTask.Variables
            });


            var serialized = JsonConvert.SerializeObject(payloadAsJson, new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });
            var stringContent = new StringContent(serialized);

            stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var response = await _client.PostAsync($"runtime/tasks/{workFlowTask.Id}", stringContent);

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var responseString       = response.Content.ReadAsStringAsync().Result;
                var workFlowTaskResponse = JsonConvert.DeserializeObject <WorkflowTask>(responseString);
                return(workFlowTaskResponse);
            }
            if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
            {
                throw new ExceptionWithFeedback(new FeedbackItem()
                {
                    Description =
                        $"The task could not be completed. Received a bad request from Workflow engine.",
                    Type = FeedbackType.Error
                });
            }
            if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
            {
                throw new ExceptionWithFeedback(new FeedbackItem()
                {
                    Description =
                        $"The task could not be completed. Received an internal server error from workflow engine.",
                    Type = FeedbackType.Error
                });
            }
            if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                throw new EntityNotFoundException($"The endpoint to complete the task could not be found");
            }

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new EntityNotFoundException($"The endpoint to complete the task could not be found, activity responsecode {response.StatusCode}");
            }

            return(workFlowTask);
        }
Ejemplo n.º 10
0
        public void Invalid_history_events_tests()
        {
            var decisionTask = new DecisionTask()
            {
                Events = new List <HistoryEvent>(), TaskToken = "token"
            };

            Assert.Throws <ArgumentException>(() => WorkflowTask.Create(decisionTask));
            decisionTask.Events = new List <HistoryEvent>();
            Assert.Throws <ArgumentException>(() => WorkflowTask.Create(decisionTask));
        }
Ejemplo n.º 11
0
        public async Task Execution_exception_can_handled_to_retry()
        {
            var workflowTasks   = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents("token"), _domain);
            var hostedWorkflows = new WorkflowHost(_domain, new[] { new WorkflowThrowsExceptionOnSignal(new ApplicationException("")) });

            workflowTasks.OnExecutionError(ErrorHandler.Default(e => ErrorAction.Retry));

            await workflowTasks.ExecuteForAsync(hostedWorkflows);

            AssertThatInterpretedDecisionsAreSentOverWorkflowClient("token", Times.Once());
        }
Ejemplo n.º 12
0
        public List <TaskVariable> CompleteTask(int id, List <TaskVariable> taskVariables)
        {
            var workflowTask = new WorkflowTask();

            workflowTask.Id        = id;
            workflowTask.Variables = taskVariables.Select(x => new WorkflowTaskVariable()
            {
                Name = x.Name, Type = x.Type, Value = x.Value
            }).ToList();
            _workflowService.CompleteTask(workflowTask);
            return(taskVariables);
        }
Ejemplo n.º 13
0
        public WorkflowTask Post(WorkflowTaskCopy request)
        {
            WorkflowTask ret = null;

            using (Execute)
            {
                Execute.Run(ssn =>
                {
                    var entity = DocEntityWorkflowTask.GetWorkflowTask(request?.Id);
                    if (null == entity)
                    {
                        throw new HttpError(HttpStatusCode.NoContent, "The COPY request did not succeed.");
                    }
                    if (!DocPermissionFactory.HasPermission(entity, currentUser, DocConstantPermission.ADD))
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, "You do not have ADD permission for this route.");
                    }

                    var pAssignee    = entity.Assignee;
                    var pData        = entity.Data;
                    var pDescription = entity.Description;
                    if (!DocTools.IsNullOrEmpty(pDescription))
                    {
                        pDescription += " (Copy)";
                    }
                    var pDueDate  = entity.DueDate;
                    var pReporter = entity.Reporter;
                    var pStatus   = entity.Status;
                    var pType     = entity.Type;
                    var pWorkflow = entity.Workflow;
                    #region Custom Before copyWorkflowTask
                    #endregion Custom Before copyWorkflowTask
                    var copy = new DocEntityWorkflowTask(ssn)
                    {
                        Hash          = Guid.NewGuid()
                        , Assignee    = pAssignee
                        , Data        = pData
                        , Description = pDescription
                        , DueDate     = pDueDate
                        , Reporter    = pReporter
                        , Status      = pStatus
                        , Type        = pType
                        , Workflow    = pWorkflow
                    };

                    #region Custom After copyWorkflowTask
                    #endregion Custom After copyWorkflowTask
                    copy.SaveChanges(DocConstantPermission.ADD);
                    ret = copy.ToDto();
                });
            }
            return(ret);
        }
Ejemplo n.º 14
0
        private static void ConfirmWorkflowTaskWithPrefilledValue(Organization organization)
        {
            Console.WriteLine("ConfirmWorkflowTasks");

            string workflowId = "00000000-0000-0000-0000-000000000000";

            Platform.ServerClient.Workflow workflow = organization.GetWorkflowsFromWorkflowsRelation().Workflow.FirstOrDefault(wf =>
                                                                                                                               wf.Id == workflowId)?.GetWorkflowFromSelfRelation();

            if (workflow == null)
            {
                Console.WriteLine("Workflow is null!");
            }
            else
            {
                WorkflowTask task = workflow.GetWorkflowTasksFromTasksRelation().Task.FirstOrDefault();

                if (task == null)
                {
                    Console.WriteLine("Task is null!");
                }
                else
                {
                    task = task.TaskOperations.BaseTaskOperations.GetWorkflowTaskFromSelfRelation();

                    Decision firstDecision = task.Decisions.FirstOrDefault();

                    if (firstDecision == null)
                    {
                        Console.WriteLine("FirstDecision is null!");
                    }
                    else
                    {
                        //it returns all fields and prefills in the decision
                        Decision fullLoadedDecision = firstDecision.DecisionOperations.BaseDecisionOperations.GetDecisionFromSelfRelation();
                        var      confirmedData      = new ConfirmedData()
                        {
                            ConfirmedFields = new List <ConfirmedField>()
                        };
                        foreach (var field in fullLoadedDecision.TaskFormField.Where(f => f.Item.FormFieldType != FormTypeEnum.Description && f.Item.FormFieldType != FormTypeEnum.Link))
                        {
                            confirmedData.ConfirmedFields.Add(new ConfirmedField()
                            {
                                Id    = field.Item.Id,
                                Value = GetPrefilledFieldValue(field)
                            });
                        }
                        string returnValue = fullLoadedDecision.DecisionOperations.ExtendedDecisionOperations.PostToConfirmRelationForString(confirmedData);
                    }
                }
            }
        }
Ejemplo n.º 15
0
        public void Can_Get_Task_By_id()
        {
            Scaffold.Config();

            _service.InsertTask(Scaffold.Task());

            List <WorkflowTask> tasks = _service.GetPendingTasks(new[] { 1, 2, 3 }, 10, 1);
            int id = tasks.First().TaskId;

            WorkflowTask task = _service.GetTask(id);

            Assert.NotNull(task);
            Assert.Equal(id, task.TaskId);
        }
Ejemplo n.º 16
0
        public async Task Response_exception_can_be_handled_to_continue()
        {
            _amazonWorkflowClient.SetupSequence(c => c.RespondDecisionTaskCompletedAsync(It.IsAny <RespondDecisionTaskCompletedRequest>(), It.IsAny <CancellationToken>()))
            .Throws(new UnknownResourceException("msg"))
            .Returns(Task.FromResult(new RespondDecisionTaskCompletedResponse()));
            var hostedWorkflows = new WorkflowHost(_domain, new[] { new WorkflowCompleteOnSignal() });

            hostedWorkflows.OnResponseError(e => ErrorAction.Continue);
            var workflowTasks = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents("token"), _domain);

            await workflowTasks.ExecuteForAsync(hostedWorkflows);

            AssertThatInterpretedDecisionsAreSentOverWorkflowClient("token", Times.Once());
        }
Ejemplo n.º 17
0
        private void PopulateOfflineWorkflow()
        {
            OfflineWorkflow = new Workflow();

            OfflineWorkflow.Version   = "1.4";
            OfflineWorkflow.FirstTask = "T0";

            List <TaskAnswer> answers = new List <TaskAnswer>();

            answers.Add(new TaskAnswer("![smooth_triple_flat.png](https://panoptes-uploads.zooniverse.org/staging/project_attached_image/810958cc-54bc-40f5-8871-628a5b0257ea.png) Smooth _Gradually fades from the center_"));
            answers.Add(new TaskAnswer("![features_or_disk.png](https://panoptes-uploads.zooniverse.org/staging/project_attached_image/4a4333a4-3e8b-42d3-9b81-8d6a2d296d16.png) Features _Irregularities; not smooth_"));
            answers.Add(new TaskAnswer("![star_inverted.png](https://panoptes-uploads.zooniverse.org/staging/project_attached_image/f0900323-83f1-4971-829c-6437ba6dd63a.png) Not a Galaxy _Star or artifact_"));

            WorkflowTask offlineTask = new WorkflowTask("Choose an Answer", answers);

            OfflineWorkflow.Tasks = new Dictionary <string, WorkflowTask>();
            OfflineWorkflow.Tasks.Add("T0", offlineTask);
        }
Ejemplo n.º 18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskInstances"></param>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static List <WorkflowTask> ToWorkflowTaskList(this List <WorkflowTaskInstancePoco> taskInstances, WorkflowInstancePoco instance = null)
        {
            List <WorkflowTask> workflowItems = new List <WorkflowTask>();

            if (!taskInstances.Any())
            {
                return(workflowItems.OrderByDescending(x => x.CurrentStep).ToList());
            }

            bool useInstanceFromTask = instance == null;

            foreach (WorkflowTaskInstancePoco taskInstance in taskInstances)
            {
                instance = useInstanceFromTask ? taskInstance.WorkflowInstance : instance;

                GetPermissionsForNode(instance.Node);

                string instanceNodeName = instance.Node?.Name ?? "NODE NO LONGER EXISTS";
                string typeDescription  = instance.TypeDescription;

                var item = new WorkflowTask
                {
                    Status          = taskInstance.StatusName,
                    CssStatus       = taskInstance.StatusName.ToLower().Split(' ')[0],
                    Type            = typeDescription,
                    NodeId          = instance.NodeId,
                    InstanceGuid    = instance.Guid,
                    ApprovalGroupId = taskInstance.UserGroup.GroupId,
                    NodeName        = instanceNodeName,
                    RequestedBy     = instance.AuthorUser.Name,
                    RequestedById   = instance.AuthorUser.Id,
                    RequestedOn     = taskInstance.CreatedDate.ToString(),
                    ApprovalGroup   = taskInstance.UserGroup.Name,
                    Comments        = useInstanceFromTask ? instance.AuthorComment : taskInstance.Comment,
                    ActiveTask      = taskInstance.StatusName,
                    Permissions     = _perms,
                    CurrentStep     = taskInstance.ApprovalStep
                };

                workflowItems.Add(item);
            }

            return(workflowItems.OrderByDescending(x => x.CurrentStep).ToList());
        }
Ejemplo n.º 19
0
        public WorkflowTask Patch(WorkflowTask request)
        {
            if (true != (request?.Id > 0))
            {
                throw new HttpError(HttpStatusCode.NotFound, "Please specify a valid Id of the WorkflowTask to patch.");
            }

            request.VisibleFields = request.VisibleFields ?? new List <string>();

            WorkflowTask ret = null;

            using (Execute)
            {
                Execute.Run(ssn =>
                {
                    ret = _AssignValues(request, DocConstantPermission.EDIT, ssn);
                });
            }
            return(ret);
        }
Ejemplo n.º 20
0
        public WorkflowHistoryEvents Result()
        {
            var totalEvents  = _newEvents.Concat(_processedEvents).ToList();
            var decisionTask = new DecisionTask()
            {
                Events            = totalEvents,
                WorkflowExecution = new WorkflowExecution()
                {
                    RunId = _workflowRunId, WorkflowId = _workflowId
                },
                TaskToken = "dummy token"
            };

            if (_newEvents.Count > 0)
            {
                decisionTask.PreviousStartedEventId = _newEvents.Last().EventId - 1;
                decisionTask.StartedEventId         = _newEvents.First().EventId;
            }
            return(new WorkflowHistoryEvents(WorkflowTask.Create(decisionTask)));
        }
        private void ConvertFromXMLForTasks(WorkflowProcess process, XElement element)
        {
            //Get list UserTask
            IEnumerable <XElement> userTaskList = element.Descendants(XMLNodeName.userTask.ToString());

            foreach (XElement xTask in userTaskList)
            {
                // Convertor
                WorkflowUserTask userTask = _workflowProcessUserTasksConvertor.ConvertFromString(xTask.ToString());
                process.AddTask(userTask);
            }
            //Get list ServiceTask
            IEnumerable <XElement> serviceTaskList = element.Descendants(XMLNodeName.serviceTask.ToString());

            foreach (XElement xTask in serviceTaskList)
            {
                // Convertor
                WorkflowServiceTask serviceTask = _workflowProcessServiceTasksConvertor.ConvertFromString(xTask.ToString());
                process.AddTask(serviceTask);
            }
            //Get list ScriptTask
            IEnumerable <XElement> scriptTaskList = element.Descendants(XMLNodeName.scriptTask.ToString());

            foreach (XElement xTask in scriptTaskList)
            {
                // Convertor
                WorkflowScriptTask scriptTask = _workflowProcessScriptTasksConvertor.ConvertFromString(xTask.ToString());
                process.AddTask(scriptTask);
            }
            //Get list Task
            IEnumerable <XElement> taskList = element.Descendants(XMLNodeName.task.ToString());

            foreach (XElement xTask in taskList)
            {
                // Convertor
                WorkflowTask task = _workflowProcessTasksConvertor.ConvertFromString(xTask.ToString());
                process.AddTask(task);
            }
        }
Ejemplo n.º 22
0
        public void Setup()
        {
            var decisionTask = new DecisionTask()
            {
                Events = new List <HistoryEvent>(), TaskToken = "token"
            };

            decisionTask.WorkflowExecution = new WorkflowExecution()
            {
                WorkflowId = "wid", RunId = "rid"
            };
            decisionTask.Events.Add(new HistoryEvent()
            {
                EventId = 5, EventType = EventType.DecisionTaskStarted
            });
            decisionTask.Events.Add(new HistoryEvent()
            {
                EventId = 4
            });
            decisionTask.Events.Add(new HistoryEvent()
            {
                EventId = 3
            });
            decisionTask.Events.Add(new HistoryEvent()
            {
                EventId = 2
            });
            decisionTask.Events.Add(new HistoryEvent()
            {
                EventId = 1
            });
            decisionTask.PreviousStartedEventId = 2;
            decisionTask.StartedEventId         = 5;

            _workflowTask = WorkflowTask.Create(decisionTask);
        }
Ejemplo n.º 23
0
        private WorkflowTask _AssignValues(WorkflowTask request, DocConstantPermission permission, Session session)
        {
            if (permission != DocConstantPermission.ADD && (request == null || request.Id <= 0))
            {
                throw new HttpError(HttpStatusCode.NotFound, $"No record");
            }

            if (permission == DocConstantPermission.ADD && !DocPermissionFactory.HasPermissionTryAdd(currentUser, "WorkflowTask"))
            {
                throw new HttpError(HttpStatusCode.Forbidden, "You do not have ADD permission for this route.");
            }

            request.VisibleFields = request.VisibleFields ?? new List <string>();

            WorkflowTask ret = null;

            request = _InitAssignValues <WorkflowTask>(request, permission, session);
            //In case init assign handles create for us, return it
            if (permission == DocConstantPermission.ADD && request.Id > 0)
            {
                return(request);
            }

            var cacheKey = GetApiCacheKey <WorkflowTask>(DocConstantModelName.WORKFLOWTASK, nameof(WorkflowTask), request);

            //First, assign all the variables, do database lookups and conversions
            var pAssignee                = (request.Assignee?.Id > 0) ? DocEntityUser.GetUser(request.Assignee.Id) : null;
            var pData                    = request.Data;
            var pDescription             = request.Description;
            var pDueDate                 = request.DueDate;
            var pReporter                = (request.Reporter?.Id > 0) ? DocEntityUser.GetUser(request.Reporter.Id) : null;
            DocEntityLookupTable pStatus = GetLookup(DocConstantLookupTable.WORKFLOWSTATUS, request.Status?.Name, request.Status?.Id);
            DocEntityLookupTable pType   = GetLookup(DocConstantLookupTable.WORKFLOWTASKTYPE, request.Type?.Name, request.Type?.Id);
            var pWorkflow                = (request.Workflow?.Id > 0) ? DocEntityWorkflow.GetWorkflow(request.Workflow.Id) : null;

            DocEntityWorkflowTask entity = null;

            if (permission == DocConstantPermission.ADD)
            {
                var now = DateTime.UtcNow;
                entity = new DocEntityWorkflowTask(session)
                {
                    Created = now,
                    Updated = now
                };
            }
            else
            {
                entity = DocEntityWorkflowTask.GetWorkflowTask(request.Id);
                if (null == entity)
                {
                    throw new HttpError(HttpStatusCode.NotFound, $"No record");
                }
            }

            //Special case for Archived
            var pArchived = true == request.Archived;

            if (DocPermissionFactory.IsRequestedHasPermission <bool>(currentUser, request, pArchived, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Archived)))
            {
                if (DocPermissionFactory.IsRequested(request, pArchived, entity.Archived, nameof(request.Archived)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Archived)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Archived)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pArchived) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Archived)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Archived)} requires a value.");
                }
                entity.Archived = pArchived;
                if (DocPermissionFactory.IsRequested <bool>(request, pArchived, nameof(request.Archived)) && !request.VisibleFields.Matches(nameof(request.Archived), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Archived));
                }
            }

            if (DocPermissionFactory.IsRequestedHasPermission <DocEntityUser>(currentUser, request, pAssignee, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Assignee)))
            {
                if (DocPermissionFactory.IsRequested(request, pAssignee, entity.Assignee, nameof(request.Assignee)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Assignee)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Assignee)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pAssignee) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Assignee)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Assignee)} requires a value.");
                }
                entity.Assignee = pAssignee;
                if (DocPermissionFactory.IsRequested <DocEntityUser>(request, pAssignee, nameof(request.Assignee)) && !request.VisibleFields.Matches(nameof(request.Assignee), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Assignee));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <string>(currentUser, request, pData, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Data)))
            {
                if (DocPermissionFactory.IsRequested(request, pData, entity.Data, nameof(request.Data)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Data)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Data)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pData) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Data)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Data)} requires a value.");
                }
                entity.Data = pData;
                if (DocPermissionFactory.IsRequested <string>(request, pData, nameof(request.Data)) && !request.VisibleFields.Matches(nameof(request.Data), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Data));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <string>(currentUser, request, pDescription, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Description)))
            {
                if (DocPermissionFactory.IsRequested(request, pDescription, entity.Description, nameof(request.Description)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Description)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Description)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pDescription) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Description)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Description)} requires a value.");
                }
                entity.Description = pDescription;
                if (DocPermissionFactory.IsRequested <string>(request, pDescription, nameof(request.Description)) && !request.VisibleFields.Matches(nameof(request.Description), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Description));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <DateTime?>(currentUser, request, pDueDate, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.DueDate)))
            {
                if (DocPermissionFactory.IsRequested(request, pDueDate, entity.DueDate, nameof(request.DueDate)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.DueDate)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.DueDate)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pDueDate) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.DueDate)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.DueDate)} requires a value.");
                }
                entity.DueDate = pDueDate;
                if (DocPermissionFactory.IsRequested <DateTime?>(request, pDueDate, nameof(request.DueDate)) && !request.VisibleFields.Matches(nameof(request.DueDate), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.DueDate));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <DocEntityUser>(currentUser, request, pReporter, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Reporter)))
            {
                if (DocPermissionFactory.IsRequested(request, pReporter, entity.Reporter, nameof(request.Reporter)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Reporter)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Reporter)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pReporter) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Reporter)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Reporter)} requires a value.");
                }
                entity.Reporter = pReporter;
                if (DocPermissionFactory.IsRequested <DocEntityUser>(request, pReporter, nameof(request.Reporter)) && !request.VisibleFields.Matches(nameof(request.Reporter), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Reporter));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <DocEntityLookupTable>(currentUser, request, pStatus, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Status)))
            {
                if (DocPermissionFactory.IsRequested(request, pStatus, entity.Status, nameof(request.Status)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Status)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Status)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pStatus) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Status)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Status)} requires a value.");
                }
                entity.Status = pStatus;
                if (DocPermissionFactory.IsRequested <DocEntityLookupTable>(request, pStatus, nameof(request.Status)) && !request.VisibleFields.Matches(nameof(request.Status), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Status));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <DocEntityLookupTable>(currentUser, request, pType, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Type)))
            {
                if (DocPermissionFactory.IsRequested(request, pType, entity.Type, nameof(request.Type)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Type)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Type)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pType) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Type)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Type)} requires a value.");
                }
                entity.Type = pType;
                if (DocPermissionFactory.IsRequested <DocEntityLookupTable>(request, pType, nameof(request.Type)) && !request.VisibleFields.Matches(nameof(request.Type), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Type));
                }
            }
            if (DocPermissionFactory.IsRequestedHasPermission <DocEntityWorkflow>(currentUser, request, pWorkflow, permission, DocConstantModelName.WORKFLOWTASK, nameof(request.Workflow)))
            {
                if (DocPermissionFactory.IsRequested(request, pWorkflow, entity.Workflow, nameof(request.Workflow)))
                {
                    if (DocResources.Metadata.IsInsertOnly(DocConstantModelName.WORKFLOWTASK, nameof(request.Workflow)) && DocConstantPermission.ADD != permission)
                    {
                        throw new HttpError(HttpStatusCode.Forbidden, $"{nameof(request.Workflow)} cannot be modified once set.");
                    }
                }
                if (DocTools.IsNullOrEmpty(pWorkflow) && DocResources.Metadata.IsRequired(DocConstantModelName.WORKFLOWTASK, nameof(request.Workflow)))
                {
                    throw new HttpError(HttpStatusCode.BadRequest, $"{nameof(request.Workflow)} requires a value.");
                }
                entity.Workflow = pWorkflow;
                if (DocPermissionFactory.IsRequested <DocEntityWorkflow>(request, pWorkflow, nameof(request.Workflow)) && !request.VisibleFields.Matches(nameof(request.Workflow), ignoreSpaces: true))
                {
                    request.VisibleFields.Add(nameof(request.Workflow));
                }
            }

            if (request.Locked)
            {
                entity.Locked = request.Locked;
            }

            entity.SaveChanges(permission);

            DocPermissionFactory.SetVisibleFields <WorkflowTask>(currentUser, nameof(WorkflowTask), request.VisibleFields);
            ret = entity.ToDto();

            var cacheExpires = DocResources.Metadata.GetCacheExpiration(DocConstantModelName.WORKFLOWTASK);

            DocCacheClient.Set(key: cacheKey, value: ret, entityId: request.Id, entityType: DocConstantModelName.WORKFLOWTASK, cacheExpires);

            return(ret);
        }
        private WorkflowTask BuildWorkflowTaskDcosDeploy(CreateReleaseDefinitionQuery message, Model.Environment environment)
        {
            var task = new WorkflowTask
            {
                TaskId           = Guid.Parse("5d5d4670-4126-417e-9b7f-ed5f99f9baef"),
                Name             = "Deploy service to DCOS", //"Task group: VO.TG.MarathonApp.DCOS.Deploy $(DCOSBuildVersion)",
                RefName          = "VOTGMarathonAppDCOSDeploy_1",
                Version          = "1.*",
                Enabled          = true,
                AlwaysRun        = true,
                ContinueOnError  = false,
                TimeoutInMinutes = 0,
                DefinitionType   = "metaTask",
                Inputs           = new Dictionary <string, string>
                {
                    { "DCOSBuildVersion", "$(DCOSBuildVersion)" },
                    { "ARTIFACT_PATH", "$(ArtifactAlias)" },
                    { "DCOS_URL", "$(DCOS_URL)" },
                    { "MARATHON_APP_DEF_ARTIFACT_PATH", $"{message.ServiceName.ToLower()}.json" },
                    { "TFS_USER", "" },
                    { "TFS_PAT", "$(TFS_PAT)" },
                    { "APP_NAME", "$(AppName)" },
                    { "APP_INSTANCES", "1" },
                    { "WATCH_DEPLOY", "" }
                }
            };

            /*
             * if (message.IsProdPath)
             * {
             *  task.Inputs.Add("DCOS_USERNAME", "");
             *  task.Inputs.Add("DCOS_PRIVATE_KEY_B64", "");
             *  task.Inputs.Add("CONFIG_REPO_BRANCH", "master");
             *  task.Inputs.Add("ENV_CONFIG_FILE", "");
             * }
             * else*/
            {
                task.Inputs.Add("DCOS_USERNAME", "$(DCOS_USERNAME)");
                switch (environment.EnvironmentTag)
                {
                case Model.EnvironmentTag.Prod:
                    task.Inputs.Add("DCOS_PRIVATE_KEY_B64", "$(DCOS_PRIVATE_KEY_B64)");
                    break;

                case Model.EnvironmentTag.Alpha:
                case Model.EnvironmentTag.QA:
                    task.Inputs.Add("DCOS_PRIVATE_KEY_B64", "$(B64_KEY_QA)");
                    break;

                case Model.EnvironmentTag.Dev:
                    task.Inputs.Add("DCOS_PRIVATE_KEY_B64", "$(B64_KEY_QA)");
                    break;
                }


                if (message.IsProdPath)
                {
                    task.Inputs.Add("CONFIG_REPO_BRANCH", "master");

                    //todo: should Alpha use release?
                }
                else
                {
                    task.Inputs.Add("CONFIG_REPO_BRANCH", "dev");
                }

                var configurationFolder = message.ConfigurationFolder;
                if (message.IsProdPath)
                {
                    configurationFolder = $"/json/DCOS/{environment.TAG}";
                }
                task.Inputs.Add("ENV_CONFIG_FILE", $"{configurationFolder}/{message.ServiceName.ToLower()}.json");
            }

            return(task);
        }
Ejemplo n.º 25
0
 /// <summary>
 /// Initiaze the global variable
 /// </summary>
 /// <param name="category">Selected task element</param>
 public CreateLabels_WorkflowTask(WorkflowTask task)
 {
     this.task = task;
 }
Ejemplo n.º 26
0
 private WorkflowTask WorkflowTaskWithEvents(DateTime decisionTaskTime, double downloadFactor)
 {
     return(WorkflowTask.Create(BuildDecisionTask(decisionTaskTime), downloadFactor));
 }
Ejemplo n.º 27
0
 private WorkflowTask WorkflowTaskWithEvents(DateTime decisionTaskTime)
 {
     return(WorkflowTask.Create(BuildDecisionTask(decisionTaskTime)));
 }
        private List<WorkflowTask> SaveOldTasks(SPListItem eventDataItem, SPWorkflowTaskCollection oldTasks)
        {
            SourceTasks sourceTasks = new SourceTasks();
            if (eventDataItem[SPFieldName.TasksHistory].AsString().IsNullOrWhitespace())
            {

                foreach (SPWorkflowTask task in oldTasks)
                {
                    if (task[SPBuiltInFieldId.TaskStatus].AsString() == "Completed")
                    {
                        lastTaskCompleteDate = task[SPBuiltInFieldId.Modified].AsString();
                    }

                    WorkflowTask workflowTask = new WorkflowTask();
                    workflowTask.Add(WorkflowTaskFieldName.Title, task.Title);
                    workflowTask.Add(WorkflowTaskFieldName.AssignedTo, task[SPBuiltInFieldId.AssignedTo].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.Status, task[SPBuiltInFieldId.TaskStatus].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.Created, task[SPBuiltInFieldId.Created].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.CreatedBy, task[SPBuiltInFieldId.Author].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.StartDate, task[SPBuiltInFieldId.StartDate].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.CompleteDate, task[SPBuiltInFieldId.Modified].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.Outcome, task[SPBuiltInFieldId.WorkflowOutcome].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.Comments, task[SPBuiltInFieldId.Body].AsString());
                    workflowTask.Add(WorkflowTaskFieldName.UIVersion, task[SPBuiltInFieldId._UIVersion].AsString());

                    Hashtable extendedPropertiesAsHashtable = SPWorkflowTask.GetExtendedPropertiesAsHashtable(task);
                    workflowTask.Add(WorkflowTaskFieldName.WorkflowVariables, extendedPropertiesAsHashtable["__WorkflowVaribales"].AsString().Replace('\"', '\''));

                    sourceTasks.tasks.Add(workflowTask);
                }

                eventDataItem[SPFieldName.TasksHistory] = SerializeUtil.Serialize(sourceTasks);
                eventDataItem.Update();
            }
            else
            {
                sourceTasks = SerializeUtil.Deserialize(typeof(SourceTasks), eventDataItem[SPFieldName.TasksHistory].AsString()) as SourceTasks;
                foreach (WorkflowTask sourceTask in sourceTasks.tasks)
                {
                    if (sourceTask[WorkflowTaskFieldName.Status].AsString() == "Completed")
                    {
                        lastTaskCompleteDate = sourceTask[WorkflowTaskFieldName.CompleteDate].AsString();
                    }
                }
            }

            return sourceTasks.tasks;
        }
Ejemplo n.º 29
0
 private async Task ExecuteWorkflowOnSignalEvent(Workflow workflow, string workflowId, string runId)
 {
     var hostedWorkflows = new WorkflowHost(_domain, new[] { workflow });
     var workflowTasks   = WorkflowTask.CreateFor(DecisionTasksWithSignalEvents(workflowId, runId), _domain);
     await workflowTasks.ExecuteForAsync(hostedWorkflows);
 }
Ejemplo n.º 30
0
 public object Get(WorkflowTask request) => GetEntityWithCache <WorkflowTask>(DocConstantModelName.WORKFLOWTASK, request, GetWorkflowTask);
Ejemplo n.º 31
0
 public WorkflowTask Put(WorkflowTask request)
 {
     return(Patch(request));
 }