private static IWorkflowInstance MaterializeWorkflowInstance(WorkflowInstanceDto workflowInstanceDto) { var workflowInstanceLock = new WorkflowInstanceLock( workflowInstanceDto.Lock.LockOwner.ToIdGuid(), workflowInstanceDto.Lock.LockMode, workflowInstanceDto.Lock.LockedAt.ToUniversalTime(), workflowInstanceDto.Lock.LockedUntil.ToUniversalTime()); return(new WorkflowInstance( workflowInstanceDto.WorkflowId.ToIdGuid(), workflowInstanceDto.Id.ToIdGuid(), workflowInstanceDto.RootWorkflowInstanceId.ToIdGuid(), workflowInstanceDto.ParentWorkflowInstanceId.ToIdGuid(), workflowInstanceDto.EntityType, workflowInstanceDto.EntityId, workflowInstanceLock) { Created = workflowInstanceDto.Created.ToUniversalTime(), CurrentStateCode = workflowInstanceDto.CurrentStateCode, CurrentStateProgress = workflowInstanceDto.CurrentStateProgress, EntityId = workflowInstanceDto.EntityId, EntityType = workflowInstanceDto.EntityType, WorkflowId = workflowInstanceDto.WorkflowId.ToIdGuid() }); }
public async Task SaveWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken = default) { Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance)); var workflowInstanceIdString = workflowInstance.Id.ToIdString(); var mongoCollection = MongoDatabase.GetCollection <WorkflowInstanceDto>(Constants.WorkflowInstanceCollectionName); var workflowInstanceDto = mongoCollection.Find(x => x.Id == workflowInstanceIdString).FirstOrDefault(); if (null == workflowInstanceDto) { workflowInstanceDto = new WorkflowInstanceDto { Id = workflowInstance.Id.ToIdString(), Created = new BsonDateTime(workflowInstance.Created), CurrentStateCode = workflowInstance.CurrentStateCode, CurrentStateProgress = workflowInstance.CurrentStateProgress, EntityId = workflowInstance.EntityId, EntityType = workflowInstance.EntityType, ParentWorkflowInstanceId = workflowInstance.ParentWorkflowInstanceId.ToIdString(), RootWorkflowInstanceId = workflowInstance.RootWorkflowInstanceId.ToIdString(), WorkflowId = workflowInstance.WorkflowId.ToIdString(), Lock = new WorkflowInstanceLockDto { LockOwner = workflowInstance.Lock.LockOwner.ToIdString(), LockMode = workflowInstance.Lock.LockMode, LockedAt = workflowInstance.Lock.LockedAt, LockedUntil = workflowInstance.Lock.LockedUntil } }; await InsertAsync(mongoCollection, workflowInstanceDto, cancellationToken).ConfigureAwait(false); } else { // make sure not to update the whole entity to avoid conflicting updates on [Lock] sub-object var updateDefinition = Builders <WorkflowInstanceDto> .Update .Set(wi => wi.CurrentStateCode, workflowInstance.CurrentStateCode) .Set(wi => wi.CurrentStateProgress, workflowInstance.CurrentStateProgress) .Set(wi => wi.EntityId, workflowInstance.EntityId) .Set(wi => wi.EntityType, workflowInstance.EntityType) .Set(wi => wi.ParentWorkflowInstanceId, workflowInstance.ParentWorkflowInstanceId.ToIdString()) .Set(wi => wi.RootWorkflowInstanceId, workflowInstance.RootWorkflowInstanceId.ToIdString()) .Set(wi => wi.WorkflowId, workflowInstance.WorkflowId.ToIdString()); await mongoCollection.UpdateOneAsync(wi => wi.Id == workflowInstanceIdString, updateDefinition, null, cancellationToken).ConfigureAwait(false); } }