public async Task <ActionResult> DoAction( [FromRoute] string sessionId, [FromBody] ActionRequest actionRequest ) { UserModel userModel = await userManager.GetUserAsync(HttpContext.User); if (userModel?.UserId == null) { return(Status403Forbidden()); } if (sessionId == null) { return(NotFound()); } Task <Session?> sessionTask = sessionService.Get(sessionId); Session?session = await sessionTask; if (session == null) { return(Status404NotFound("Session")); } if (!session.HasPlayer(userModel.UserId)) { return(Status403Forbidden()); } string?failureMessage = null; try { AActionParams actionParams = await actionFactory.MakeActionParams(sessionId, actionRequest, userModel); if (ActionFactory.Create(actionParams, out AAction action)) { if (action != null && action.Execute(out failureMessage)) { await actionFactory.Commit(action); return(Ok()); } } else { failureMessage = "Request missing required parameter."; } } catch (Exception e) { failureMessage = e.Message; } return(failureMessage == null ? Status500UnknownError() : Status400Invalid(failureMessage)); }