API REST em Java e Spring Boot para criação e processamento de pedidos, aplicando padrões de projeto em um fluxo simples de domínio.
Este projeto foi desenvolvido para o desafio de Design Patterns da DIO e também como material de portfólio para demonstrar organização de código, testes automatizados, documentação de API, CI e preparação para deploy.
| Recurso | URL |
|---|---|
| Repositório | https://github.com/PedroseleT/orderflow-api |
| API em produção | https://orderflow-api-yu0r.onrender.com |
| Swagger em produção | https://orderflow-api-yu0r.onrender.com/swagger-ui.html |
| Swagger local | http://localhost:8080/swagger-ui.html |
| Health check local | http://localhost:8080/actuator/health |
| Tecnologia | Uso |
|---|---|
| Java 21 | Linguagem principal |
| Spring Boot | Base da aplicação |
| Spring Web | Endpoints REST |
| Spring Data JPA | Persistência com Repository |
| Bean Validation | Validação de entrada |
| H2 Database | Banco em memória para execução local |
| SpringDoc OpenAPI | Swagger e contrato da API |
| Actuator | Health check |
| JUnit 5 | Testes automatizados |
| Mockito | Teste unitário do fluxo de serviço |
| Maven | Build e dependências |
| Docker | Empacotamento para deploy |
| GitHub Actions | CI com teste e build |
| Padrão | Onde aparece | Responsabilidade |
|---|---|---|
| Strategy | ShippingStrategy, StandardShippingStrategy, ExpressShippingStrategy, PickupShippingStrategy |
Calcula o frete conforme o tipo escolhido |
| Factory | ShippingStrategyFactory |
Seleciona a estratégia correta de frete |
| Chain of Responsibility | OrderValidationChain e handlers de validação |
Executa validações de regra de negócio em sequência |
| Facade | OrderFacade |
Orquestra validação, cálculo de frete, montagem e persistência do pedido |
| Repository | OrderRepository |
Abstrai o acesso ao banco de dados via Spring Data JPA |
O escopo não inclui implementação manual de Singleton. Os componentes gerenciados pelo Spring usam o ciclo de vida padrão do container, que por padrão trabalha com beans singleton.
flowchart TD
A[POST /orders] --> B[OrderController]
B --> C[OrderFacade]
C --> D[OrderValidationChain]
D --> E[ShippingStrategyFactory]
E --> F[ShippingStrategy]
F --> G[OrderService]
G --> H[OrderRepository]
H --> I[(H2 Database)]
G --> J[OrderResponse]
| Campo | Tipo | Descrição |
|---|---|---|
| id | Long | Identificador do pedido |
| customerName | String | Nome do cliente |
| customerEmail | String | E-mail do cliente |
| subtotal | BigDecimal | Valor dos itens sem frete |
| shippingCost | BigDecimal | Valor calculado do frete |
| total | BigDecimal | Subtotal somado ao frete |
| shippingType | STANDARD, EXPRESS, PICKUP | Tipo de frete |
| status | CREATED, PAID, SHIPPED, CANCELED | Status do pedido |
| createdAt | LocalDateTime | Data e hora de criação |
| Regra | Comportamento |
|---|---|
| Pedido novo | Sempre inicia com status CREATED |
| Nome do cliente | Deve ter pelo menos 3 caracteres |
| Deve ter formato válido | |
| Subtotal | Deve ser maior que zero e no mínimo 10.00 |
| Frete STANDARD | 5% do subtotal mais 8.00 |
| Frete EXPRESS | 12% do subtotal mais 15.00 |
| Frete PICKUP | 0.00 |
| Frete EXPRESS | Exige subtotal mínimo de 50.00 |
| Método | Rota | Descrição |
|---|---|---|
| POST | /orders |
Cria um pedido |
| GET | /orders |
Lista pedidos |
| GET | /orders/{id} |
Busca pedido por id |
| DELETE | /orders/{id} |
Remove pedido por id |
| PATCH | /orders/{id}/status |
Atualiza status do pedido |
{
"customerName": "Pedro Teles",
"customerEmail": "[email protected]",
"subtotal": 100.00,
"shippingType": "STANDARD"
}Resposta esperada:
{
"id": 1,
"customerName": "Pedro Teles",
"customerEmail": "[email protected]",
"subtotal": 100.00,
"shippingCost": 13.00,
"total": 113.00,
"shippingType": "STANDARD",
"status": "CREATED",
"createdAt": "2026-08-15T16:00:00"
}{
"status": "PAID"
}Pré-requisitos:
| Ferramenta | Versão |
|---|---|
| Java | 21 |
| Maven | Wrapper incluído no projeto |
Comandos:
./mvnw test
./mvnw clean package
./mvnw spring-boot:runNo Windows:
.\mvnw.cmd test
.\mvnw.cmd clean package
.\mvnw.cmd spring-boot:runDepois de iniciar:
| Recurso | URL |
|---|---|
| API | http://localhost:8080 |
| Swagger | http://localhost:8080/swagger-ui.html |
| Health check | http://localhost:8080/actuator/health |
Build:
docker build -t orderflow-api .Execução:
docker run -p 8080:8080 -e PORT=8080 orderflow-apiA aplicação usa H2 em memória. Os dados são criados apenas para demonstração e não persistem após reiniciar a aplicação.
O console web do H2 permanece desabilitado.
A suíte cobre:
| Camada | Cobertura |
|---|---|
| Strategy | Cálculo dos três tipos de frete |
| Factory | Seleção da estratégia por tipo de frete |
| Chain of Responsibility | Validações de regras de negócio |
| Facade | Orquestração do fluxo de criação |
| API | Fluxo integrado de criar, buscar, atualizar status e remover pedido |
Comando:
./mvnw testO workflow do GitHub Actions executa:
| Etapa | Comando |
|---|---|
| Testes | ./mvnw test |
| Build | ./mvnw clean package |
O pipeline roda em pushes e pull requests para a branch main.
Pedro Teles de Brito
GitHub: https://github.com/PedroseleT
LinkedIn: http://www.linkedin.com/in/pedro-teless