示例#1
0
        public override IActionResult OnInvoke(IActionRequest <IntegerPayload> request)
        {
            var payload     = request.Payload as IntegerPayload;
            var newPayload  = IntegerPayload.New(payload.Value + 1);
            var newState    = TestState.New(newPayload.Value > 0 ? "Positive" : newPayload.Value < 0 ? "Negative" : "Zero");
            var stateChange = new StateChangeResult(newPayload, newState, string.Empty);

            Injected.SavePayload(newPayload);

            return(stateChange);
        }
示例#2
0
        private Func <IDbTransaction, long, Task <StateChangeResult> > GetTransactionAction()
        {
            Func <IDbTransaction, long, Task <StateChangeResult> > action = async(transaction, transactionId) =>
            {
                var publishRevision = await CreateRevision(transaction);

                _input.RevisionId = publishRevision;

                var artifactInfo =
                    await _stateChangeExecutorRepositories.ArtifactVersionsRepository.GetVersionControlArtifactInfoAsync(_input.ArtifactId,
                                                                                                                         null,
                                                                                                                         _userId);

                await ValidateArtifact(artifactInfo);

                var currentState = await ValidateCurrentState();

                var triggers = await _stateChangeExecutorRepositories.WorkflowRepository.GetWorkflowEventTriggersForTransition(
                    _userId,
                    _input.ArtifactId,
                    currentState.WorkflowId,
                    _input.FromStateId,
                    _input.ToStateId,
                    _input.TransitionId);

                var constraints = new List <IConstraint>();


                await ProcessConstraints(constraints);

                var stateChangeResult = await ChangeStateForArtifactAsync(_input, transaction);

                var executionParameters =
                    await
                    _stateChangeExecutorHelper.BuildTriggerExecutionParameters(_userId, artifactInfo,
                                                                               triggers.SynchronousTriggers, transaction);

                var errors = await triggers.SynchronousTriggers.ProcessTriggers(executionParameters);

                var artifactResultSet = await PublishArtifacts(publishRevision, transaction);

                // Collecting all errors so that we can distinguish between errors at a later stage.
                if (errors.Count > 0)
                {
                    await
                    _stateChangeExecutorRepositories.ServiceLogRepository.LogInformation(LogSource,
                                                                                         $"State cannot be modified as the trigger cannot be executed. {string.Join(", ", errors.Values)}");

                    throw new ConflictException("State cannot be modified as the trigger cannot be executed", ErrorCodes.WorkflowInvalidPropertyChange);
                }

                var result = new StateChangeResult
                {
                    Result = stateChangeResult
                };

                // Generate asynchronous messages for sending
                result.ActionMessages.AddRange(await _workflowEventsMessagesHelper.GenerateMessages(
                                                   _userId,
                                                   publishRevision,
                                                   _input.UserName,
                                                   transactionId,
                                                   triggers.AsynchronousTriggers,
                                                   artifactInfo,
                                                   artifactResultSet?.Projects?.FirstOrDefault(d => d.Id == artifactInfo.ProjectId)?.Name,
                                                   artifactResultSet?.ModifiedProperties,
                                                   currentState,
                                                   stateChangeResult.Item,
                                                   true,
                                                   null,
                                                   null,
                                                   _stateChangeExecutorRepositories.UsersRepository,
                                                   _stateChangeExecutorRepositories.ServiceLogRepository,
                                                   _stateChangeExecutorRepositories.WebhooksRepository,
                                                   _stateChangeExecutorRepositories.ProjectMetaRepository,
                                                   _stateChangeExecutorRepositories.ArtifactVersionsRepository,
                                                   transaction));

                await _workflowEventsMessagesHelper.ProcessMessages(LogSource,
                                                                    _stateChangeExecutorRepositories.ApplicationSettingsRepository,
                                                                    _stateChangeExecutorRepositories.ServiceLogRepository,
                                                                    result.ActionMessages,
                                                                    $"Error on successful transition of artifact: {_input.ArtifactId} from {_input.FromStateId} to {_input.ToStateId}",
                                                                    transaction);

                return(result);
            };

            return(action);
        }