public async Task <JsonResult> ChangeStateForEntry([Required] ObjectChangeStateViewModel model) { if (!ModelState.IsValid) { return(Json(new InvalidParametersResultModel().AttachModelState(ModelState))); } return(await JsonAsync(_workFlowExecutorService.ChangeStateForEntryAsync(model))); }
/// <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); }