diff --git a/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj b/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj index 43f5e33..0833230 100644 --- a/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj +++ b/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj @@ -5,7 +5,7 @@ enable enable Caspian.WorkflowFramework - 1.1.0-preview.7 + 1.1.0-preview.9 Digital banking team Caspian Caspian.WorkflowFramework diff --git a/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs b/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs index a57a111..9cefbfd 100644 --- a/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs +++ b/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs @@ -1,4 +1,9 @@ -using System.Text.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; using JetBrains.Annotations; namespace Caspian.WorkflowFramework.Models; @@ -10,6 +15,14 @@ public class WorkflowModel /// public string? InstanceId { get; set; } + /// + /// نوع نمونه + /// + /// exist, new, ... + /// + /// + public string? InstanceMode { get; set; } = "exist"; + /// /// نام گردش کار /// @@ -43,6 +56,11 @@ public class WorkflowModel /// public string? NextPageUrl { get; set; } + /// + /// شماره صفحه + /// + public int? PageNumber { get; set; } + /// /// رویدادی که باید پس از سابمیت صفحه بعدی منتشر شود /// diff --git a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs index 485ae1a..815383b 100644 --- a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs +++ b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs @@ -1,4 +1,7 @@ -using Caspian.WorkflowFramework.Contracts; +using System.Diagnostics; +using System.Dynamic; +using System.Text.Json; +using Caspian.WorkflowFramework.Contracts; using Caspian.WorkflowFramework.Models; using Caspian.WorkflowFramework.Utility; using Elsa.Common.Entities; @@ -13,77 +16,189 @@ using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using San.MongoLogger; -using System.Diagnostics; -using System.Dynamic; -using System.Text.Json; -namespace Caspian.WorkflowFramework.Services +namespace Caspian.WorkflowFramework.Services; +public class WorkflowService : IWorkflowService, ILoggable { - public class WorkflowService : IWorkflowService, ILoggable + #region Fields + private readonly IServiceProvider _serviceProvider; + private readonly IWorkflowRuntime _workflowRuntime; + private readonly IWorkflowDefinitionService _workflowDefinitionService; + private readonly IWorkflowInstanceVariableManager _workflowInstanceVariableManager; + private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceStore _workflowInstanceStore; + private readonly IEventPublisher _eventPublisher; + private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager; + private readonly IMdbLogger _logger; + #endregion + + #region Ctor + public WorkflowService(IServiceProvider serviceProvider, + IMdbLogger logger) { - #region Fields - private readonly IServiceProvider _serviceProvider; - private readonly IWorkflowRuntime _workflowRuntime; - private readonly IWorkflowDefinitionService _workflowDefinitionService; - private readonly IWorkflowInstanceVariableManager _workflowInstanceVariableManager; - private readonly IWorkflowInstanceManager _workflowInstanceManager; - private readonly IWorkflowInstanceStore _workflowInstanceStore; - private readonly IEventPublisher _eventPublisher; - private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager; - private readonly IMdbLogger _logger; - #endregion + _serviceProvider = serviceProvider; + _workflowRuntime = _serviceProvider.GetRequiredService(); + _workflowDefinitionService = _serviceProvider.GetRequiredService(); + _workflowInstanceVariableManager = _serviceProvider.GetRequiredService(); + _workflowInstanceManager = _serviceProvider.GetRequiredService(); + _workflowInstanceStore = _serviceProvider.GetRequiredService(); + _eventPublisher = _serviceProvider.GetRequiredService(); + _logger = logger; + } + #endregion - #region Ctor - public WorkflowService(IServiceProvider serviceProvider, - IMdbLogger logger) + #region CreateAndExecuteAsync + /// + public async Task> CreateAndExecuteAsync(CreateAndExecuteWorkflowModel input) + { + var sw = Stopwatch.StartNew(); + try { - _serviceProvider = serviceProvider; - _workflowRuntime = _serviceProvider.GetRequiredService(); - _workflowDefinitionService = _serviceProvider.GetRequiredService(); - _workflowInstanceVariableManager = _serviceProvider.GetRequiredService(); - _workflowInstanceManager = _serviceProvider.GetRequiredService(); - _workflowInstanceStore = _serviceProvider.GetRequiredService(); - _eventPublisher = _serviceProvider.GetRequiredService(); - _logger = logger; - } - #endregion + _logger.Log("Start of CreateAndExecuteAsync", input); - #region CreateAndExecuteAsync - /// - public async Task> CreateAndExecuteAsync(CreateAndExecuteWorkflowModel input) - { - var sw = Stopwatch.StartNew(); - try - { - _logger.Log("Start of CreateAndExecuteAsync", input); + WorkflowResponse response; - WorkflowResponse response; + var workflowClient = await _workflowRuntime.CreateClientAsync(); - var workflowClient = await _workflowRuntime.CreateClientAsync(); - - var definition = await _workflowDefinitionService - .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter() - { - Name = input.Name - }); - - if (definition == null) + var definition = await _workflowDefinitionService + .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter() { - var msg = $"Workflow '{input.Name}' defintion not found"; - response = new WorkflowResponse() - { - Status = 1, - Message = msg, - Data = null - }; + Name = input.Name + }); - sw.Stop(); + if (definition == null) + { + var msg = $"Workflow '{input.Name}' defintion not found"; + response = new WorkflowResponse() + { + Status = 1, + Message = msg, + Data = null + }; - _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); + sw.Stop(); - return response; - } + _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); + return response; + } + + var instanceInput = new Dictionary { ["UserId"] = input.UserId }; + input.Version = VersionOptions.Published; + var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest + { + WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, input.Version), + Input = instanceInput, + ExternalUserId = input.UserId + }); + + var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty); + + var variables = await _workflowInstanceVariableManager.GetVariablesAsync(result.WorkflowInstanceId); + + // تبدیل به دیکشنری + var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); + + var workflowModel = dictionary.ConvertToWorkflowModel(); + workflowModel.InstanceId = workflowClient.WorkflowInstanceId; + workflowModel.UserId = input.UserId; + workflowModel.InstanceMode = "exist"; + + response = new WorkflowResponse() + { + Status = 0, + Message = "Success", + Data = workflowModel + }; + + sw.Stop(); + + _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); + + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse() + { + Status = 100, + Message = ex.Message, + Data = null + }; + + sw.Stop(); + + _logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex); + + return response; + } + } + #endregion + + #region CreateOrGetInstanceAsync + /// + public async Task> CreateOrGetInstanceAsync(CreateAndExecuteWorkflowModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of CreateOrGetInstanceAsync", input); + + WorkflowResponse response; + + var workflowClient = await _workflowRuntime.CreateClientAsync(); + + var definition = await _workflowDefinitionService + .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter() + { + Name = input.Name + }); + + if (definition == null) + { + var msg = $"Workflow '{input.Name}' defintion not found"; + response = new WorkflowResponse() + { + Status = 1, + Message = msg, + Data = null + }; + + sw.Stop(); + + _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); + + return response; + } + + var instances = await _workflowInstanceStore.FindManyAsync( + new WorkflowInstanceFilter + { + ExternalUserId = input.UserId, + DefinitionId = definition.DefinitionId, + WorkflowStatus = WorkflowStatus.Running + }, + new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) + ); + + var runningWorkflowInstance = instances.FirstOrDefault(); + + //var runningWorkflowInstance = await _workflowInstanceManager + // .FindAsync(new WorkflowInstanceFilter() + // { + // ExternalUserId = input.UserId, + // DefinitionId = definition.DefinitionId, + // WorkflowStatus = WorkflowStatus.Running + // }); + + string workflowInstanceId = string.Empty; + if (runningWorkflowInstance != null) + { + workflowInstanceId = runningWorkflowInstance.Id; + + } + else + { var instanceInput = new Dictionary { ["UserId"] = input.UserId }; input.Version = VersionOptions.Published; var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest @@ -94,228 +209,73 @@ namespace Caspian.WorkflowFramework.Services }); var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty); - - var variables = await _workflowInstanceVariableManager.GetVariablesAsync(result.WorkflowInstanceId); - - // تبدیل به دیکشنری - var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); - - var workflowModel = dictionary.ConvertToWorkflowModel(); - workflowModel.InstanceId = workflowClient.WorkflowInstanceId; - workflowModel.UserId = input.UserId; - - response = new WorkflowResponse() - { - Status = 0, - Message = "Success", - Data = workflowModel - }; - - sw.Stop(); - - _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); - - return response; + workflowInstanceId = result.WorkflowInstanceId; } - catch (Exception ex) + + var id = workflowInstanceId; + var variables = await _workflowInstanceVariableManager + .GetVariablesAsync(id); + + // تبدیل به دیکشنری + var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); + + var workflowModel = dictionary.ConvertToWorkflowModel(); + workflowModel.InstanceId = workflowInstanceId; + workflowModel.UserId = input.UserId; + workflowModel.InstanceId = runningWorkflowInstance != null ? "exist" : "new"; + + response = new WorkflowResponse() { - var response = new WorkflowResponse() - { - Status = 100, - Message = ex.Message, - Data = null - }; + Status = 0, + Message = "Success", + Data = workflowModel + }; - sw.Stop(); + sw.Stop(); - _logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex); + _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); - return response; - } + return response; } - #endregion - - #region CreateOrGetInstanceAsync - /// - public async Task> CreateOrGetInstanceAsync(CreateAndExecuteWorkflowModel input) + catch (Exception ex) { - var sw = Stopwatch.StartNew(); - try + var response = new WorkflowResponse() { - _logger.Log("Start of CreateOrGetInstanceAsync", input); + Status = 100, + Message = ex.Message, + Data = null + }; - WorkflowResponse response; + sw.Stop(); - var workflowClient = await _workflowRuntime.CreateClientAsync(); + _logger.Log("Exception occurs in CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex); - var definition = await _workflowDefinitionService - .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter() - { - Name = input.Name - }); - - if (definition == null) - { - var msg = $"Workflow '{input.Name}' defintion not found"; - response = new WorkflowResponse() - { - Status = 1, - Message = msg, - Data = null - }; - - sw.Stop(); - - _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); - - return response; - } - - var instances = await _workflowInstanceStore.FindManyAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - DefinitionId = definition.DefinitionId, - WorkflowStatus = WorkflowStatus.Running - }, - new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) - ); - - var runningWorkflowInstance = instances.FirstOrDefault(); - - //var runningWorkflowInstance = await _workflowInstanceManager - // .FindAsync(new WorkflowInstanceFilter() - // { - // ExternalUserId = input.UserId, - // DefinitionId = definition.DefinitionId, - // WorkflowStatus = WorkflowStatus.Running - // }); - - var workflowInstanceId = string.Empty; - if (runningWorkflowInstance != null) - { - workflowInstanceId = runningWorkflowInstance.Id; - } - else - { - var instanceInput = new Dictionary { ["UserId"] = input.UserId }; - input.Version = VersionOptions.Published; - var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest - { - WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, input.Version), - Input = instanceInput, - ExternalUserId = input.UserId - }); - - var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty); - workflowInstanceId = result.WorkflowInstanceId; - } - - var id = workflowInstanceId; - var variables = await _workflowInstanceVariableManager - .GetVariablesAsync(id); - - // تبدیل به دیکشنری - var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); - - var workflowModel = dictionary.ConvertToWorkflowModel(); - workflowModel.InstanceId = workflowInstanceId; - workflowModel.UserId = input.UserId; - - response = new WorkflowResponse() - { - Status = 0, - Message = "Success", - Data = workflowModel - }; - - sw.Stop(); - - _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds); - - return response; - } - catch (Exception ex) - { - var response = new WorkflowResponse() - { - Status = 100, - Message = ex.Message, - Data = null - }; - - sw.Stop(); - - _logger.Log("Exception occurs in CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex); - - return response; - } + return response; } - #endregion + } + #endregion - #region PublishEventAsync - /// - public async Task> PublishEventAsync(PublishEventModel input) + #region PublishEventAsync + /// + public async Task> PublishEventAsync(PublishEventModel input) + { + var sw = Stopwatch.StartNew(); + try { - var sw = Stopwatch.StartNew(); - try + _logger.Log("Start of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, input); + + WorkflowResponse response; + + var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId); + + if (instance == null) { - _logger.Log("Start of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, input); - - WorkflowResponse response; - - var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId); - - if (instance == null) - { - var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found"; - response = new WorkflowResponse() - { - Status = 1, - Message = msg, - Data = null - }; - - sw.Stop(); - - _logger.Log("End of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds); - - return response; - } - - dynamic payload = null; - - if (input.EventData.ValueKind != JsonValueKind.Undefined && - input.EventData.ValueKind != JsonValueKind.Null) - { - var json = input.EventData.GetRawText(); - - var settings = new JsonSerializerSettings - { - Converters = { new ExpandoObjectConverter() } - }; - - // تبدیل JSON به object داینامیک - payload = JsonConvert.DeserializeObject(json, settings); - } - - //await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, input.EventData, asynchronous: true); - await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, payload); - - var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId); - - // تبدیل به دیکشنری - var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); - - var workflowModel = dictionary.ConvertToWorkflowModel(); - workflowModel.InstanceId = instance.Id; - workflowModel.UserId = instance.ExternalUserId; - + var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found"; response = new WorkflowResponse() { - Status = 0, - Message = "Success", - Data = workflowModel + Status = 1, + Message = msg, + Data = null }; sw.Stop(); @@ -324,68 +284,88 @@ namespace Caspian.WorkflowFramework.Services return response; } - catch (Exception ex) + + dynamic payload = null; + + if (input.EventData.ValueKind != JsonValueKind.Undefined && + input.EventData.ValueKind != JsonValueKind.Null) { - var response = new WorkflowResponse() + var json = input.EventData.GetRawText(); + + var settings = new JsonSerializerSettings { - Status = 100, - Message = ex.Message, - Data = null + Converters = { new ExpandoObjectConverter() } }; - sw.Stop(); - - _logger.Log("Exception occurs in PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); - - return response; + // تبدیل JSON به object داینامیک + payload = JsonConvert.DeserializeObject(json, settings); } - } - #endregion - #region InquiryStateAsync - /// - public async Task> InquiryStateAsync(InquiryStateModel input) - { - var sw = Stopwatch.StartNew(); - try + //await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, input.EventData, asynchronous: true); + await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, payload); + + var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId); + + // تبدیل به دیکشنری + var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); + + var workflowModel = dictionary.ConvertToWorkflowModel(); + workflowModel.InstanceId = instance.Id; + workflowModel.UserId = instance.ExternalUserId; + workflowModel.InstanceMode = "exist"; + + response = new WorkflowResponse() { - _logger.Log("Start of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, input); + Status = 0, + Message = "Success", + Data = workflowModel + }; - WorkflowResponse response; + sw.Stop(); - var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId); + _logger.Log("End of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds); - if (instance == null) - { - var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found"; - response = new WorkflowResponse() - { - Status = 1, - Message = msg, - Data = null - }; + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse() + { + Status = 100, + Message = ex.Message, + Data = null + }; - sw.Stop(); + sw.Stop(); - _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds); + _logger.Log("Exception occurs in PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); - return response; - } + return response; + } + } + #endregion - var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId); + #region InquiryStateAsync + /// + public async Task> InquiryStateAsync(InquiryStateModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, input); - // تبدیل به دیکشنری - var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); + WorkflowResponse response; - var workflowModel = dictionary.ConvertToWorkflowModel(); - workflowModel.InstanceId = instance.Id; - workflowModel.UserId = instance.ExternalUserId; + var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId); + if (instance == null) + { + var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found"; response = new WorkflowResponse() { - Status = 0, - Message = "Success", - Data = workflowModel + Status = 1, + Message = msg, + Data = null }; sw.Stop(); @@ -394,328 +374,353 @@ namespace Caspian.WorkflowFramework.Services return response; } - catch (Exception ex) + + var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId); + + // تبدیل به دیکشنری + var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value); + + var workflowModel = dictionary.ConvertToWorkflowModel(); + workflowModel.InstanceId = instance.Id; + workflowModel.UserId = instance.ExternalUserId; + workflowModel.InstanceMode = "exist"; + + response = new WorkflowResponse() { - var response = new WorkflowResponse() - { - Status = 100, - Message = ex.Message, - Data = null - }; + Status = 0, + Message = "Success", + Data = workflowModel + }; - sw.Stop(); + sw.Stop(); - _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); + _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds); - return response; - } + return response; } - #endregion - - #region GetActiveInstancesAsync - public async Task>> GetActiveInstancesAsync(GetActiveInstancesModel input) + catch (Exception ex) { - var sw = Stopwatch.StartNew(); - try + var response = new WorkflowResponse() { - _logger.Log("Start of GetActiveInstancesAsync", input); + Status = 100, + Message = ex.Message, + Data = null + }; - var instances = await _workflowInstanceStore.FindManyAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - WorkflowStatus = WorkflowStatus.Running - }); + sw.Stop(); - var result = new List(); + _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); - foreach (var instance in instances) - { - var variables = await _workflowInstanceVariableManager.GetVariablesAsync(instance.Id); - var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value); - - var model = dict.ConvertToWorkflowModel(); - model.InstanceId = instance.Id; - model.UserId = instance.ExternalUserId; - - result.Add(model); - } - - var response = new WorkflowResponse> - { - Status = 0, - Message = "Success", - Data = result - }; - - sw.Stop(); - _logger.Log("End of GetActiveInstancesAsync", response, sw.ElapsedMilliseconds); - return response; - } - catch (Exception ex) - { - var response = new WorkflowResponse> - { - Status = 100, - Message = ex.Message, - Data = null - }; - - sw.Stop(); - _logger.Log("Exception in GetActiveInstancesAsync", response, sw.ElapsedMilliseconds, ex); - return response; - } + return response; } - #endregion + } + #endregion - #region GetActiveInstanceIdsAsync - public async Task>> GetActiveInstanceIdsAsync(GetActiveInstancesModel input) + #region GetActiveInstancesAsync + public async Task>> GetActiveInstancesAsync(GetActiveInstancesModel input) + { + var sw = Stopwatch.StartNew(); + try { - var sw = Stopwatch.StartNew(); - try + _logger.Log("Start of GetActiveInstancesAsync", input); + + var instances = await _workflowInstanceStore.FindManyAsync( + new WorkflowInstanceFilter + { + ExternalUserId = input.UserId, + WorkflowStatus = WorkflowStatus.Running + }); + + var result = new List(); + + foreach (var instance in instances) { - _logger.Log("Start of GetActiveInstanceIdsAsync", input); - - var instances = await _workflowInstanceStore.FindManyAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - WorkflowStatus = WorkflowStatus.Running - }); - - var instanceIds = instances.Select(i => i.Id).ToList(); - - var response = new WorkflowResponse> - { - Status = 0, - Message = "Success", - Data = instanceIds - }; - - sw.Stop(); - _logger.Log("End of GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds); - return response; - } - catch (Exception ex) - { - var response = new WorkflowResponse> - { - Status = 100, - Message = ex.Message, - Data = null - }; - - sw.Stop(); - _logger.Log("Exception in GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds, ex); - return response; - } - } - #endregion - - #region GetLatestActiveInstanceAsync - public async Task> GetLatestActiveInstanceAsync(GetLatestActiveInstanceModel input) - { - var sw = Stopwatch.StartNew(); - try - { - _logger.Log("Start of GetLatestActiveInstanceAsync", input); - - var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync( - new WorkflowDefinitionFilter { Name = input.WorkflowName }); - - if (definition == null) - { - return new WorkflowResponse - { - Status = 1, - Message = $"Workflow '{input.WorkflowName}' not found", - Data = null - }; - } - - var instances = await _workflowInstanceStore.FindManyAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - DefinitionId = definition.DefinitionId, - WorkflowStatus = WorkflowStatus.Running - }, - new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) - ); - - var latest = instances.FirstOrDefault(); - - if (latest == null) - { - return new WorkflowResponse - { - Status = 1, - Message = "No active workflow instance found", - Data = null - }; - } - - var variables = await _workflowInstanceVariableManager.GetVariablesAsync(latest.Id); + var variables = await _workflowInstanceVariableManager.GetVariablesAsync(instance.Id); var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value); var model = dict.ConvertToWorkflowModel(); - model.InstanceId = latest.Id; - model.UserId = latest.ExternalUserId; + model.InstanceId = instance.Id; + model.UserId = instance.ExternalUserId; + model.InstanceMode = "exist"; - var response = new WorkflowResponse - { - Status = 0, - Message = "Success", - Data = model - }; - - sw.Stop(); - _logger.Log("End of GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds); - return response; + result.Add(model); } - catch (Exception ex) + + var response = new WorkflowResponse> { - var response = new WorkflowResponse + Status = 0, + Message = "Success", + Data = result + }; + + sw.Stop(); + _logger.Log("End of GetActiveInstancesAsync", response, sw.ElapsedMilliseconds); + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse> + { + Status = 100, + Message = ex.Message, + Data = null + }; + + sw.Stop(); + _logger.Log("Exception in GetActiveInstancesAsync", response, sw.ElapsedMilliseconds, ex); + return response; + } + } + #endregion + + #region GetActiveInstanceIdsAsync + public async Task>> GetActiveInstanceIdsAsync(GetActiveInstancesModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of GetActiveInstanceIdsAsync", input); + + var instances = await _workflowInstanceStore.FindManyAsync( + new WorkflowInstanceFilter { - Status = 100, - Message = ex.Message, + ExternalUserId = input.UserId, + WorkflowStatus = WorkflowStatus.Running + }); + + var instanceIds = instances.Select(i => i.Id).ToList(); + + var response = new WorkflowResponse> + { + Status = 0, + Message = "Success", + Data = instanceIds + }; + + sw.Stop(); + _logger.Log("End of GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds); + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse> + { + Status = 100, + Message = ex.Message, + Data = null + }; + + sw.Stop(); + _logger.Log("Exception in GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds, ex); + return response; + } + } + #endregion + + #region GetLatestActiveInstanceAsync + public async Task> GetLatestActiveInstanceAsync(GetLatestActiveInstanceModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of GetLatestActiveInstanceAsync", input); + + var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync( + new WorkflowDefinitionFilter { Name = input.WorkflowName }); + + if (definition == null) + { + return new WorkflowResponse + { + Status = 1, + Message = $"Workflow '{input.WorkflowName}' not found", Data = null }; - - sw.Stop(); - _logger.Log("Exception in GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds, ex); - return response; } - } - #endregion - #region GetLatestActiveInstanceIdAsync - public async Task> GetLatestActiveInstanceIdAsync(GetLatestActiveInstanceModel input) - { - var sw = Stopwatch.StartNew(); - try + var instances = await _workflowInstanceStore.FindManyAsync( + new WorkflowInstanceFilter + { + ExternalUserId = input.UserId, + DefinitionId = definition.DefinitionId, + WorkflowStatus = WorkflowStatus.Running + }, + new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) + ); + + var latest = instances.FirstOrDefault(); + + if (latest == null) { - _logger.Log("Start of GetLatestActiveInstanceIdAsync", input); - - var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync( - new WorkflowDefinitionFilter { Name = input.WorkflowName }); - - if (definition == null) + return new WorkflowResponse { - return new WorkflowResponse - { - Status = 1, - Message = $"Workflow '{input.WorkflowName}' not found", - Data = null - }; - } - - var instances = await _workflowInstanceStore.FindManyAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - DefinitionId = definition.DefinitionId, - WorkflowStatus = WorkflowStatus.Running - }, - new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) - ); - - var latest = instances.FirstOrDefault(); - - if (latest == null) - { - return new WorkflowResponse - { - Status = 1, - Message = "No active workflow instance found", - Data = null - }; - } - - var response = new WorkflowResponse - { - Status = 0, - Message = "Success", - Data = latest.Id - }; - - sw.Stop(); - _logger.Log("End of GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds); - return response; - } - catch (Exception ex) - { - var response = new WorkflowResponse - { - Status = 100, - Message = ex.Message, + Status = 1, + Message = "No active workflow instance found", Data = null }; - - sw.Stop(); - _logger.Log("Exception in GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds, ex); - return response; } + + var variables = await _workflowInstanceVariableManager.GetVariablesAsync(latest.Id); + var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value); + + var model = dict.ConvertToWorkflowModel(); + model.InstanceId = latest.Id; + model.UserId = latest.ExternalUserId; + model.InstanceMode = "exist"; + + var response = new WorkflowResponse + { + Status = 0, + Message = "Success", + Data = model + }; + + sw.Stop(); + _logger.Log("End of GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds); + return response; } - #endregion - - #region CancelInstanceAsync - public async Task> CancelInstanceAsync(CancelWorkflowInstanceModel input) + catch (Exception ex) { - var sw = Stopwatch.StartNew(); - try + var response = new WorkflowResponse { - _logger.Log("Start of CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, input); + Status = 100, + Message = ex.Message, + Data = null + }; - // پیدا کردن instance - var instance = await _workflowInstanceStore.FindAsync( - new WorkflowInstanceFilter - { - ExternalUserId = input.UserId, - WorkflowStatus = WorkflowStatus.Running - }); + sw.Stop(); + _logger.Log("Exception in GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds, ex); + return response; + } + } + #endregion - if (instance == null) + #region GetLatestActiveInstanceIdAsync + public async Task> GetLatestActiveInstanceIdAsync(GetLatestActiveInstanceModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of GetLatestActiveInstanceIdAsync", input); + + var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync( + new WorkflowDefinitionFilter { Name = input.WorkflowName }); + + if (definition == null) + { + return new WorkflowResponse { - return new WorkflowResponse - { - Status = 1, - Message = "Workflow instance not found", - Data = false - }; - } - - // ایجاد client روی workflow instance موردنظر - var client = await _workflowRuntime.CreateClientAsync(instance.Id); - - // لغو workflow - await client.CancelAsync(); - - var response = new WorkflowResponse - { - Status = 0, - Message = "Success", - Data = true + Status = 1, + Message = $"Workflow '{input.WorkflowName}' not found", + Data = null }; - - sw.Stop(); - _logger.Log("End of CancelInstanceAsync", WFInstanceId: instance.Id, response, sw.ElapsedMilliseconds); - return response; } - catch (Exception ex) - { - var response = new WorkflowResponse + + var instances = await _workflowInstanceStore.FindManyAsync( + new WorkflowInstanceFilter { - Status = 100, - Message = ex.Message, + ExternalUserId = input.UserId, + DefinitionId = definition.DefinitionId, + WorkflowStatus = WorkflowStatus.Running + }, + new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending) + ); + + var latest = instances.FirstOrDefault(); + + if (latest == null) + { + return new WorkflowResponse + { + Status = 1, + Message = "No active workflow instance found", + Data = null + }; + } + + var response = new WorkflowResponse + { + Status = 0, + Message = "Success", + Data = latest.Id + }; + + sw.Stop(); + _logger.Log("End of GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds); + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse + { + Status = 100, + Message = ex.Message, + Data = null + }; + + sw.Stop(); + _logger.Log("Exception in GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds, ex); + return response; + } + } + #endregion + + #region CancelInstanceAsync + public async Task> CancelInstanceAsync(CancelWorkflowInstanceModel input) + { + var sw = Stopwatch.StartNew(); + try + { + _logger.Log("Start of CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, input); + + // پیدا کردن instance + var instance = await _workflowInstanceStore.FindAsync( + new WorkflowInstanceFilter + { + ExternalUserId = input.UserId, + WorkflowStatus = WorkflowStatus.Running + }); + + if (instance == null) + { + return new WorkflowResponse + { + Status = 1, + Message = "Workflow instance not found", Data = false }; - - sw.Stop(); - _logger.Log("Exception in CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); - return response; } + + // ایجاد client روی workflow instance موردنظر + var client = await _workflowRuntime.CreateClientAsync(instance.Id); + + // لغو workflow + await client.CancelAsync(); + + var response = new WorkflowResponse + { + Status = 0, + Message = "Success", + Data = true + }; + + sw.Stop(); + _logger.Log("End of CancelInstanceAsync", WFInstanceId: instance.Id, response, sw.ElapsedMilliseconds); + return response; + } + catch (Exception ex) + { + var response = new WorkflowResponse + { + Status = 100, + Message = ex.Message, + Data = false + }; + + sw.Stop(); + _logger.Log("Exception in CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); + return response; } - #endregion } -} + #endregion +} \ No newline at end of file diff --git a/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs b/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs index cb472ab..7a205f4 100644 --- a/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs +++ b/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs @@ -23,6 +23,10 @@ namespace Caspian.WorkflowFramework.Utility ? dictionary[nameof(workflowModel.InstanceId)]?.ToString() : null; + workflowModel.InstanceMode = dictionary.ContainsKey(nameof(workflowModel.InstanceMode)) + ? dictionary[nameof(workflowModel.InstanceMode)]?.ToString() + : null; + workflowModel.Name = dictionary.ContainsKey(nameof(workflowModel.Name)) ? dictionary[nameof(workflowModel.Name)]?.ToString() : null; @@ -101,6 +105,10 @@ namespace Caspian.WorkflowFramework.Utility ? dictionary[nameof(workflowModel.NextPageUrl)]?.ToString() : null; + workflowModel.PageNumber = dictionary.ContainsKey(nameof(workflowModel.PageNumber)) + ? int.TryParse(dictionary[nameof(workflowModel.PageNumber)]?.ToString(), out var pageNumber) ? pageNumber : (int?)null + : null; + workflowModel.NextPageEventName = dictionary.ContainsKey(nameof(workflowModel.NextPageEventName)) ? dictionary[nameof(workflowModel.NextPageEventName)]?.ToString() : null;