API REST para cadastro, autenticacao e pesquisa de jogos por categorias e plataformas.
O projeto foi desenvolvido em Java com Spring Boot e refatorado para uma Clean Architecture pragmatica, separando dominio, casos de uso, infraestrutura e interface REST.
- Java 17
- Spring Boot 3
- Spring Web
- Spring Security
- JWT
- Spring Data JPA
- PostgreSQL
- Flyway
- H2 para testes
- Maven
- Docker Compose
- Swagger/OpenAPI
- JUnit 5 + AssertJ
dev.java10x.gamesearch
├── domain
│ ├── model
│ └── exception
├── application
│ ├── gateway
│ └── usecase
├── infrastructure
│ ├── persistence
│ │ ├── entity
│ │ ├── repository
│ │ ├── mapper
│ │ └── gateway
│ └── security
├── interfaceadapter
│ └── rest
│ ├── controller
│ ├── docs
│ ├── dto
│ └── mapper
└── config
Fluxo principal:
Controller -> UseCase -> Gateway -> Infrastructure -> JpaRepository
- Registro de usuario
- Login com JWT
- CRUD de categorias
- CRUD de plataformas
- CRUD de jogos
- Busca de jogos por categoria
- Busca de jogos por plataforma
- Validacao de requests
- Respostas de erro padronizadas
- Seed inicial com jogos, categorias e plataformas
- Documentacao Swagger
git clone https://github.com/m9rin/game-search.git
cd game-searchCrie um arquivo .env na raiz:
DB_NAME=gamesearch
DB_USERNAME=postgres
DB_PASSWORD=postgres
JWT_SECRET=change-meA aplicacao tambem aceita:
DB_URL=jdbc:postgresql://localhost:5432/gamesearch
DB_USERNAME=postgres
DB_PASSWORD=postgres
JWT_SECRET=change-medocker compose up -dLinux/macOS/WSL:
./mvnw spring-boot:runWindows:
mvnw.cmd spring-boot:runA API ficara disponivel em:
http://localhost:8080
Documentacao interativa:
http://localhost:8080/swagger/index.html
OpenAPI JSON:
http://localhost:8080/api/api-docs
Registre um usuario:
POST /auth/registerExemplo:
{
"name": "Marin",
"email": "marin@email.com",
"password": "123456"
}Faca login:
POST /auth/loginExemplo:
{
"email": "marin@email.com",
"password": "123456"
}Resposta:
{
"token": "jwt-token"
}Use o token nas rotas protegidas:
Authorization: Bearer jwt-tokenPOST /auth/register
POST /auth/login
POST /gamesearch/category
GET /gamesearch/category
GET /gamesearch/category/{id}
PUT /gamesearch/category/{id}
DELETE /gamesearch/category/{id}
POST /gamesearch/platform
GET /gamesearch/platform
GET /gamesearch/platform/{id}
PUT /gamesearch/platform/{id}
DELETE /gamesearch/platform/{id}
POST /gamesearch/game
GET /gamesearch/game
GET /gamesearch/game/{id}
PUT /gamesearch/game/{id}
DELETE /gamesearch/game/{id}
GET /gamesearch/game/search/category?category={id}
GET /gamesearch/game/search/platform?platform={id}
POST /gamesearch/game{
"title": "The Witcher 3: Wild Hunt",
"genre": "RPG",
"releaseDate": "2015-05-19",
"rating": 9.8,
"description": "Open-world fantasy RPG.",
"developer": "CD Projekt Red",
"publisher": "CD Projekt",
"categories": [1, 2],
"platforms": [1, 2, 3]
}As tabelas sao versionadas com Flyway:
src/main/resources/db/migration
O projeto cria automaticamente:
- categorias
- plataformas
- jogos
- relacionamento jogo-categoria
- relacionamento jogo-plataforma
- usuarios
Tambem ha seed inicial com exemplos de jogos, categorias e plataformas.
Usuarios devem ser criados pela API em /auth/register.
Rodar todos os testes:
Linux/macOS/WSL:
./mvnw clean testWindows:
mvnw.cmd clean testOs testes usam profile test com H2 em memoria.
O projeto prioriza testes de use cases, mantendo a regra de negocio testavel sem subir Spring.
Coberturas principais:
- Category use case
- Platform use case
- Game use case
- Register user use case
- Login use case
- Application context com profile de teste
Os erros seguem formato padronizado:
{
"timestamp": "2026-06-07T00:00:00Z",
"status": 400,
"error": "Bad Request",
"message": "Validation failed",
"fields": {
"email": "Invalid email format"
}
}Exemplos de status:
400 Bad Request
401 Unauthorized
404 Not Found
409 Conflict
- O dominio nao depende de Spring, JPA ou HTTP.
- Use cases dependem de gateways, nao de repositories.
- JPA fica isolado em
infrastructure.persistence. - JWT e BCrypt ficam em
infrastructure.security. - DTOs ficam apenas na camada REST.
- Controllers chamam use cases, nao repositories.
- Regras de negocio sao testadas sem banco real.
domain/model
Modelos puros da aplicacao.
application/usecase
Regras e fluxos de aplicacao.
application/gateway
Contratos usados pelos use cases.
infrastructure/persistence
JPA, repositories, entities, mappers e gateways concretos.
infrastructure/security
JWT e criptografia de senha.
interfaceadapter/rest
Controllers, DTOs, mappers e documentacao Swagger.
Projeto em evolucao, com foco em:
- arquitetura limpa
- testes
- seguranca
- documentacao
- boas praticas com Spring Boot
Desenvolvido por m9rin.