Beispiel #1
0
        public async Task <ServerCommandResult> Execute(RequestCommand cmd, ExpandoObject dataToExec)
        {
            var rwi = new ResumeWorkflowInfo
            {
                Id = dataToExec.Get <Int64>("Id")
            };

            if (rwi.Id == 0)
            {
                throw new RequestModelException("InboxId must be specified");
            }
            rwi.UserId  = dataToExec.Get <Int64>("UserId");
            rwi.Answer  = dataToExec.Get <String>("Answer");
            rwi.Comment = dataToExec.Get <String>("Comment");
            rwi.Params  = dataToExec.Get <ExpandoObject>("Params");
            WorkflowResult wr = await _workflowEngine.ResumeWorkflow(rwi);

            return(new ServerCommandResult(JsonConvert.SerializeObject(wr, JsonHelpers.StandardSerializerSettings)));
        }
Beispiel #2
0
        public async Task LoadProcessModel()
        {
            Int64  modelId  = 123; // predefined
            Int64  userId   = 50;  // predefined
            String bookmark = "Bookmark1";
            var    info     = new StartWorkflowInfo()
            {
                Source     = "file:Workflows/LoadModel_v1",
                UserId     = userId,
                Schema     = "a2test",
                Model      = "SimpleModel",
                ActionBase = "simple/model",
                ModelId    = modelId
            };
            WorkflowResult result = await _workflow.StartWorkflow(info);

            Assert.AreNotEqual(0, result.ProcessId);

            var pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                     new { UserId = userId, Id = result.ProcessId }
                                                     );

            var dt = new DataTester(pm, "Process.Inboxes");

            dt.IsArray(1);
            dt.AreArrayValueEqual(bookmark, 0, "Bookmark");
            dt.AreArrayValueEqual("User", 0, "For");
            dt.AreArrayValueEqual("ObjectName", 0, "Text");
            dt.AreArrayValueEqual(userId, 0, "ForId");
            Int64 inboxId = dt.GetArrayValue <Int64>(0, "Id");

            var rInfo = new ResumeWorkflowInfo()
            {
                Id     = inboxId,
                UserId = userId
            };

            var resumeResult = await _workflow.ResumeWorkflow(rInfo);

            Assert.AreEqual(resumeResult.ProcessId, result.ProcessId);
        }
        async Task ResumeWorkflow(RequestCommand cmd, ExpandoObject dataToStart, TextWriter writer)
        {
            if (_workflowEngine == null)
            {
                throw new InvalidOperationException($"Service 'IWorkflowEngine' not registered");
            }
            var rwi = new ResumeWorkflowInfo
            {
                Id = dataToStart.Get <Int64>("Id")
            };

            if (rwi.Id == 0)
            {
                throw new RequestModelException("InboxId must be specified");
            }
            rwi.UserId  = dataToStart.Get <Int64>("UserId");
            rwi.Answer  = dataToStart.Get <String>("Answer");
            rwi.Comment = dataToStart.Get <String>("Comment");
            rwi.Params  = dataToStart.Get <ExpandoObject>("Params");
            WorkflowResult wr = await _workflowEngine.ResumeWorkflow(rwi);

            WriteJsonResult(writer, wr);
        }
Beispiel #4
0
        public async Task SimpleRequest()
        {
            Int64  modelId  = 123; // predefined
            Int64  userId   = 50;  // predefined
            String bookmark = "Bookmark1";
            var    info     = new StartWorkflowInfo()
            {
                Source     = "file:Workflows/SimpleRequest_v1",
                UserId     = userId,
                Schema     = "a2test",
                Model      = "SimpleModel",
                ActionBase = "simple/model",
                ModelId    = modelId
            };
            WorkflowResult result = await _workflow.StartWorkflow(info);

            Assert.AreNotEqual(0, result.ProcessId);

            var pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                     new { UserId = userId, Id = result.ProcessId }
                                                     );

            var dt = new DataTester(pm, "Process");

            dt.AreValueEqual(result.ProcessId, "Id");
            dt.AreValueEqual("a2test", "Schema");
            dt.AreValueEqual("SimpleModel", "Model");
            dt.AreValueEqual(modelId, "ModelId");
            dt.AreValueEqual(userId, "Owner");
            dt.AreValueEqual("simple/model", "ActionBase");

            dt = new DataTester(pm, "Process.Inboxes");
            dt.IsArray(1);
            dt.AreArrayValueEqual(bookmark, 0, "Bookmark");
            dt.AreArrayValueEqual("User", 0, "For");
            dt.AreArrayValueEqual(userId, 0, "ForId");
            dt.AreArrayValueEqual("inbox/action", 0, "Action");
            Int64 inboxId = dt.GetArrayValue <Int64>(0, "Id");

            Assert.AreEqual(inboxId, result.InboxIds[0]);

            dt = new DataTester(pm, "Process.Workflow");
            dt.AreValueEqual("Idle", "ExecutionStatus");

            var rInfo = new ResumeWorkflowInfo()
            {
                Id     = inboxId,
                Answer = "OK",
                UserId = userId
            };
            var resumeResult = await _workflow.ResumeWorkflow(rInfo);

            Assert.AreEqual(resumeResult.ProcessId, result.ProcessId);
            Assert.AreEqual(resumeResult.InboxIds.Count, 0);

            pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                 new { UserId = userId, Id = result.ProcessId }
                                                 );

            dt = new DataTester(pm, "Process.Workflow");
            dt.AreValueEqual("Closed", "ExecutionStatus");

            pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Inbox.Debug.Load]",
                                                 new { UserId = userId, Id = inboxId }
                                                 );

            dt = new DataTester(pm, "Inbox");
            dt.AreValueEqual(inboxId, "Id");
            dt.AreValueEqual(bookmark, "Bookmark");
            dt.AreValueEqual(userId, "UserRemoved");
            dt.AreValueEqual("OK", "Answer");
            dt.AreValueEqual(true, "Void");
        }
Beispiel #5
0
        public async Task RequestResultParams()
        {
            Int64  userId    = 50; // predefined
            String bookmark1 = "Bookmark1";
            var    info      = new StartWorkflowInfo()
            {
                Source = "file:Workflows/RequestResultParams_v1",
                UserId = userId
            };
            WorkflowResult result = await _workflow.StartWorkflow(info);

            Assert.AreNotEqual(0, result.ProcessId);

            var pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                     new { UserId = userId, Id = result.ProcessId }
                                                     );

            var dt = new DataTester(pm, "Process");

            dt.AreValueEqual(result.ProcessId, "Id");
            dt.AreValueEqual(userId, "Owner");

            dt = new DataTester(pm, "Process.Inboxes");
            dt.IsArray(1);
            dt.AreArrayValueEqual(bookmark1, 0, "Bookmark");
            dt.AreArrayValueEqual("User", 0, "For");
            dt.AreArrayValueEqual(userId, 0, "ForId");
            Int64 inboxId = dt.GetArrayValue <Int64>(0, "Id");

            Assert.AreEqual(inboxId, result.InboxIds[0]);
            dt = new DataTester(pm, "Process.Workflow");
            dt.AreValueEqual("Idle", "ExecutionStatus");

            ExpandoObject resumeParams = new ExpandoObject();

            resumeParams.Set("Id", 500L);
            resumeParams.Set("Text", "ParamText");
            var rInfo = new ResumeWorkflowInfo()
            {
                Id     = inboxId,
                Answer = "OK",
                UserId = userId,
                Params = resumeParams
            };
            var resumeResult = await _workflow.ResumeWorkflow(rInfo);

            Assert.AreEqual(resumeResult.ProcessId, result.ProcessId);
            Assert.AreEqual(resumeResult.InboxIds.Count, 1);
            pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                 new { UserId = userId, Id = result.ProcessId }
                                                 );

            dt = new DataTester(pm, "Process.Inboxes");
            dt.IsArray(1);
            inboxId = dt.GetArrayValue <Int64>(0, "Id");

            rInfo = new ResumeWorkflowInfo()
            {
                Id     = inboxId,
                UserId = userId
            };

            resumeResult = await _workflow.ResumeWorkflow(rInfo);

            Assert.AreEqual(resumeResult.ProcessId, result.ProcessId);
            Assert.AreEqual(resumeResult.InboxIds.Count, 0);
            pm = await _dbContext.LoadModelAsync(String.Empty, "a2workflow.[Process.Load]",
                                                 new { UserId = userId, Id = result.ProcessId }
                                                 );

            dt = new DataTester(pm, "Process.TrackRecords");
            dt.IsArray(1);
            dt.AreArrayValueEqual("Id:500 Text:ParamText", 0, "Message");
            dt.AreArrayValueEqual(userId, 0, "UserId");
        }
Beispiel #6
0
 public async Task <WorkflowResult> ResumeWorkflow(ResumeWorkflowInfo info)
 {
     return(await AppWorkflow.ResumeWorkflow(_host, _dbContext, _messaging, info));
 }
Beispiel #7
0
        public static async Task <WorkflowResult> ResumeWorkflow(IApplicationHost host, IDbContext dbContext, ResumeWorkflowInfo info)
        {
            AppWorkflow aw     = null;
            var         result = new WorkflowResult
            {
                InboxIds = new List <Int64>()
            };

            try
            {
                InboxInfo inbox = await InboxInfo.Load(dbContext, info.Id, info.UserId);

                result.ProcessId = inbox.ProcessId;
                var      def  = WorkflowDefinition.Load(inbox);
                Activity root = def.LoadFromSource(host);
                aw = Create(dbContext, root, null, def.Identity);
                aw._application.Extensions.Add(result);
                aw._application.Extensions.Add(dbContext);
                WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(inbox.WorkflowId, aw._application.InstanceStore);
                aw._application.Load(instance, _wfTimeSpan);
                foreach (var bm in aw._application.GetBookmarks())
                {
                    if (bm.BookmarkName == inbox.Bookmark)
                    {
                        var rr = new RequestResult
                        {
                            Answer  = info.Answer,
                            Comment = info.Comment,
                            Params  = info.Params,
                            UserId  = info.UserId,
                            InboxId = info.Id
                        };
                        aw._application.ResumeBookmark(bm.BookmarkName, rr);
                        return(result);                        // already resumed
                    }
                }
                // if a bookmark is not found
                aw._application.Unload();
            }
            catch (Exception ex)
            {
                if (!CatchWorkflow(aw, ex))
                {
                    throw;
                }
            }
            finally
            {
                ProcessFinally(aw);
            }
            return(result);
        }
Beispiel #8
0
        public static async Task <WorkflowResult> ResumeWorkflow(IApplicationHost host, IDbContext dbContext, IMessaging messaging, ResumeWorkflowInfo info)
        {
            AppWorkflow aw       = null;
            var         profiler = host.Profiler;
            var         result   = new WorkflowResult
            {
                InboxIds = new List <Int64>()
            };

            try
            {
                InboxInfo inbox = await InboxInfo.Load(dbContext, info.Id, info.UserId);

                if (inbox == null)
                {
                    throw new WorkflowException("The task is already done by another user");
                }
                using (profiler.CurrentRequest.Start(ProfileAction.Workflow, $"Load '{inbox.Kind}'"))
                {
                    result.ProcessId = inbox.ProcessId;
                    var      def  = WorkflowDefinition.Load(inbox);
                    Activity root = def.LoadFromSource(host, dbContext);
                    aw = Create(dbContext, root, null, def.Identity);
                    aw._application.Extensions.Add(result);
                    aw._application.Extensions.Add(dbContext);
                    aw._application.Extensions.Add(messaging);
                    aw._application.Extensions.Add(host);
                    WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(inbox.WorkflowId, aw._application.InstanceStore);
                    aw._application.Load(instance, _wfTimeSpan);
                }
                foreach (var bm in aw._application.GetBookmarks())
                {
                    if (bm.BookmarkName == inbox.Bookmark)
                    {
                        var rr = new RequestResult
                        {
                            Answer  = info.Answer,
                            Comment = info.Comment,
                            Params  = info.Params,
                            UserId  = info.UserId,
                            InboxId = info.Id
                        };
                        using (profiler.CurrentRequest.Start(ProfileAction.Workflow, $"Resume '{bm.BookmarkName}'"))
                        {
                            aw._application.ResumeBookmark(bm.BookmarkName, rr);
                        }
                        return(result);                        // already resumed
                    }
                }
                // if a bookmark is not found
                aw._application.Unload();
            }
            catch (Exception ex)
            {
                if (!CatchWorkflow(aw, ex))
                {
                    throw;
                }
            }
            finally
            {
                ProcessFinally(aw);
            }
            return(result);
        }