using Abp; using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.Linq; using Newtonsoft.Json; using System.Dynamic; using VberZero.Authorization; using VberZero.Session; using VberZero.Tools.StringModel; using VberZero.Workflow; using VberZero.Workflow.DesignInfo; using VberZero.Workflow.Persistence; using WorkflowCore.Models; namespace VberZero.Workflows; public class VbWorkflowPersistenceProvider : VberPersistenceProvider { public VbWorkflowPersistenceProvider(IRepository eventRepository, IRepository executionPointerRepository, IRepository workflowRepository, IRepository eventSubscriptionRepository, IGuidGenerator guidGenerator, IAsyncQueryableExecuter asyncQueryableExecuter, IRepository executionErrorRepository, IRepository workflowDefinitionRepository) : base(eventRepository, executionPointerRepository, workflowRepository, eventSubscriptionRepository, guidGenerator, asyncQueryableExecuter, executionErrorRepository, workflowDefinitionRepository) { } public new IVzSession AbpSession { get; set; } [UnitOfWork] public override async Task CreateNewWorkflow(WorkflowInstance workflow, CancellationToken cancellationToken = new()) { var entity = GenerateWorkflow(workflow); if (workflow.Reference.NotEmpty()) { var customId = GetWorkflowIdFromReference(workflow.Reference); if (customId.NotEmpty()) { entity.Id = customId; } } if (AbpSession.UserId.HasValue) { var name = AbpSession.GetClaimValue(VzClaimTypes.RealName); entity.CreateUserIdentityName = name; } await _workflowRepository.InsertAsync(entity); await CurrentUnitOfWork.SaveChangesAsync(); return workflow.Id; } protected virtual string GetWorkflowIdFromReference(string reference) { try { dynamic dyObj = JsonConvert.DeserializeObject(reference); return dyObj.WorkflowId.ToString(); } catch (Exception e) { Console.WriteLine(e); return null; } } }