169 lines
6.8 KiB
C#
169 lines
6.8 KiB
C#
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;
|
|
|
|
namespace Caspian.WorkflowFramework.Utility
|
|
{
|
|
public static class ConversionExtensions
|
|
{
|
|
public static WorkflowModel ConvertToWorkflowModel(this Dictionary<string, object?> dictionary)
|
|
{
|
|
var workflowModel = new WorkflowModel();
|
|
|
|
if (dictionary == null || dictionary.Count == 0)
|
|
return workflowModel;
|
|
|
|
// قبل از تبدیل به مدل خروجی، sessionId حذف میشود.
|
|
dictionary.RemoveSessionId();
|
|
|
|
//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.Title = dictionary.ContainsKey(nameof(workflowModel.Title))
|
|
? dictionary[nameof(workflowModel.Title)]?.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<JsonElement>(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<JsonElement>(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.TotalPage = dictionary.ContainsKey(nameof(workflowModel.TotalPage))
|
|
? int.TryParse(dictionary[nameof(workflowModel.TotalPage)]?.ToString(), out var totalPage) ? totalPage : (int?)null
|
|
: null;
|
|
|
|
workflowModel.NextPageEventName = dictionary.ContainsKey(nameof(workflowModel.NextPageEventName))
|
|
? dictionary[nameof(workflowModel.NextPageEventName)]?.ToString()
|
|
: null;
|
|
|
|
//WorkflowStash
|
|
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<JsonElement>(s);
|
|
break;
|
|
|
|
default:
|
|
// هر نوع دیگری: serialize و تبدیل به JsonElement
|
|
workflowModel.WorkflowStash = JsonSerializer.SerializeToElement(workflowStashObj);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
workflowModel.WorkflowStash = null;
|
|
}
|
|
|
|
workflowModel.WorkflowPhase =
|
|
dictionary.TryGetValue(nameof(workflowModel.WorkflowPhase), out var phaseObj) &&
|
|
phaseObj != null &&
|
|
Enum.TryParse(typeof(WorkflowPhase), phaseObj.ToString(), out var phase)
|
|
? (WorkflowPhase)phase
|
|
: WorkflowPhase.Client;
|
|
|
|
return workflowModel;
|
|
}
|
|
}
|
|
}
|