API RESTful desenvolvida em .NET 8 para gerenciamento de pedidos de e-commerce, construída com Clean Architecture.
O projeto segue os princípios de Clean Architecture, com a separação de responsabilidades entre camadas:
Store.sln
├── src/
│ ├── Store.Domain # Entidades, regras de negócio, interfaces
│ ├── Store.Application # Casos de uso, DTOs, validações, serviços
│ ├── Store.Infrastructure # EF Core, repositórios, banco de dados
│ └── Store.API # Controllers, middleware, configuração
└── tests/
└── Store.UnitTests # Testes unitários de domínio e aplicação
API → Application → Domain
Infrastructure → Domain
A camada de Domínio não conhece nenhuma outra camada — pura lógica de negócio.
# Sobe API + SQL Server
docker compose up --buildA API estará disponível em http://localhost:8080.
-
Suba um SQL Server (ou ajuste a connection string):
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=YourStrong@Passw0rd \ -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest
ou
docker compose -f docker-compose.db.yml up -d
-
Ajuste
appsettings.Development.jsoncom sua connection string. -
Execute:
cd src/Store.API dotnet run
As migrations são aplicadas automaticamente.
| Interface | URL |
|---|---|
| Swagger UI | http://localhost:8080/swagger |
| OpenAPI JSON | http://localhost:8080/openapi/v1.json |
| Health Check | http://localhost:8080/health |
Todos os endpoints são versionados com prefixo /api/v1/.
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/v1/orders |
Criar pedido |
GET |
/api/v1/orders |
Listar pedidos (com filtros e paginação) |
GET |
/api/v1/orders/{id} |
Buscar pedido por ID |
PUT |
/api/v1/orders/{id} |
Atualizar itens do pedido |
DELETE |
/api/v1/orders/{id} |
Excluir pedido |
PATCH |
/api/v1/orders/{id}/process |
Processar pedido |
PATCH |
/api/v1/orders/{id}/ship |
Enviar pedido |
PATCH |
/api/v1/orders/{id}/cancel |
Cancelar pedido |
GET /api/v1/orders?status=Initiated&buyerId={guid}&page=1&pageSize=10| Método | Rota | Descrição |
|---|---|---|
POST |
/api/v1/products |
Criar produto |
GET |
/api/v1/products/{id} |
Buscar produto |
Initiated ──► Processed ──► Shipped
│ │
└───────────────┴──► Cancelled
| Transição | Permitida quando |
|---|---|
| Initiated → Processed | Sempre que Initiated |
| Processed → Shipped | Sempre que Processed |
| Initiated → Cancelled | ✅ |
| Processed → Cancelled | ✅ |
| Shipped → Cancelled | ❌ |
| Qualquer alteração de itens | Apenas Initiated |
dotnet testCobertura:
- Testes unitários do Domínio (Order, OrderItem, Buyer, Product)
- Testes unitários da Application (OrderService com NSubstitute)
| Diferencial | Status |
|---|---|
| Filtro na listagem (status, buyerId, paginação) | ✅ |
Versionamento de endpoints (/api/v1/) |
✅ |
| Scalar UI | ✅ |
| Swagger UI | ✅ |
| Clean Architecture | ✅ |
| Docker + Docker Compose | ✅ |
| Testes unitários (xUnit + NSubstitute + FluentAssertions) | ✅ |
Health check (/health) |
✅ |
| Serilog (observabilidade) | ✅ |
| FluentValidation | ✅ |
| Problem Details (RFC 7807) | ✅ |
- .NET 8
- Entity Framework Core 8 + SQL Server
- FluentValidation — validação de requests
- Serilog — logging estruturado
- Scalar + Swashbuckle — documentação
- Asp.Versioning — versionamento de API
- xUnit + NSubstitute + FluentAssertions — testes
POST /api/v1/products
Content-Type: application/json
{
"name": "Notebook Dell XPS 15",
"price": 8999.99
}POST /api/v1/orders
Content-Type: application/json
{
"buyerName": "Maria Silva",
"buyerEmail": "maria@example.com",
"items": [
{
"productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"quantity": 2
}
]
}PATCH /api/v1/orders/{id}/processGET /api/v1/orders?status=Initiated&page=1&pageSize=5