O 123Vendas é um sistema composto por diversos domínios, incluindo Inventário, CRM (Cliente) e Vendas. Como desenvolvedor da equipe de Vendas, você precisa implementar um protótipo de API para gerenciamento de vendas.
Seguindo os princípios de Domain-Driven Design (DDD), todas as referências a entidades de outros domínios devem seguir o padrão Identidades Externas, com desnormalização de dados para atributos descritivos.
- Desconto progressivo:
- Compras acima de 4 itens iguais recebem 10% de desconto.
- Compras entre 10 e 20 itens iguais recebem 20% de desconto.
- Não é possível vender mais de 20 itens iguais.
- Compras abaixo de 4 itens não podem ter desconto.
A API segue uma arquitetura bem definida e modular, baseada nos princípios Clean Architecture e DDD:
.github/ # Configuração do GitHub Actions e workflows
.vscode/ # Configurações específicas do VS Code
src/ # Código-fonte principal
Sales.API/ # Camada de API (Controllers, Middlewares, Filters)
Sales.Application/ # Camada de Aplicação (Use Cases, DTOs, Interfaces)
Sales.Domain/ # Camada de Domínio (Entidades, Aggregates, Domain Services)
Sales.Infrastructure/ # Camada de Infraestrutura (Repositórios, Banco de Dados, Integrações externas)
Sales.Tests/ # Testes unitários e de integração
docs/ # Documentação do projeto
scripts/ # Scripts de automação
.env # Arquivo de variáveis de ambiente
docker-compose.yml # Arquivo Docker Compose para configuração multi-container
Dockerfile # Arquivo Dockerfile para build da aplicação
README.md # Descrição do projeto
A aplicação utiliza as seguintes tecnologias e melhores práticas:
- .NET Core 8 para desenvolvimento da API
- PostgreSQL 15.3 como banco de dados relacional
- MongoDB 1.14.1 como banco de dados NoSQL
- Docker & Docker Compose para conteinerização e deploy
- JWT Authentication para autenticação segura
- Serilog para logging estruturado
- Arquitetura em Camadas: API, Application, Domain, Infrastructure
- Git Flow Workflow para organização dos branches
- Commits Semânticos para versionamento limpo
- Princípios de Código: REST API, Clean Code, SOLID, DRY, YAGNI, Object Calisthenics
- XUnit para testes unitários
- FluentAssertions para validação fluida
- Bogus para geração de dados fake
- NSubstitute para mocks
- Test Containers (desejável) para testes de integração com containers
Antes de iniciar, você precisará ter os seguintes softwares instalados:
- .NET SDK 8.0+
- PostgreSQL 15.3+
- MongoDB 1.14.1+
- Docker (para deploy containerizado)
- Visual Studio Code ou Rider (opcional)
Execute os seguintes comandos para instalar pacotes essenciais:
# Instalar logging com Serilog
dotnet add package Serilog.AspNetCore
# Instalar frameworks de testes
dotnet add package xunit
dotnet add package FluentAssertions
dotnet add package Bogus
dotnet add package NSubstitute
dotnet add package Microsoft.NET.Test.Sdk
# Instalar container de testes
dotnet add package TestContainers
Edite o arquivo `appsettings.json` com as configurações do PostgreSQL:
{
"ConnectionStrings": {
"SalesDB": "Host=localhost;Port=5432;Database=SalesDB;Username=postgres;Password=postgres;"
}
}
Antes de rodar a API no Docker, valide se o restore do .NET funciona:
dotnet restore src/Sales.API/Sales.API.csproj
Caso precise limpar o cache e tentar novamente:
dotnet nuget locals all --clear
dotnet restore src/Sales.API/Sales.API.csproj
docker build -t sales-api .
docker run -d -p 5000:5000 --name sales-container sales-api
Para validar o build:
docker run --rm -it sales-api ls -R /app
Se houver erro, tente reconstruir sem cache:
docker system prune -af
docker build --no-cache -t sales-api .
Crie um `docker-compose.yml` com a seguinte estrutura:
version: '3.9'
services:
app:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/SalesDB
db:
image: postgres:15.3
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: SalesDB
mongo:
image: mongo
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
Para rodar:
docker-compose up -d
Execute os testes unitários e de integração:
dotnet test
Acesse a documentação Swagger da API em: Swagger Local
- Localhost: Swagger local machine