- Arquitetura
- Monólito modular + Clean Architecture
- Isolamento
- Query filters globais por tenant
- Testes
- 33 testes (25 unitários, 8 de integração)
- Infra
- Azure App Service · Static Web Apps
Visão geral
Sistema fullstack para operação de um SaaS B2B multi-tenant. O domínio central é a gestão de workspaces empresariais compartilhados por múltiplas empresas, com isolamento por tenant, controle de usuários e perfis, cadastro de clientes, projetos e tarefas, assinatura por plano, limites de uso e auditoria.
O problema resolvido não é apenas CRUD: o sistema simula um backend corporativo em que várias empresas usam a mesma plataforma sem vazar dados entre si, mantendo segurança, governança e visibilidade operacional.
Arquitetura
Monólito modular com Clean Architecture dentro de um monorepo fullstack. A escolha entrega complexidade enterprise sem o custo operacional de uma malha de serviços.
-
TenantCore.ApiBorda HTTP: controllers, middlewares, auth, rate limit, health checks e Swagger. -
TenantCore.ApplicationCasos de uso, handlers do MediatR, validação com FluentValidation e contratos. -
TenantCore.DomainEntidades com comportamento (UpdateSettings, ChangeRole, ChangePlan, Rotate) e enums. -
TenantCore.InfrastructureEF Core, SQL Server, Redis, Quartz, JWT, password hashing e observabilidade.
Fluxo de autenticação e isolamento por tenant
- O usuário informa email, senha e
TenantIdna tela de login. - O frontend envia o header
X-Tenant-Idjunto das credenciais para/api/auth/login. - O middleware valida o tenant, busca o usuário dentro do tenant correto e valida a senha.
- O handler gera access token JWT e refresh token, salva o hash do refresh token no banco e grava auditoria de login.
- Em toda requisição seguinte, o middleware compara o header
X-Tenant-Idcom o claimtenantIddo token. - O
TenantCoreDbContextaplica query filters globais porTenantId— consultas normais não conseguem enxergar dados de outro tenant. - Operações de escrita checam permissão por papel, validam limites do plano, gravam
AuditLoge invalidam caches comousage:{tenantId}. - Jobs Quartz atualizam snapshots de uso, recalculam o estado de cota e limpam tokens expirados.
Pontos fortes
- Multi-tenancy com defesa em profundidade: middleware, claims do token e query filters do EF Core.
- JWT com refresh token rotativo e revogação, acima da média de projetos júnior.
- RBAC real por papel (Admin/Manager/User) com enforcement no backend.
- CQRS pragmático: MediatR para comandos e queries, e um read model com Dapper para o dashboard agregado.
- Observabilidade com Serilog, OpenTelemetry, health checks e Jaeger local.
- CI/CD e deploy real na Azure, com documentação de arquitetura, segurança, runbook e ADRs.
Limites e decisões conscientes
O que este projeto não faz, e por quê. Descrever isso com precisão vale mais do que exagerar o escopo.
- Não há arquitetura orientada a eventos: sem broker, filas, consumidores, outbox ou sagas. O que existe é trilha de auditoria e processamento agendado.
- O DDD é parcial — as entidades têm comportamento, mas não há value objects, domain events, aggregate roots explícitos ou bounded contexts formais.
- É um monólito modular, não microservices: uma única API e um único banco relacional.
- O README principal menciona Neon PostgreSQL, mas o código atual está acoplado a SQL Server.