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))); }
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); }
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"); }
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"); }
public async Task <WorkflowResult> ResumeWorkflow(ResumeWorkflowInfo info) { return(await AppWorkflow.ResumeWorkflow(_host, _dbContext, _messaging, info)); }
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); }
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); }