O que vem pronto
Tudo abaixo funciona no scaffold recém-gerado, sem configuração adicional além do Getting Started.
Vertical slices (canon Orders)
Casos de uso moram em pastas únicas Application/{Modulo}/{Feature}/ — Command/Query,
Handler, Validator e Response juntos, não divididos por tipo. A feature Orders
(CreateOrder, ApproveOrder, GetOrderById, ListOrders) é a referência viva: para
criar uma feature nova, replique a estrutura por imitação. O racional está no
ADR-001.
Handlers retornam ValueTask<Result<T>> (Result pattern do
DevPack Core); validação field-level vive em
AbstractValidator<TCommand> e roda no pipeline antes do handler; invariantes de domínio
vivem em métodos da entidade.
Autenticação dual-scheme (local, out-of-the-box)
O template nasce com ASP.NET Core Identity local + dois schemes coexistindo (ADR-006):
- Browser → cookie de sessão
HttpOnly+Secure+SameSite(BFF) — zero token no JavaScript, CSRF viaX-XSRF-TOKEN. - Mobile / service-to-service → Bearer JWT assimétrico (RSA), validado contra o JWKS publicado pela própria API; client-credentials para S2S.
Os dois desembocam em ICurrentUser, então a autorização downstream não muda entre
schemes. Endpoints e payloads na seção API › Autenticação. Para quem
já tem IdP corporativo, o swap para resource server externo é documentado em
Extensibilidade.
Autorização role-based com permissões em banco
Permissões seguem naming {Feature}.{Operation} (Orders.Create), declaradas em endpoint
via RequireAuthorization(...). O mapeamento role → permissão é persistido na tabela
RolePermissions (seed com Admin/Operator/Viewer) e resolvido com cache de 5 minutos
— ADR-004.
Persistência EF Core + interceptors
AuditedEntity com AuditTimestamp (UTC + timezone IANA), soft-delete e dispatch de
domain events pós-save — tudo via interceptors do
DevPack Infrastructure.EfCore,
registrados com o builder fluente AddDevPackEfCoreInterceptors().
Frontend SPA same-origin
React + Vite + TypeScript + Tailwind v4 + shadcn/ui, servido pela API
(ADR-007) — é o que faz o cookie BFF
funcionar sem CORS. Vertical slices também no front (features/{nome}/ com api.ts,
access.ts, páginas), client HTTP tipado gerado do OpenAPI (openapi-fetch), testes com
Vitest + Testing Library + MSW.
Operacional
- Observabilidade: OpenTelemetry (traces, métricas, runtime) com exporter OTLP
configurado pelas env vars padrão (
OTEL_EXPORTER_OTLP_ENDPOINTetc.). - Rate limiting: fixed-window global por IP (
RateLimiting:PermitLimit/WindowSeconds), probes de health isentos. - API versioning:
Asp.Versioning.Httpcom URL segment (/v1/...) + header fallbackX-Api-Version. - CORS: desligado por default (same-origin); liga apenas quando
Cors:AllowedOriginsé populado. - Concorrência otimista:
RowVersionnos aggregates com transição de estado.
Testes
Domain tests (xUnit) + integration tests end-to-end com
WebApplicationFactoryBase do DevPack.Testing — InMemory provider,
auth fake por header X-Test-Roles (CreateClientWithRoles("Admin")) e seed de usuário +
service client para os testes de fluxo real de autenticação.