Este é código do desafio para professor da let's code
Crie uma API REST para uma aplicação ao estilo card game, onde serão informados dois filmes e o jogador deve acertar aquele que possui melhor avaliação no IMDB.
- O jogador deve fazer login para iniciar uma nova partida. Portanto, cada partida sempre será identificada pela autenticação do usuário. a. Não há restrições onde armazenar os usuários: em memória, ou em banco, etc.
- Para o primeiro requisito eu decidir utilizar o banco H2 e o spring security para autenticar os usuários.
- Cada rodada do jogo consiste em informar um par de filmes, observando para não repetir o mesmo par nem formar um par com um único filme. a. São sequências não-válidas: [A-A] o mesmo filme repetido; [A-B, A-B] pares repetidos – considere iguais os pares do tipo A-B e B-A. b. Os seguintes pares são válidos: [A-B, B-C] o filme B é usado em pares diferentes.
- Para o segundo requisito, adicionei na entidade Game uma lista com um hash dos ultimos jogos, sendo assim sempre que for gerada uma nova combinação de filmes para aquele Game e ela já existir uma nova combinação será gerada.
-
O jogador deve tentar acertar qual filme possui maior pontuação, composta pela nota (0.0-10.0) multiplicado pelo total de votos.
-
Se escolher o vencedor correto, conta 1 ponto. São permitidos até três erros. Após responder, terá acesso a novo par de filmes quando acessar o endpoint do quiz.
-
Forneça endpoints específicos para iniciar e encerrar a partida a qualquer momento. Valide o momento em que cada funcionalidade pode ser acionada.
-
Não deve ser possível avançar para o próximo par sem responder o atual.
-
Deve existir uma funcionalidade de ranking, exibindo os melhores jogadores e suas pontuações.
- Para o terceiro requisito foi adicionado o endpoint de ranking que recebe como paramentro um tamanho. Ex: Se receber o valor 10, irá retornar o top 10.
- A pontuação é obtida multiplicando a quantidade de quizzes respondidos pela porcentagem de acerto.
- Armazene os dados em H2 e preencha todas as tabelas necessárias.
- Inicie os dados de sua aplicação usando webscraping ou a partir da API pública “http://www.omdbapi.com/” – levamos a sério que os dados sejam fidedignos.
- Explore os frameworks Spring: Web, Boot, Data, Security e Cloud.
- Linguagem: Java 11 ou 17
- Escreva testes unitários (para validar as regras de negócio) e de integração (para validar a API). Cobertura de testes mínima: 80% dos métodos.
- Não deixe de adicionar a documentação da API com base no OpenAPI 3.0.
- Escolha a solução de autenticação que achar mais interessante. Crie pelo menos dois usuários/jogadores.
- Para poder jogar é necessário realizar o login. Para testes existem dois usuários.
- login01: [email protected] - senha01: ana | login02: [email protected] - senha02: pedro
- Para iniciar um novo jogo é necessário chamar o endpoint start e o game será associado ao id do usuário.
- Ao iniciar o game você receberá o primeiro par de filmes
## Request
- Endpoint:
{uri}/api/start
## Exemplo de response
{
"questionId": "349",
"gameId": "3",
"movie01": {
"id": "4",
"imdbId": "tt3397884",
"title": "Sicario"
},
"movie02": {
"id": "9",
"imdbId": "tt10986410",
"title": "Ted Lasso"
}
}
- Com essa response iremos montar o body do nosso palpite (guess), onde devemos inserir o Id do Game, os Ids dos dois filmes e um palpite com o Id do filme escolhido. A cada palpite será retornado uma nova questão. Caso o jogador erre 3 vezes o jogo passará a ser inválido.
## Request
- Endpoint:
{uri}/api/guess
- Body:
{
"gameId": "3",
"movie01": "10",
"movie02": "8",
"guess": "1"
}
## Exemplo de response se o jogo ainda for válido (não houver 3 erross)
{
"lastGuessResult": "You was right!",
"points": 1,
"lastQuestion": {
"questionId": "4310",
"gameId": "4",
"movie01": {
"id": "3",
"imdbId": "tt3076658",
"title": "Creed"
},
"movie02": {
"id": "10",
"imdbId": "tt11126994",
"title": "Arcane"
}
},
"gameId": "4"
}
## Exemplo de response após o 3 erro
{
"points": 1,
"gameStatus": "Game Over!",
"lastQuestionId": "495",
"gameId": "4"
}
- A qualquer momento o usuário pode chamar o endpoint stop para invalidar/encerrar o jogo.