public async Task ProcessActionTask(IEngineTask task) { var unlockTask = task as UnlockTask; var processItem = await _processItemEventStore.GetProcessItemAsync(unlockTask.ProcessItemId); _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem); _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem); if (String.IsNullOrWhiteSpace(processItem.Lock?.LockedToPrincipalId) || processItem.Lock?.LockExpirationUtc < DateTime.UtcNow) { // the current user doesn't have a valid lock. There's no reason to apply any mutation. return; } processItem.ApplyMutation(new UnlockProcessItemMutation() { }); _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem, (processItemMutationId, mutationDateTimeUtc) => { processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc); }); _eventQueue.PublishEvent(new EventNotification() { ProcessItemId = unlockTask.ProcessItemId, NotificationKind = EventNotificationKinds.ProcessItemUnlock }); }
private async Task InvokeAction(IEngineTask task) { try { var taskHandler = _taskHandlerFactory(task.GetType().Name); await taskHandler.ProcessActionTask(task); } catch (Exception e) { // global exception handler for tasks _loggingAdapter.WriteEntry(new LogEntry(LoggingEventType.Error, "We threw an exception! {exception}", new Dictionary <string, object>() { { "exception", e }, })); _eventQueue.PublishEvent(new EventNotification() { ProcessId = (task as IProcessEngineTask)?.ProcessId, ProcessItemId = (task as IProcessItemEngineTask)?.ProcessItemId, ActionId = (task as IActionTask)?.ActionId, PrincipalId = task.PrincipalId, NotificationKind = EventNotificationKinds.Exception, Exception = e }); } }
public async Task ProcessActionTask(IEngineTask task) { var lockTask = task as LockTask; var processItem = await _processItemEventStore.GetProcessItemAsync(lockTask.ProcessItemId); _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem); _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem); processItem.ApplyMutation(new LockProcessItemMutation() { LockDuration = TimeSpan.FromMinutes(5), PrincipalId = task.PrincipalId }); _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem, (processItemMutationId, mutationDateTimeUtc) => { processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc); }); _eventQueue.PublishEvent(new EventNotification() { ProcessItemId = lockTask.ProcessItemId, NotificationKind = EventNotificationKinds.ProcessItemLock }); }
public async Task ProcessActionTask(IEngineTask task) { var actionTask = task as ActionTask; var process = await _processStore.GetProcessAsync(actionTask.ProcessId); var processItem = await _processItemEventStore.GetProcessItemAsync(actionTask.ProcessItemId); if (processItem == null) { var action = process.StartActions[actionTask.ActionId]; if (action == null) { throw new Exception("Start action not found, and process item is null."); } processItem = new ProcessItem(); processItem.ApplyMutation(new CreationActionProcessItemMutation() { ProcessItemId = actionTask.ProcessItemId, ActionId = actionTask.ActionId, TargetStepId = action.ArrivalStep, PropertyChanges = actionTask.PropertyChanges }); _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem, (processItemMutationId, mutationDateTimeUtc) => { processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc); }); } else { _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem); _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem); if (process.Steps.TryGetValue(processItem.CurrentStepId, out var step)) { if (step.Actions.TryGetValue(actionTask.ActionId, out var action)) { processItem.ApplyMutation(new ActionProcessItemMutation() { ActionId = actionTask.ActionId, TargetStepId = action.ArrivalStep, PropertyChanges = actionTask.PropertyChanges }); _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem, (processItemMutationId, mutationDateTimeUtc) => { processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc); }); } else { throw new ActionNotFoundException(actionTask.ProcessItemId, actionTask.ProcessId, actionTask.PrincipalId, processItem.CurrentStepId, actionTask.ActionId); } } else { throw new Exception("Step not found."); } } _eventQueue.PublishEvent(new EventNotification() { ProcessId = actionTask.ProcessId, ProcessItemId = actionTask.ProcessItemId, ActionId = actionTask.ActionId, NotificationKind = EventNotificationKinds.Action }); }