ConstruΓda com Clean Architecture β use cases isolados, domΓnio protegido, zero vazamento de infraestrutura.
Β
Β
π Language / Idioma: English Β· PortuguΓͺs
Β
InΓcio RΓ‘pido Β· Arquitetura Β· API Reference Β· DecisΓ΅es de Design Β· Roadmap
Β
| Clean Architecture aplicada com rigor | Use Cases como cidadΓ£os de primeira classe | Config 12-Factor compliant |
| Zero vazamento do domain model | Custom exceptions & handler global | Schema versionado com Flyway |
| Identificadores gerados automaticamente | CI/CD com GitHub Actions | Deploy-ready com Docker |
Durante o desenvolvimento de APIs, Γ© comum comeΓ§ar com uma estrutura simples: controllers chamando services, services acessando repositories e entidades sendo retornadas diretamente nas respostas.
Embora essa abordagem funcione em projetos menores, ela pode gerar problemas conforme a aplicaΓ§Γ£o cresce, como acoplamento entre camadas, dificuldade de manutenΓ§Γ£o e dependΓͺncia direta da estrutura do banco de dados.
O SummitCore foi desenvolvido buscando uma arquitetura mais organizada e escalΓ‘vel, utilizando Clean Architecture para separar regras de negΓ³cio da infraestrutura.
O projeto aplica:
- Use Cases para centralizar a lΓ³gica de negΓ³cio;
- DTOs para separar os contratos da API das entidades de persistΓͺncia;
- Tratamento global de exceΓ§Γ΅es;
- Flyway para gerenciamento de migrations;
- ConfiguraΓ§Γ£o atravΓ©s de variΓ‘veis de ambiente.
PrΓ©-requisitos: JDK 17+, Maven 3.8+, Docker
git clone https://github.com/your-username/summitcore-api.git
cd summitcore-apiInicie o PostgreSQL via Docker:
docker compose up -dConfigure as variΓ‘veis de ambiente (ou use seu .env):
export SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/summitcore
export SPRING_DATASOURCE_USERNAME=your_username
export SPRING_DATASOURCE_PASSWORD=your_passwordBuild e execuΓ§Γ£o:
mvn clean install
mvn spring-boot:runAPI disponΓvel em http://localhost:8080. Nenhuma configuraΓ§Γ£o manual de schema necessΓ‘ria β o Flyway executa as migrations automaticamente na inicializaΓ§Γ£o.
Clean Architecture. O domΓnio nΓ£o sabe nada sobre Spring, JPA ou PostgreSQL. A infraestrutura se adapta ao domΓnio β nunca o contrΓ‘rio.
HTTP Request
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β Presentation Layer β
β EventController β
β Gerencia HTTP, rotas e status codes β
β Retorna DTOs β nunca domain models β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β Core β Use Cases β
β CreateEventCase / FindAllEventCase β
β FindByIdEventCase / FilterEventCase β
β DeleteEventByIdCase / UpdateEventCase β
β Todas as regras de negΓ³cio vivem aqui β
β Depende apenas de interfaces Gateway β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β Core β Gateway (interface) β
β EventGateway β
β Fronteira entre domΓnio e infraestrutura β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β Infrastructure β Gateway (impl) β
β EventRepositoryGateway β
β Implementa EventGateway via JPA β
β Usa EventEntityMapper para conversΓ£o β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β PostgreSQL 15+ (Docker) β
β Schema gerenciado por Flyway migrations β
β Nunca exposto ao domΓnio diretamente β
βββββββββββββββββββββββββββββββββββββββββββββββ
O package core Γ© domΓnio puro β entidades, enums, interfaces e implementaΓ§Γ΅es de use cases, e a interface EventGateway. Ele nΓ£o tem nenhuma dependΓͺncia de Spring Data, JPA ou qualquer preocupaΓ§Γ£o de infraestrutura.
O package infrastructure Γ© onde o Spring vive β EventRepositoryGateway implementa EventGateway, EventRepository se comunica com o PostgreSQL, os mappers convertem entre entidades de domΓnio e entidades JPA, e o BeanConfiguration conecta tudo.
| MΓ©todo | Rota | DescriΓ§Γ£o | Status |
|---|---|---|---|
GET |
api/events |
Lista todos os eventos | 200 |
GET |
api/events/{id} |
Busca evento por ID | 200 / 404 |
GET |
api/events/filter/identifier |
Filtra eventos pelo identificador | 200 / 404 |
POST |
api/events |
Cria um novo evento | 201 / 409 |
PUT |
api/events/{id} |
Atualiza um evento | 200 / 404 |
DELETE |
api/events/{id} |
Remove um evento por ID | 204 / 404 |
Criando um evento:
curl -X POST http://localhost:8080/events \
-H "Content-Type: application/json" \
-d '{
"name": "Spring Boot Workshop",
"description": "SessΓ£o prΓ‘tica sobre Spring Boot 3 e Clean Architecture.",
"date": "2026-07-15",
"type": "WORKSHOP"
}'{
"success": true,
"data": {
"identifier": "b3f1c2d4-e5a6-7890-abcd-ef1234567890",
"name": "Spring Boot Workshop",
"description": "SessΓ£o prΓ‘tica sobre Spring Boot 3 e Clean Architecture.",
"date": "2026-07-15",
"type": "WORKSHOP"
}
}Atualizando um evento:
curl -X PUT http://localhost:8080/events/b3f1c2d4-e5a6-7890-abcd-ef1234567890 \
-H "Content-Type: application/json" \
-d '{
"name": "Spring Boot Workshop β AvanΓ§ado",
"description": "Deep dive em Spring Boot 3, Clean Architecture e estratΓ©gias de teste.",
"date": "2026-07-20",
"type": "WORKSHOP"
}'{
"success": true,
"data": {
"identifier": "b3f1c2d4-e5a6-7890-abcd-ef1234567890",
"name": "Spring Boot Workshop β AvanΓ§ado",
"description": "Deep dive em Spring Boot 3, Clean Architecture e estratΓ©gias de teste.",
"date": "2026-07-20",
"type": "WORKSHOP"
}
}Todas as respostas sΓ£o encapsuladas em
ApiResponseβ um envelope consistente com um camposuccesse um campodata. OidentifierΓ© um UUID gerado automaticamente pelo domΓnio na criaΓ§Γ£o β o cliente nunca precisa fornecΓͺ-lo.
Os erros sΓ£o tratados globalmente via GlobalExceptionHandler. Nenhum bloco try/catch espalhado pelos controllers.
| ExceΓ§Γ£o | HTTP Status | Quando |
|---|---|---|
DuplicateEventException |
409 Conflict |
Evento com os mesmos dados jΓ‘ existe |
EventNotFoundException |
404 Not Found |
Recurso nΓ£o encontrado pelo identifier |
Todas as respostas de erro seguem o mesmo envelope ApiResponse das respostas de sucesso β formato previsΓvel em toda a API.
Cada padrΓ£o aqui Γ© uma escolha deliberada, nΓ£o boilerplate.
Clean Architecture β O domΓnio fica no centro e nΓ£o depende de nada. A infraestrutura se adapta a ele. Isso significa que o banco de dados, o framework e a camada HTTP podem todos mudar sem tocar em nenhum use case.
Use Cases como interfaces + implementaΓ§Γ΅es β CreateEventCase Γ© uma interface; CreateEventCaseImpl Γ© sua implementaΓ§Γ£o. Use cases sΓ£o injetados pela interface, mantendo os chamadores desacoplados da lΓ³gica concreta. Trocar implementaΓ§Γ΅es ou fazer mock em testes nΓ£o exige nenhuma refatoraΓ§Γ£o.
EventGateway como fronteira β O domΓnio nunca chama um repository diretamente. Ele chama EventGateway, uma interface que ele mesmo possui. O EventRepositoryGateway na camada de infraestrutura implementa essa interface. A direΓ§Γ£o de dependΓͺncia sempre aponta para dentro.
Identifier gerado automaticamente β O identifier (UUID) Γ© gerado pela camada de domΓnio na criaΓ§Γ£o, nΓ£o delegado Γ sequence do banco de dados. Isso mantΓ©m o domΓnio no controle de sua prΓ³pria identidade β nenhuma preocupaΓ§Γ£o de infraestrutura vaza para o core.
Dual mapper pattern β EventMapper converte entre entidades de domΓnio e DTOs para a presentation layer. EventEntityMapper converte entre entidades de domΓnio e entidades JPA para a persistence layer. Cada mapper tem uma ΓΊnica responsabilidade bem definida.
ApiResponse envelope β Todas as respostas β sucesso e erro β compartilham o mesmo wrapper. Os clients sempre sabem o formato que vΓ£o receber, independentemente do endpoint.
EventType enum β Os tipos de evento nΓ£o sΓ£o strings livres no banco de dados. SΓ£o um enum de primeira classe no domΓnio, aplicado no nΓvel de tipo antes que qualquer coisa chegue Γ persistΓͺncia.
Tratamento global de exceΓ§Γ΅es β @RestControllerAdvice intercepta exceΓ§Γ΅es tipadas e as mapeia para respostas HTTP. Os controllers ficam limpos. O formato de erro Γ© consistente em toda a API.
Flyway migrations β MudanΓ§as de schema sΓ£o arquivos SQL versionados. Todo ambiente executa exatamente as mesmas migrations na mesma ordem. Nenhum schema drift entre mΓ‘quinas.
Config 12-Factor β As credenciais do banco de dados vΓͺm de variΓ‘veis de ambiente. O mesmo artefato roda em qualquer ambiente sem modificaΓ§Γ£o.
GitHub Actions CI/CD β Build, test e deploy sΓ£o automatizados via workflow files. Todo push para main aciona o pipeline β sem passos manuais, sem surpresas por ambiente.
ββββββββββββββββββββββββββββββββ
β event β
ββββββββββββββββββββββββββββββββ
β identifier (UUID, PK) β
β name β
β description β
β date β
β type (EventType) β
ββββββββββββββββββββββββββββββββ
O schema Γ© versionado via Flyway. V1__create_table_event.sql define a estrutura inicial. V2__rename_column_identify_to_identifier.sql corrige o nome da coluna. A fonte da verdade Γ© sempre a cadeia de migrations β nΓ£o o ddl-auto do Hibernate.
src/
βββ main/
βββ java/
βββ com/summitcore/
βββ core/
β βββ entities/ # Domain entity β Event
β βββ enums/ # EventType
β βββ exception/ # DuplicateEventException, EventNotFoundException
β βββ gateway/ # Interface EventGateway
β βββ useCases/ # Interfaces + implementaΓ§Γ΅es dos use cases
βββ infrastructure/
βββ config/ # BeanConfiguration β wiring de DI
βββ exception/ # GlobalExceptionHandler
βββ gateway/ # EventRepositoryGateway (implementa EventGateway)
βββ mapper/ # EventEntityMapper, EventMapper
βββ persistence/ # EventEntity, EventRepository (JPA)
βββ presentation/ # EventController
βββ request/ # EventRequest (inbound DTO)
βββ response/ # ApiResponse, EventResponse (outbound DTOs)
βββ resources/
βββ db/migration/
β V1__create_table_event.sql
β V2__rename_column_identify_to_identifier.sql
application.yml
.github/
βββ workflows/
βββ ci.yml # GitHub Actions β build, test, deploy
| Componente | Tecnologia | Por quΓͺ |
|---|---|---|
| Linguagem | Java 17 LTS | Records, pattern matching, suporte de longo prazo |
| Framework | Spring Boot 3.x | PadrΓ£o da indΓΊstria, ecossistema de DI poderoso |
| PersistΓͺncia | Spring Data JPA + Hibernate | AbstraΓ§Γ£o limpa sobre JDBC |
| Banco de Dados | PostgreSQL 15+ | ConfiΓ‘vel, comprovado em produΓ§Γ£o |
| Container | Docker + Docker Compose | Ambientes reproduzΓveis |
| Migrations | Flyway | Schema versionado |
| Build | Maven 3.8+ | Lifecycle previsΓvel |
| CI/CD | GitHub Actions | Pipeline automatizado de build, test e deploy |
- Identifier UUID gerado automaticamente
- Deploy pipeline via GitHub Actions (em desenvolvimento)
- AutenticaΓ§Γ£o com Spring Security + JWT
- Expandir cobertura de custom exceptions para todos os cenΓ‘rios de erro
- PaginaΓ§Γ£o e ordenaΓ§Γ£o nos endpoints de listagem
- OpΓ§Γ΅es adicionais de filtro (intervalo de datas, localizaΓ§Γ£o)
- Testes unitΓ‘rios e de integraΓ§Γ£o
Issues e PRs sΓ£o bem-vindos. Se vocΓͺ estΓ‘ adicionando uma feature, comece pelo use case β a lΓ³gica de negΓ³cio pertence ao core, nΓ£o aos controllers ou implementaΓ§Γ΅es de gateway.
MIT β veja LICENSE.
Desenvolvido por Andrius Anselmi Β· LinkedIn