コード例 #1
0
 public async Task <JsonResult> ChangeStateForEntry([Required] ObjectChangeStateViewModel model)
 {
     if (!ModelState.IsValid)
     {
         return(Json(new InvalidParametersResultModel().AttachModelState(ModelState)));
     }
     return(await JsonAsync(_workFlowExecutorService.ChangeStateForEntryAsync(model)));
 }
コード例 #2
0
        /// <summary>
        /// Change state for entry
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public virtual async Task <ResultModel> ChangeStateForEntryAsync([Required] ObjectChangeStateViewModel model)
        {
            if (model?.WorkFlowId == null || model.NewStateId == null || model.EntryId.IsNullOrEmpty())
            {
                return(new InvalidParametersResultModel());
            }
            var entryStateRequest = await GetEntryStateAsync(model.EntryId, model.WorkFlowId);

            if (!entryStateRequest.IsSuccess)
            {
                return(entryStateRequest.ToBase());
            }
            var entryState         = entryStateRequest.Result;
            var transactionRequest = await _workFlowCreatorService.GetTransitionAsync(entryState.StateId, model.NewStateId);

            if (!transactionRequest.IsSuccess)
            {
                return(transactionRequest.ToBase());
            }
            var transaction = transactionRequest.Result;
            var userRequest = await _userManager.GetCurrentUserAsync();

            if (!userRequest.IsSuccess)
            {
                return(new NotAuthorizedResultModel().ToBase());
            }
            var roles = await _userManager.GetUserRolesAsync(userRequest.Result);

            var allowPerformAction = roles.Select(x => x.Id)
                                     .ContainsAny(transaction.TransitionRoles
                                                  .Select(x => x.RoleId));

            if (!allowPerformAction)
            {
                return(new ActionBlockedResultModel <object>().ToBase());
            }
            var newState = model.NewStateId.GetValueOrDefault();

            entryState.Message = model.Message;
            await AddEntryChangesToHistoryAsync(entryState, newState);

            entryState.StateId = newState;
            _workFlowContext.EntryStates.Update(entryState);
            var dbRequest = await _workFlowContext.PushAsync();

            if (dbRequest.IsSuccess)
            {
                await ExecuteActionsAsync(entryState, transaction, model.EntryObjectConfiguration);
            }
            return(dbRequest);
        }