Criar uma API de jogo de Bingo usando as seguintes tecnologias:
- Gerenciar as informações dos jogadores (CRUD) com um find on demand;
- Gerar as cartelas de uma rodada com os números aleatórios, regras:
- Todas as cartelas geradas devem ter quantidades iguais de números;
- A cartela deve ter 20 números;
- Uma cartela pode ter no máximo 1/4 dos mesmos números de uma outra cartela;
- as cartelas da rodada só podem ser geradas antes de começar o sorteio dos números;
- Possibilidade de vincular uma cartela ao jogador ( 1 jogador só pode ser vinculado á uma cartela por rodada);
- Guardar um histórico das rodadas com os números sorteados, regras:
- Cada rodada pode sortear números de 0 até 99;
- Guardar os números sorteados;
- Guardar as cartelas que pertencem a ela;
- Guardar os jogadores que participaram;
- Endpoint para sortear o próximo número da rodada (um número não pode ser sorteado 2x na mesma rodada);
- Endpoint para buscar o último número sorteado;
- Cada vez que um número é sorteado deve-se verificar se alguma cartela já completou todos os números, caso tenha completado a rodada deve ser encerrada (bloquear geração de novos números) e um e-mail deve ser enviado ao vencedor da partida e os outros jogadores devem receber um e-mail mostrando como eles se sairam;
- Endpoint para buscar todas as rodadas (find all) o find on demand fica como opcional;
- Endpoint para buscar informações de uma partida pelo identificador
- Dockerizar a aplicação (opcional);
- Montar documentação dos endpoints (opcional);
- Os testes devem contemplar controller, services e repositórios que não são interfaces
Sugestão de endpoints:
- Jogadores:
- save (POST /players)
- update (PUT /players/{id})
- delete (DELETE /players/{id)
- find by id (GET /players/{id})
- find on demand (GET /players)
- Rodada:
- criar rodada (POST /rounds)
- gerar número (POST /rounds/{id}/generate-number)
- buscar ultimo número sorteado (GET /rounds/{id}/current-number)
- gerar cartela (POST /rounds/{id}/bingo-card/{playerId})
- buscar rodadas (GET /rounds)
- buscar rodada pelo id (GET /rounds/{id})
As informações acima são para o desafio, abaixo estarão as informações do projeto conforme desenvolvido para cumprir o desafio lançado.
O projeto foi feito utilizando:
- IDE IntelliJ IDEA Community Edition 2022.1.1.
- Iniciado com Spring Initializr com as configurações e dependências:
- Project: Gradle Project
- Language: Java
- Spring Boot 2.7.5
- Packaging: Jar
- Java 17
- Dependencies:
- Spring Data Reactive MongoDB
- Embedded MongoDB Database (para teste)
- Spring Reactive Web
- Java Mail Sender
- Validation
- Lombok
- Mapstruct
- OpenApi
- Thymeleaf
Logotipo do projeto:
Banner do Spring personalizado:
Diagrama de Classes UML:
OpenApi - Swagger:
Postman Collection:
Mail Catcher:
E-mail para ganhador:
E-mail para perdedor:
Cobertura de testes realizada pelo IntelliJ:
Cobertura de testes pelo plugin do Jacoco:
Clonar ou fazer download deste repositório.
Possuir docker e docker compose instalados. Se não possui, siga este tutorial de como Instalar Docker CE no Linux Ubuntu. Neste tutorial tem passo de como instalar o WSL para utilizar o Linux no Windows 10.
No terminal verifique se o serviço do docker está rodando e utilize o comando:
docker compose -f docker-compose-dev.yml up
Ao executar o comando acima, o docker irá montar os containers com as imagens de Gradle, JDK17, MongoDB e MailCatcher.
Após a aplicação terminar o início, é possível acessar o Swagger pelo endereço: http://localhost:8080/reactive-bingo/swagger-ui.html.
Para conferir emails gerados e enviados pelo sistema, utilize o MailCatcher disponível no endereço: http://localhost:1080
🙋♂ Players (Jogadores):
🎰 Rounds (Rodadas):
❤ Feito por Luis Carlos Zancanela 🚀
☎ Dúvida, sugestão ou problema é só entrar em contato.