Ejemplo n.º 1
0
        public async Task CommitGuess(string guessingTeam, GuessRequestBody requestBody, GuessResponseBody responseBody)
        {
            long pointsScored = 0;

            foreach (var guess in responseBody.Guesses)
            {
                pointsScored += guess.Score;
            }

            var guessId = Guid.NewGuid();

            await _context.Guesses.AddAsync(new Guess
            {
                GameId        = _gameContext.GameId,
                RoundId       = _gameContext.RoundId,
                GuessId       = guessId,
                TeamId        = guessingTeam,
                GuessRequest  = requestBody,
                GuessResponse = responseBody,
                TimeStamp     = DateTime.UtcNow
            });

            await _context.Scores.AddAsync(new Score
            {
                GameId       = _gameContext.GameId,
                RoundId      = _gameContext.RoundId,
                PointsScored = pointsScored,
                GuessId      = guessId,
                TeamId       = guessingTeam,
                TimeStamp    = DateTime.UtcNow
            });

            await _context.SaveChangesAsync();
        }
Ejemplo n.º 2
0
        private GuessResponseBody Validate(GuessRequestBody body, string guessingTeam)
        {
            var guesses = body.Guesses;

            if (body.Guesses != null && body.Guesses.Count() > MAX_GUESSES)
            {
                throw new GuessLimitExceededException();
            }

            var guessResponseBody = new GuessResponseBody {
                Guesses = new List <SingleGuessResponseObject>()
            };

            foreach (var guess in guesses)
            {
                var targetTeam          = guess.Team;
                var secretGuess         = guess.Guess;
                var guessResponseObject = new SingleGuessResponseObject();

                if (string.IsNullOrWhiteSpace(targetTeam) || !IsTeamRegexValid(targetTeam))
                {
                    guessResponseObject.ErrMessage = "Invalid team";
                }
                else if (string.IsNullOrWhiteSpace(secretGuess) || !IsGuessRegexValid(secretGuess))
                {
                    guessResponseObject.ErrMessage = "Invalid guess";
                }
                else if (targetTeam == guessingTeam)
                {
                    guessResponseObject.ErrMessage = "Can't guess for yourself";
                }

                if (string.IsNullOrEmpty(guessResponseObject.ErrMessage))
                {
                    guessResponseObject.IsValid = true;
                }

                guessResponseObject.TargetTeam = targetTeam;
                guessResponseObject.Guess      = secretGuess;

                guessResponseBody.Guesses.Add(guessResponseObject);
            }

            return(guessResponseBody);
        }
Ejemplo n.º 3
0
        private GuessRequestBody PreProcess(GuessRequestBody requestBody)
        {
            if (requestBody == null || requestBody.Guesses == null)
            {
                throw new InvalidDataProvidedException($"Found Invalid Data in GuessRequestBody {requestContext.RequestId}");
            }

            var newModel = new GuessRequestBody();

            newModel.Guesses = new List <SingleGuessRequestObject>();

            foreach (var guess in requestBody.Guesses)
            {
                newModel.Guesses.Add(new SingleGuessRequestObject
                {
                    Team  = guess.Team.ToLowerInvariant(),
                    Guess = guess.Guess.ToLowerInvariant()
                });
            }

            return(newModel);
        }
Ejemplo n.º 4
0
        public async Task <JsonResult> Post([FromBody] GuessRequestBody requestBody)
        {
            JsonResult response;

            try
            {
                GuessResponse guessResponse = new GuessResponse()
                {
                    RequestId = requestContext.RequestId
                };

                if (!gameContext.CurrentPhase.Equals(PhaseType.Running))
                {
                    throw new GameNotInRunningPhaseException();
                }

                if (gameContext.Participants.Where(p => p.TeamId == User.Identity.Name && p.IsAlive != null && p.IsAlive == true).FirstOrDefault() == null)
                {
                    throw new TeamNotJoinedException();
                }

                var guesses = requestBody.Guesses;

                var body = PreProcess(requestBody);

                var validatedBody = Validate(body, User.Identity.Name);

                await Evaluate(validatedBody);

                await CommitGuess(validatedBody, requestBody);

                guessResponse.Data = new GuessResponseData {
                    Guesses     = validatedBody.Guesses,
                    GameId      = gameContext.GameId,
                    RoundId     = gameContext.RoundId,
                    RoundNumber = gameContext.RoundNumber,
                    Status      = gameContext.CurrentPhase.ToString()
                };

                response = new JsonResult(guessResponse)
                {
                    StatusCode = 200
                };
            }
            catch (GuessLimitExceededException)
            {
                response = new JsonResult(new GuessResponse
                {
                    RequestId = requestContext.RequestId,
                    Err       = new Error
                    {
                        Message     = "Guess Limit Exceeded",
                        Description = $"At max {MAX_GUESSES} guesses are allowd at a time"
                    }
                })
                {
                    StatusCode = 400
                };
            }
            catch (GameNotInRunningPhaseException)
            {
                response = new JsonResult(new GuessResponse
                {
                    RequestId = requestContext.RequestId,
                    Err       = new Error
                    {
                        Message     = "Game is not in running phase",
                        Description = "/guess api requests are only accepted in Running phase"
                    }
                })
                {
                    StatusCode = 400
                };
            }
            catch (TeamNotJoinedException)
            {
                response = new JsonResult(new GuessResponse
                {
                    RequestId = requestContext.RequestId,
                    Err       = new Error
                    {
                        Message     = "Team not alive or joined",
                        Description = "Either you have not joined this round or your team is dead."
                    }
                })
                {
                    StatusCode = 400
                };
            }
            catch (InvalidDataProvidedException)
            {
                response = new JsonResult(new GuessResponse
                {
                    RequestId = requestContext.RequestId,
                    Err       = new Error
                    {
                        Message     = "Invalid Request Body",
                        Description = "Please provide a proper body for the api"
                    }
                })
                {
                    StatusCode = 400
                };
            }
            catch (Exception)
            {
                logger.LogError($"Error Occurred while fetching current gamestatus");

                response = new JsonResult(new GuessResponse
                {
                    RequestId = requestContext.RequestId,
                    Err       = new Error
                    {
                        Message     = "Internal Server Error",
                        Description = "Server Failed to fetch Current Gamestatus"
                    }
                })
                {
                    StatusCode = 500
                };
            }


            return(response);
        }
Ejemplo n.º 5
0
 private async Task CommitGuess(GuessResponseBody validatedBody, GuessRequestBody requestBody)
 {
     await gameApiService.CommitGuess(User.Identity.Name, requestBody, validatedBody);
 }