示例#1
0
        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
            });
        }
        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
            });
        }
示例#3
0
        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
            });
        }