Arquitetura robusta, moderna e de alta performance construída com C#, ASP.NET Core 10.0 e Entity Framework Core. Adota Vertical Slice Architecture (VSA) com fatias funcionais de baixo acoplamento e alta coesão.
- Runtime & SDK: .NET 10.0
- Framework Web: ASP.NET Core Web API
- ORM: Entity Framework Core 10
- Banco de Dados: SQL Server + Redis (cache de sessões, rate limit)
- Mensageria: RabbitMQ com DLX/DLQ, retry, Publisher Confirms
- Documentação: OpenAPI 3.0 via
v1/docs - Observabilidade: OpenTelemetry (OTLP) + Prometheus + Grafana
- Qualidade: SonarQube + Husky + dotnet format
- Testes: xUnit + Testcontainers (SQL/Redis/RabbitMQ reais)
- CI/CD: GitHub Actions
Código organizado em Feature Slices em src/Features/. Cada pasta contém todo o ciclo da funcionalidade: Controller, Command/Query DTOs, Validadores, Handlers e Mappers. Sem camadas Service/Repository genéricas.
src/
├── Core/ → Primitivas de domínio e CQRS
├── Domain/ → BaseEntity, SearchRequest
├── Shared/ → QueryableExtensions, Cqrs, DateTimeHelper
├── Web/ → Controllers base, Middleware, Filters
├── Database/ → DbContext, Migrations, Entities
├── Infrastructure/ → Auth, Messaging, Pdf, Storage, Auditing, HealthChecks, Configuration
├── Features/ → Auth, User, Role, Feature, Product, Storage, Dashboard, AuditExplorer
└── Migrations/ → EF Core migrations versionadas
- CQRS com MediatR — commands e queries separados por slice
- FluentValidation — validação desacoplada dos handlers
- Registros Imutáveis (
record) para DTOs de request/response - Soft Delete & LGPD — exclusão lógica com anonimização
- RBAC Granular —
[CheckPermission("feature", "action")]com permissões view/create/delete/activate
- Tokens JWT com
jtiúnico,sv(session version) ekid(key id) - Refresh tokens armazenados em Redis por usuário (multi-device)
- Invalidação O(1) via
SessionVersion— desativar usuário/role invalida todas as sessões instantaneamente
- Todos os endpoints de auth (
/login,/validate,/change) retornam a mesma mensagem genérica independente do erro real - A causa real é logada internamente para o SOC
- Limites por endpoint via Redis + Lua script atômico
- Buckets independentes: login (5/min), password_request (3/min), export (10/min), default (100/min)
- Headers:
x-ratelimit-limit,x-ratelimit-remaining,x-ratelimit-reset - Fail-open: Redis indisponível não bloqueia requests
- Allowlist explícita por ambiente via
CORS_ALLOWED_ORIGINS AllowAnyOrigin+AllowCredentialsremovido (vetor CSRF)
- Tracing distribuído com auto-instrumentação para ASP.NET Core, EF Core, Redis e HTTP Client
- Exportação OTLP para Jaeger/Tempo/Grafana Cloud
- Ativado via
OTEL_ENABLED=true
prometheus-netcom métricas nativas do .NET (GC, CPU, ThreadPool)- Endpoint
/metricsexposto para scrape - Dashboard Grafana pré-configurado em
docker-compose.metrics.yml
- Endpoint
/healthcom checks profundos para SQL, Redis, RabbitMQ e PDF Service - Status individual por dependência e latência em ms
- Resposta 200 mesmo em degraded (ideal para k8s liveness probe)
- Publisher Confirms — garantia de entrega no broker (env
RABBIT_PUBLISHER_CONFIRMS) - DLX/DLQ — mensagens reprovadas vão para Dead Letter Queue
- Retry Queue — fila com TTL de 5s e reenvio automático
- Prefetch Count controlado (
RABBIT_PREFETCH_COUNT, default 16) - Message Versioning — header
x-message-versionem todas as publicações - Consumer BackgroundService —
RabbitMQConsumerServicegerenciado pelo ASP.NET Core lifecycle - Desabilitável via
MESSAGING_ENABLED=false
10 índices na migration inicial para as queries mais frequentes:
User.Email(unique),User.CognitoId,User.Document,User.IdRoleProduct.Sku(unique),Product.Categorytb_auditcomposite(IdUser, CreatedAt)
QueryTrackingBehavior.NoTrackingno DbContext — ganho de 20-30% em queries de leitura.AsTracking()explícito apenas nos 12 handlers que escrevem- Teste de regressão
DatabaseOptimizationTestsprotege contra reverter
- PDF Provider com retry (3x), circuit breaker, timeout (10s attempt, 30s total)
- Configurável via env vars
PDF_RESILIENCE_* - Aplicado a qualquer cliente HTTP via
AddStandardResilienceHandler()
AuditLogMiddlewarecaptura toda mutação (POST/PUT/DELETE/PATCH)- Fila
Channel<T>comBackgroundService— sem ThreadPool starvation - Batching de 50 registros por transação
- Senhas e campos sensíveis são redactados automaticamente
- Capacidade configurável via
AUDIT_QUEUE_CAPACITY(default 10000)
O backend-c-sharp pode delegar a autenticação para o auth-service-csharp (outro repositório).
AUTH_MODE=remoteno.envfaz o backend retornar 404 para/v1/auth/*- Middleware JWT, RBAC e sessão Redis continuam inalterados
- Tokens do auth-service são aceitos (mesmo
JWT_SECRETcompartilhado)
# Compliance modo microsserviço
cd ../mage-backend-compliance
cp .env.auth.csharp .env
make test-auth-csharpFROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:10.0-jammy-chiseled AS runtimeApenas ~100MB na imagem final (chiseled = sem shell, sem pacotes extras).
- Timeout configurável via
SHUTDOWN_TIMEOUT_SECONDS(default 30s) ApplicationStoppingregistrado para drenar requests in-flight e desconectar RabbitMQ antes de parar- Logs informam início e fim do shutdown
O mesmo container pode rodar como init job para migrations:
docker run -e DATABASE_URL=... -e MIGRATE_ONLY=true magebackend- .NET 10 SDK
- Docker & Docker Compose
- EF Core CLI:
dotnet tool install --global dotnet-ef
make setup # Ferramentas locais + Husky hooks
dotnet restore src # Dependências NuGet
make infra-up # SQL + Redis + RabbitMQ
make db-migrate # Aplica migrations
make dev # Inicia com Hot Reload em :8888make metrics-up # Prometheus + Grafana (localhost:3001)Configure o .env na raiz:
PORT=8888
DATABASE_URL="Server=localhost,1433;..."
REDIS_URL="localhost:6379"
RABBIT_URL="amqp://guest:guest@localhost:5672/"
MESSAGING_ENABLED=true
JWT_SECRET="sua-chave-secreta-aqui"
CORS_ALLOWED_ORIGINS="http://localhost:3000,http://localhost:4200"make test # Testes com Testcontainers (SQL/Redis/RabbitMQ)make coverage # Coverlet > 99% line coveragemake lint # Husky + dotnet format + verificação de comentários
make sonar # SonarQube scan (requer servidor em :9000)# Projeto separado: mage-backend-compliance
make test-c-sharp # 50 testes de ponta a ponta| Comando | Descrição |
|---|---|
make infra-up |
Sobe SQL + Redis + RabbitMQ |
make dev |
Hot Reload em :8888 |
make test |
Testes com Testcontainers |
make coverage |
Testes + relatório Coverlet |
make lint |
Verifica comentários // + dotnet format |
make db-migrate |
Aplica migrations EF Core |
make migration name=... |
Cria nova migration |
make generate name=... |
Scaffold de CRUD completo |
make generate-storage |
Scaffold de Storage Provider |
make metrics-up |
Prometheus + Grafana |
make sonar |
SonarQube scan |
make setup |
Instala ferramentas + hooks |
new_coverage >= 80%✅new_duplicated_lines_density <= 3%✅new_violations = 0✅caycStatus = compliant✅
- CI roda lint + testes + build em cada PR para main/develop
- SonarQube Scan integrado (token via
SONAR_TOKEN)
- Bloqueia
// commentsno código-fonte (use/* */ou///) dotnet format --verify-no-changes— formatação consistente