Beispiel #1
0
        public async Task <SelectAnswerResult> Handle(SelectAnswer request, CancellationToken cancellationToken)
        {
            using (var transaction = repositoryTransactionsFactory.CreateTransaction())
            {
                var validationResult = await requestValidator.Validate(request);

                if (!validationResult.IsSuccessful)
                {
                    return(new SelectAnswerResult(validationResult.Error));
                }

                var answerSelected = await playerAnswersRepository.MarkAnswerAsSelected(request.PlayerAnswerId);

                if (!answerSelected)
                {
                    return(new SelectAnswerResult(GameErrors.SelectAnswerFailed));
                }

                var pointsAddedResult = await playerAnswersRepository.AddPointForAnswer(request.PlayerAnswerId, request.GameRoundId);

                if (!pointsAddedResult.IsSuccessful)
                {
                    return(new SelectAnswerResult(GameErrors.CouldNotAddPointToPlayer));
                }

                var updateWinnerResult = await gameRoundsRepository.SelectRoundWinner(request.GameRoundId, pointsAddedResult.PlayerPoints.PlayerId);

                if (!updateWinnerResult)
                {
                    return(new SelectAnswerResult(GameErrors.RoundWinnerSelectionFailed));
                }

                var game = await gamesRepository.GetGameById(request.GameId);

                if (pointsAddedResult.PlayerPoints.Points < game.PointsLimit)
                {
                    var createNewRoundResult = await gameRoundCreator
                                               .CreateRound(request.GameId, request.GameRoundId);

                    if (!createNewRoundResult.IsSuccessful)
                    {
                        return(new SelectAnswerResult(createNewRoundResult.Error));
                    }

                    var createCardsResult = await playerCardsCreator.CreateCards(request.GameId);

                    if (!createCardsResult.IsSuccessful)
                    {
                        return(new SelectAnswerResult(createCardsResult.Error));
                    }
                }
                else
                {
                    var endGameResult = await gamesRepository
                                        .EndGame(request.GameId, pointsAddedResult.PlayerPoints.UserId);

                    if (!endGameResult)
                    {
                        return(new SelectAnswerResult(GameErrors.GameCouldNotBeEnded));
                    }
                }

                var checkpoint = await gameCheckpointUpdater.Update(request.GameId, nameof(SelectAnswer));

                transaction.CommitTransaction();

                return(new SelectAnswerResult());
            }
        }