Implementação web do jogo Mastermind, desenvolvida com Spring Boot no backend e Angular no frontend.
| Camada | Tecnologia |
|---|---|
| Backend | Java 23, Spring Boot, Spring Security (JWT) |
| Frontend | Angular 21, Tailwind CSS |
| Banco de dados | H2 (em memória) |
| Gerenciador | Maven (backend), npm (frontend) |
- JWT com claims customizados — o token carrega
ideusernamedo usuário, eliminando consultas desnecessárias ao banco para operações autenticadas. - H2 em memória — banco em memória para facilitar a execução local sem dependências externas. Os dados são resetados a cada reinicialização.
- Perfil
dev— a configuração de CORS é ativada via Spring Profiledev, mantendo o possivel ambiente de produção protegido. - Arquitetura em camadas — o backend segue o padrão
Controller → Service → Repository, com DTOs separados de entidades. - Signals no Angular — facilitando gerenciamento de estado reativo.
- Interceptor HTTP — o token JWT é injetado automaticamente em todas as requisições via
HttpInterceptor, sem necessidade de configuração manual por chamada. - Componentização — componentes reutilizáveis extraídos das páginas:
HeaderComponent,FormFieldComponent,GameBoardRowComponent,GameResultComponenteHistoryRowComponent.
- Java 23+
- Node.js 20+
- npm 10+
- Maven 3.9+
# Na pasta /mastermind-spring
cd mastermind-spring
# Rodar com perfil dev (necessário para CORS)
mvn spring-boot:runO backend sobe em http://localhost:8080.
Acesse http://localhost:8080/h2-console com as seguintes configurações:
| Campo | Valor |
|---|---|
| JDBC URL | jdbc:h2:mem:mastermind-db |
| Username | sa |
| Password | (vazio) |
Com o backend rodando, acesse http://localhost:8080/swagger-ui.html.
# Na pasta /mastermind-angular
cd mastermind-angular
# Instalar dependências
npm install
# Rodar em modo de desenvolvimento
npm startO frontend sobe em http://localhost:4200.
O projeto não requer variáveis de ambiente externas para rodar localmente. As configurações estão no application.properties do backend:
spring.profiles.active=dev
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:mastermind-db
api.security.token.secret=sua-secret-aqui
⚠️ Atualmente o projeto está com uma secret JWT hardcoded, não indicada para repositorios publicos, porem o projeto é somente para estudos.
mastermind/
├── backend/
│ └── src/
│ └── main/java/.../
│ ├── controller/ # Endpoints REST
│ ├── service/ # Regras de negócio
│ ├── repository/ # Acesso ao banco
│ ├── model/ # Entidades JPA
│ ├── dto/ # Request e Response
│ ├── config/ # Security e CORS
│ └── exceptions/ # Exceções customizadas
└── frontend/
└── src/app/
├── pages/ # Login, Register, Dashboard, Game, Ranking
├── components/ # Componentes reutilizáveis
├── services/ # Comunicação com a API
├── guards/ # Auth guard
└── interceptors/ # JWT interceptor
- Ao iniciar uma partida, o backend gera um código secreto de 4 letras (A, B, C ou D).
- O jogador tem até 10 tentativas para adivinhar a combinação.
- A cada tentativa, o backend retorna apenas o número de posições corretas — nunca quais posições.
- A pontuação é calculada com base no número de tentativas e no tempo de duração da partida.
- O frontend nunca recebe o código secreto — apenas no caso de derrota ao final da partida.
| Método | Rota | Descrição |
|---|---|---|
| POST | /auth/register |
Cadastro de usuário |
| POST | /auth/login |
Login e geração do JWT |
| GET | /auth/me |
Dados do usuário autenticado |
| POST | /game |
Iniciar nova partida |
| POST | /game/{id}/guess |
Submeter tentativa |
| GET | /game/{id} |
Buscar partida por ID |
| GET | /game/history |
Histórico do usuário |
| GET | /ranking |
Ranking global |
