From 0bc95706fa3ae1a3f2e74986701e643c82e1e5b3 Mon Sep 17 00:00:00 2001 From: Behzad Alizadeh Date: Tue, 13 Jan 2026 11:11:12 +0330 Subject: [PATCH] Add fileds 'InstanceMode' & 'PageNumber' in workflow response --- .../Models/WorkflowModel.cs | 14 + .../Services/WorkflowService.cs | 13 +- .../Utility/ConversionExtensions.cs | 240 ++++++++---------- 3 files changed, 129 insertions(+), 138 deletions(-) diff --git a/src/apps/Caspian.WorkflowFramework/Models/WorkflowModel.cs b/src/apps/Caspian.WorkflowFramework/Models/WorkflowModel.cs index 53bd483..5d8b0a7 100644 --- a/src/apps/Caspian.WorkflowFramework/Models/WorkflowModel.cs +++ b/src/apps/Caspian.WorkflowFramework/Models/WorkflowModel.cs @@ -15,6 +15,14 @@ public class WorkflowModel /// public string? InstanceId { get; set; } + /// + /// نوع نمونه + /// + /// exist, new, ... + /// + /// + public string? InstanceMode { get; set; } = "exist"; + /// /// نام گردش کار /// @@ -25,6 +33,7 @@ public class WorkflowModel /// public bool IsComplete { get; set; } + /// /// برای کدام کاربر؟ /// @@ -48,6 +57,11 @@ public class WorkflowModel /// public string? NextPageUrl { get; set; } + /// + /// شماره صفحه + /// + public int? PageNumber { get; set; } + /// /// رویدادی که باید پس از سابمیت صفحه بعدی منتشر شود /// diff --git a/src/apps/Caspian.WorkflowFramework/Services/WorkflowService.cs b/src/apps/Caspian.WorkflowFramework/Services/WorkflowService.cs index fd34559..98ba8d5 100644 --- a/src/apps/Caspian.WorkflowFramework/Services/WorkflowService.cs +++ b/src/apps/Caspian.WorkflowFramework/Services/WorkflowService.cs @@ -102,6 +102,7 @@ public class WorkflowService : IWorkflowService, ILoggable var workflowModel = dictionary.ConvertToWorkflowModel(); workflowModel.InstanceId = workflowClient.WorkflowInstanceId; workflowModel.UserId = input.UserId; + workflowModel.InstanceMode = "exist"; response = new WorkflowResponse() { @@ -194,6 +195,7 @@ public class WorkflowService : IWorkflowService, ILoggable if (runningWorkflowInstance != null) { workflowInstanceId = runningWorkflowInstance.Id; + } else { @@ -220,6 +222,7 @@ public class WorkflowService : IWorkflowService, ILoggable var workflowModel = dictionary.ConvertToWorkflowModel(); workflowModel.InstanceId = workflowInstanceId; workflowModel.UserId = input.UserId; + workflowModel.InstanceId = runningWorkflowInstance != null ? "exist" : "new"; response = new WorkflowResponse() { @@ -309,6 +312,7 @@ public class WorkflowService : IWorkflowService, ILoggable var workflowModel = dictionary.ConvertToWorkflowModel(); workflowModel.InstanceId = instance.Id; workflowModel.UserId = instance.ExternalUserId; + workflowModel.InstanceMode = "exist"; response = new WorkflowResponse() { @@ -379,6 +383,7 @@ public class WorkflowService : IWorkflowService, ILoggable var workflowModel = dictionary.ConvertToWorkflowModel(); workflowModel.InstanceId = instance.Id; workflowModel.UserId = instance.ExternalUserId; + workflowModel.InstanceMode = "exist"; response = new WorkflowResponse() { @@ -436,6 +441,7 @@ public class WorkflowService : IWorkflowService, ILoggable var model = dict.ConvertToWorkflowModel(); model.InstanceId = instance.Id; model.UserId = instance.ExternalUserId; + model.InstanceMode = "exist"; result.Add(model); } @@ -466,7 +472,7 @@ public class WorkflowService : IWorkflowService, ILoggable } } #endregion - + #region GetActiveInstanceIdsAsync public async Task>> GetActiveInstanceIdsAsync(GetActiveInstancesModel input) { @@ -560,6 +566,7 @@ public class WorkflowService : IWorkflowService, ILoggable var model = dict.ConvertToWorkflowModel(); model.InstanceId = latest.Id; model.UserId = latest.ExternalUserId; + model.InstanceMode = "exist"; var response = new WorkflowResponse { @@ -587,7 +594,7 @@ public class WorkflowService : IWorkflowService, ILoggable } } #endregion - + #region GetLatestActiveInstanceIdAsync public async Task> GetLatestActiveInstanceIdAsync(GetLatestActiveInstanceModel input) { @@ -714,7 +721,7 @@ public class WorkflowService : IWorkflowService, ILoggable _logger.Log("Exception in CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex); return response; } - } + } #endregion //#region EvictDefFromCacheAsync diff --git a/src/apps/Caspian.WorkflowFramework/Utility/ConversionExtensions.cs b/src/apps/Caspian.WorkflowFramework/Utility/ConversionExtensions.cs index abad0ca..7a205f4 100644 --- a/src/apps/Caspian.WorkflowFramework/Utility/ConversionExtensions.cs +++ b/src/apps/Caspian.WorkflowFramework/Utility/ConversionExtensions.cs @@ -1,149 +1,119 @@ -using System; +using Caspian.WorkflowFramework.Models; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using System.Threading.Tasks; -using Caspian.WorkflowFramework.Models; -namespace Caspian.WorkflowFramework.Utility; -public static class ConversionExtensions +namespace Caspian.WorkflowFramework.Utility { - public static WorkflowModel ConvertToWorkflowModel(this Dictionary dictionary) + public static class ConversionExtensions { - var workflowModel = new WorkflowModel(); + public static WorkflowModel ConvertToWorkflowModel(this Dictionary dictionary) + { + var workflowModel = new WorkflowModel(); + + if (dictionary == null || dictionary.Count == 0) + return workflowModel; + + //Map dictionary values to WorkflowModel properties + workflowModel.InstanceId = dictionary.ContainsKey(nameof(workflowModel.InstanceId)) + ? 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; + + workflowModel.IsComplete = dictionary.ContainsKey(nameof(workflowModel.IsComplete)) + ? bool.TryParse(dictionary[nameof(workflowModel.IsComplete)]?.ToString(), out var isComplete) && isComplete + : false; + + workflowModel.UserId = dictionary.ContainsKey(nameof(workflowModel.UserId)) + ? long.TryParse(dictionary[nameof(workflowModel.UserId)]?.ToString(), out var userId) ? userId : (long?)null + : null; + + //CurrentPageData + if (dictionary.TryGetValue(nameof(workflowModel.CurrentPageData), out var currentPageDataObj) && + currentPageDataObj is not null) + { + switch (currentPageDataObj) + { + case JsonElement je: + workflowModel.CurrentPageData = je; + break; + + case JsonNode node: + // .NET 6+ + workflowModel.CurrentPageData = JsonSerializer.SerializeToElement(node); + break; + + case string s: + // اگر به صورت string JSON ذخیره شده + workflowModel.CurrentPageData = JsonSerializer.Deserialize(s); + break; + + default: + // هر نوع دیگری: serialize و تبدیل به JsonElement + workflowModel.CurrentPageData = JsonSerializer.SerializeToElement(currentPageDataObj); + break; + } + } + else + { + workflowModel.CurrentPageData = null; + } + + //NextPageData + if (dictionary.TryGetValue(nameof(workflowModel.NextPageData), out var nextPageDataObj) && + nextPageDataObj is not null) + { + switch (nextPageDataObj) + { + case JsonElement je: + workflowModel.NextPageData = je; + break; + + case JsonNode node: + // .NET 6+ + workflowModel.NextPageData = JsonSerializer.SerializeToElement(node); + break; + + case string s: + // اگر به صورت string JSON ذخیره شده + workflowModel.NextPageData = JsonSerializer.Deserialize(s); + break; + + default: + // هر نوع دیگری: serialize و تبدیل به JsonElement + workflowModel.NextPageData = JsonSerializer.SerializeToElement(nextPageDataObj); + break; + } + } + else + { + workflowModel.NextPageData = null; + } + + workflowModel.NextPageUrl = dictionary.ContainsKey(nameof(workflowModel.NextPageUrl)) + ? 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; - if (dictionary == null || dictionary.Count == 0) return workflowModel; - - //Map dictionary values to WorkflowModel properties - workflowModel.InstanceId = dictionary.ContainsKey(nameof(workflowModel.InstanceId)) - ? dictionary[nameof(workflowModel.InstanceId)]?.ToString() - : null; - - workflowModel.Name = dictionary.ContainsKey(nameof(workflowModel.Name)) - ? dictionary[nameof(workflowModel.Name)]?.ToString() - : null; - - workflowModel.IsComplete = dictionary.ContainsKey(nameof(workflowModel.IsComplete)) - ? bool.TryParse(dictionary[nameof(workflowModel.IsComplete)]?.ToString(), out var isComplete) && isComplete - : false; - - workflowModel.UserId = dictionary.ContainsKey(nameof(workflowModel.UserId)) - ? long.TryParse(dictionary[nameof(workflowModel.UserId)]?.ToString(), out var userId) ? userId : (long?)null - : null; - - if (dictionary.TryGetValue(nameof(workflowModel.CurrentPageData), out var currentPageDataObj) && - currentPageDataObj is not null) - { - switch (currentPageDataObj) - { - case JsonElement je: - workflowModel.CurrentPageData = je; - break; - - case JsonNode node: - // .NET 6+ - workflowModel.CurrentPageData = JsonSerializer.SerializeToElement(node); - break; - - case string s: - // اگر به صورت string JSON ذخیره شده - workflowModel.CurrentPageData = JsonSerializer.Deserialize(s); - break; - - default: - // هر نوع دیگری: serialize و تبدیل به JsonElement - workflowModel.CurrentPageData = JsonSerializer.SerializeToElement(currentPageDataObj); - break; - } } - else - { - workflowModel.CurrentPageData = null; - } - - //workflowModel.CurrentPageData = dictionary.ContainsKey(nameof(workflowModel.CurrentPageData)) - // ? dictionary[nameof(workflowModel.CurrentPageData)]?.ToString() - // : null; - - //workflowModel.NextPageData = dictionary.ContainsKey(nameof(workflowModel.NextPageData)) - // ? (object?)dictionary[nameof(workflowModel.NextPageData)] - // : null; - - //workflowModel.NextPageData = dictionary.ContainsKey(nameof(workflowModel.NextPageData)) - // ? dictionary[nameof(workflowModel.NextPageData)]?.ToString() - // : null; - - if (dictionary.TryGetValue(nameof(workflowModel.NextPageData), out var nextPageDataObj) && - nextPageDataObj is not null) - { - switch (nextPageDataObj) - { - case JsonElement je: - workflowModel.NextPageData = je; - break; - - case JsonNode node: - // .NET 6+ - workflowModel.NextPageData = JsonSerializer.SerializeToElement(node); - break; - - case string s: - // اگر به صورت string JSON ذخیره شده - workflowModel.NextPageData = JsonSerializer.Deserialize(s); - break; - - default: - // هر نوع دیگری: serialize و تبدیل به JsonElement - workflowModel.NextPageData = JsonSerializer.SerializeToElement(nextPageDataObj); - break; - } - } - else - { - workflowModel.NextPageData = null; - } - - workflowModel.NextPageUrl = dictionary.ContainsKey(nameof(workflowModel.NextPageUrl)) - ? dictionary[nameof(workflowModel.NextPageUrl)]?.ToString() - : null; - - workflowModel.NextPageEventName = dictionary.ContainsKey(nameof(workflowModel.NextPageEventName)) - ? dictionary[nameof(workflowModel.NextPageEventName)]?.ToString() - : null; - - if (dictionary.TryGetValue(nameof(workflowModel.WorkflowStash), out var workflowStashObj) && - workflowStashObj is not null) - { - switch (workflowStashObj) - { - case JsonElement je: - workflowModel.WorkflowStash = je; - break; - - case JsonNode node: - // .NET 6+ - workflowModel.WorkflowStash = JsonSerializer.SerializeToElement(node); - break; - - case string s: - // اگر به صورت string JSON ذخیره شده - workflowModel.WorkflowStash = JsonSerializer.Deserialize(s); - break; - - default: - // هر نوع دیگری: serialize و تبدیل به JsonElement - workflowModel.WorkflowStash = JsonSerializer.SerializeToElement(workflowStashObj); - break; - } - } - else - { - workflowModel.WorkflowStash = null; - } - - return workflowModel; } }