public async Task <IActionResult> MakeMove(string gameId, string playerId, [FromBody] MakeMoveResource resource) { resource.GameId = gameId; resource.PlayerId = playerId; if (!ModelState.IsValid) { return(BadRequest(ModelState.GetErrorMessages())); } var result = await _service.MakeMove(resource); if (!result.Success) { if (result.Status == ResponseStatus.NOT_PLAYERS_TURN) { return(new StatusCodeResult(409)); } if (result.Status == ResponseStatus.NOT_FOUND) { return(NotFound()); } return(BadRequest(result.Message)); } return(Ok(resource)); }
public async Task <MakeMoveResponse> MakeMove(MakeMoveResource resource) { var move = _mapper.Map <MakeMoveResource, Move>(resource); var game = await _repository.FindGameById(move.GameId); if (game == null || (game != null && !game.GamePlayers.Any(gp => gp.PlayerId == resource.PlayerId))) { return(new MakeMoveResponse(ResponseStatus.NOT_FOUND)); } if (game.State == GameState.DONE) { return(new MakeMoveResponse(ResponseStatus.BAD_REQUEST)); } // Validate Move & Turn if (!IsTurn(move.PlayerId, game)) { return(new MakeMoveResponse(ResponseStatus.NOT_PLAYERS_TURN)); } var board = HydrateBoard(game); if (!IsValidMove(move.Column, board)) { return(new MakeMoveResponse(ResponseStatus.BAD_REQUEST)); } try{ await _repository.MakeMove(move); // Refactor -- rehydrate board to grab new move board = HydrateBoard(game); if (BoardContainsWin(board)) { game.WinnerId = move.PlayerId; game.State = GameState.DONE; _repository.UpdateGame(game); } else if (BoardContainsDraw(board)) { game.State = GameState.DONE; _repository.UpdateGame(game); } await _repository.CompleteAsync(); return(new MakeMoveResponse(resource)); } catch (Exception ex) { // Add logging... return(new MakeMoveResponse($"An error occurred when making the move: {ex.Message}")); } }