ExtensionMethods.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using WorkflowCore.Models;
  6. namespace VberZero.Workflow.Persistence
  7. {
  8. internal static class ExtensionMethods
  9. {
  10. private static readonly JsonSerializerSettings SerializerSettings = new() { TypeNameHandling = TypeNameHandling.All };
  11. internal static WorkflowInfo ToPersistEntity(this WorkflowInstance instance, WorkflowInfo entity = null)
  12. {
  13. entity ??= new WorkflowInfo();
  14. entity.Id = instance.Id;
  15. entity.Data = JsonConvert.SerializeObject(instance.Data, SerializerSettings);
  16. entity.Description = instance.Description;
  17. entity.Reference = instance.Reference;
  18. entity.NextExecution = instance.NextExecution;
  19. entity.Version = instance.Version;
  20. entity.WorkflowDefinitionId = instance.WorkflowDefinitionId;
  21. entity.Status = instance.Status;
  22. entity.CreateTime = instance.CreateTime;
  23. entity.CompleteTime = instance.CompleteTime;
  24. foreach (var ep in instance.ExecutionPointers)
  25. {
  26. var persistedEP = entity.ExecutionPointers.FindById(ep.Id);
  27. if (persistedEP == null)
  28. {
  29. persistedEP = new WorkflowExecutionPointerInfo
  30. {
  31. Id = ep.Id.Replace("-", "")
  32. };
  33. entity.ExecutionPointers.Add(persistedEP);
  34. }
  35. persistedEP.StepId = ep.StepId;
  36. persistedEP.Active = ep.Active;
  37. persistedEP.SleepUntil = ep.SleepUntil;
  38. persistedEP.PersistenceData = JsonConvert.SerializeObject(ep.PersistenceData, SerializerSettings);
  39. persistedEP.StartTime = ep.StartTime;
  40. persistedEP.EndTime = ep.EndTime;
  41. persistedEP.StepName = ep.StepName;
  42. persistedEP.RetryCount = ep.RetryCount;
  43. persistedEP.PredecessorId = ep.PredecessorId;
  44. persistedEP.ContextItem = JsonConvert.SerializeObject(ep.ContextItem, SerializerSettings);
  45. persistedEP.Children = string.Empty;
  46. foreach (var child in ep.Children)
  47. persistedEP.Children += child + ";";
  48. persistedEP.EventName = ep.EventName;
  49. persistedEP.EventKey = ep.EventKey?.Replace("-", "");
  50. persistedEP.EventPublished = ep.EventPublished;
  51. persistedEP.EventData = JsonConvert.SerializeObject(ep.EventData, SerializerSettings);
  52. persistedEP.Outcome = JsonConvert.SerializeObject(ep.Outcome, SerializerSettings);
  53. persistedEP.Status = ep.Status;
  54. persistedEP.Scope = string.Empty;
  55. foreach (var item in ep.Scope)
  56. persistedEP.Scope += item + ";";
  57. foreach (var attr in ep.ExtensionAttributes)
  58. {
  59. var persistedAttr = persistedEP.ExtensionAttributes.FirstOrDefault(x => x.AttributeKey == attr.Key);
  60. if (persistedAttr == null)
  61. {
  62. persistedAttr = new WorkflowExtensionAttributeInfo();
  63. persistedEP.ExtensionAttributes.Add(persistedAttr);
  64. }
  65. persistedAttr.AttributeKey = attr.Key.Replace("-", "");
  66. persistedAttr.AttributeValue = JsonConvert.SerializeObject(attr.Value, SerializerSettings);
  67. }
  68. }
  69. return entity;
  70. }
  71. internal static WorkflowExecutionErrorInfo ToPersistEntity(this ExecutionError instance)
  72. {
  73. var entity = new WorkflowExecutionErrorInfo
  74. {
  75. Id = $"{DateTime.Now:yyyyMMddHHmmssfff}",
  76. ErrorTime = instance.ErrorTime,
  77. Message = instance.Message,
  78. ExecutionPointerId = instance.ExecutionPointerId,
  79. WorkflowId = instance.WorkflowId
  80. };
  81. return entity;
  82. }
  83. internal static WorkflowSubscriptionInfo ToPersistEntity(this EventSubscription instance)
  84. {
  85. WorkflowSubscriptionInfo entity = new WorkflowSubscriptionInfo
  86. {
  87. Id = instance.Id?.Replace("-", "") ?? Guid.NewGuid().ToString("N"),
  88. EventKey = instance.EventKey?.Replace("-", ""),
  89. EventName = instance.EventName,
  90. StepId = instance.StepId,
  91. ExecutionPointerId = instance.ExecutionPointerId,
  92. WorkflowId = instance.WorkflowId,
  93. SubscribeAsOf = DateTime.SpecifyKind(instance.SubscribeAsOf, DateTimeKind.Utc),
  94. SubscriptionData = JsonConvert.SerializeObject(instance.SubscriptionData, SerializerSettings),
  95. ExternalToken = instance.ExternalToken,
  96. ExternalTokenExpiry = instance.ExternalTokenExpiry,
  97. ExternalWorkerId = instance.ExternalWorkerId
  98. };
  99. return entity;
  100. }
  101. internal static WorkflowEventInfo ToPersistEntity(this Event instance)
  102. {
  103. WorkflowEventInfo entity = new WorkflowEventInfo
  104. {
  105. Id = instance.Id.Replace("-", ""),
  106. EventKey = instance.EventKey.Replace("-", ""),
  107. EventName = instance.EventName,
  108. EventTime = DateTime.SpecifyKind(instance.EventTime, DateTimeKind.Utc),
  109. IsProcessed = instance.IsProcessed,
  110. EventData = JsonConvert.SerializeObject(instance.EventData, SerializerSettings)
  111. };
  112. return entity;
  113. }
  114. internal static WorkflowInstance ToWorkflowInstance(this WorkflowInfo entity)
  115. {
  116. WorkflowInstance instance = new WorkflowInstance
  117. {
  118. Data = JsonConvert.DeserializeObject(entity.Data, SerializerSettings),
  119. Description = entity.Description,
  120. Reference = entity.Reference,
  121. Id = entity.Id,
  122. NextExecution = entity.NextExecution,
  123. Version = entity.Version,
  124. WorkflowDefinitionId = entity.WorkflowDefinitionId,
  125. Status = entity.Status,
  126. CreateTime = DateTime.SpecifyKind(entity.CreateTime, DateTimeKind.Utc)
  127. };
  128. if (entity.CompleteTime.HasValue)
  129. instance.CompleteTime = DateTime.SpecifyKind(entity.CompleteTime.Value, DateTimeKind.Utc);
  130. instance.ExecutionPointers = new WorkflowCore.Models.ExecutionPointerCollection(entity.ExecutionPointers.Count + 8);
  131. foreach (var ep in entity.ExecutionPointers)
  132. {
  133. var pointer = new ExecutionPointer
  134. {
  135. Id = ep.Id,
  136. StepId = ep.StepId,
  137. Active = ep.Active
  138. };
  139. if (ep.SleepUntil.HasValue)
  140. pointer.SleepUntil = DateTime.SpecifyKind(ep.SleepUntil.Value, DateTimeKind.Utc);
  141. pointer.PersistenceData = JsonConvert.DeserializeObject(ep.PersistenceData ?? string.Empty, SerializerSettings);
  142. if (ep.StartTime.HasValue)
  143. pointer.StartTime = DateTime.SpecifyKind(ep.StartTime.Value, DateTimeKind.Utc);
  144. if (ep.EndTime.HasValue)
  145. pointer.EndTime = DateTime.SpecifyKind(ep.EndTime.Value, DateTimeKind.Utc);
  146. pointer.StepName = ep.StepName;
  147. pointer.RetryCount = ep.RetryCount;
  148. pointer.PredecessorId = ep.PredecessorId;
  149. pointer.ContextItem = JsonConvert.DeserializeObject(ep.ContextItem ?? string.Empty, SerializerSettings);
  150. if (!string.IsNullOrEmpty(ep.Children))
  151. pointer.Children = ep.Children.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList();
  152. pointer.EventName = ep.EventName;
  153. pointer.EventKey = ep.EventKey;
  154. pointer.EventPublished = ep.EventPublished;
  155. pointer.EventData = JsonConvert.DeserializeObject(ep.EventData ?? string.Empty, SerializerSettings);
  156. pointer.Outcome = JsonConvert.DeserializeObject(ep.Outcome ?? string.Empty, SerializerSettings);
  157. pointer.Status = ep.Status;
  158. if (!string.IsNullOrEmpty(ep.Scope))
  159. pointer.Scope = new List<string>(ep.Scope.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
  160. foreach (var attr in ep.ExtensionAttributes)
  161. {
  162. pointer.ExtensionAttributes[attr.AttributeKey] = JsonConvert.DeserializeObject(attr.AttributeValue, SerializerSettings);
  163. }
  164. instance.ExecutionPointers.Add(pointer);
  165. }
  166. return instance;
  167. }
  168. internal static EventSubscription ToEventSubscription(this WorkflowSubscriptionInfo entity)
  169. {
  170. EventSubscription instance = new EventSubscription
  171. {
  172. Id = entity.Id,
  173. EventKey = entity.EventKey,
  174. EventName = entity.EventName,
  175. StepId = entity.StepId,
  176. ExecutionPointerId = entity.ExecutionPointerId,
  177. WorkflowId = entity.WorkflowId,
  178. SubscribeAsOf = DateTime.SpecifyKind(entity.SubscribeAsOf, DateTimeKind.Utc),
  179. SubscriptionData = JsonConvert.DeserializeObject(entity.SubscriptionData, SerializerSettings),
  180. ExternalToken = entity.ExternalToken,
  181. ExternalTokenExpiry = entity.ExternalTokenExpiry,
  182. ExternalWorkerId = entity.ExternalWorkerId
  183. };
  184. return instance;
  185. }
  186. internal static Event ToEvent(this WorkflowEventInfo entity)
  187. {
  188. Event instance = new Event
  189. {
  190. Id = entity.Id,
  191. EventKey = entity.EventKey,
  192. EventName = entity.EventName,
  193. EventTime = DateTime.SpecifyKind(entity.EventTime, DateTimeKind.Utc),
  194. IsProcessed = entity.IsProcessed,
  195. EventData = JsonConvert.DeserializeObject(entity.EventData, SerializerSettings)
  196. };
  197. return instance;
  198. }
  199. }
  200. }