Voltar para projetos
Em desenvolvimento
Orça Aí
SaaS multiempresa para orçamentos e propostas, começando por empresas de obras e reformas. Backend em Spring Boot com isolamento de dados entre empresas e autenticação por sessão.
Problema
Empresas de obras e reformas precisam organizar clientes, orçamentos, propostas e serviços em um só lugar, com a equipe trabalhando sobre os mesmos dados.
Solução
Uma plataforma SaaS em que cada empresa tem sua conta e sua equipe. A base atual cobre cadastro da empresa, autenticação, gestão de equipe e o primeiro módulo de negócio — clientes. Orçamentos e propostas são os próximos módulos.
Arquitetura
- Monólito modular em Spring Boot: identity, organizations, users, customers e team são pacotes com fronteiras claras, que se referenciam por ID e não por associação JPA.
- Multi-tenancy em banco compartilhado: a empresa vem apenas da sessão autenticada, o Hibernate filtra por @TenantId e o PostgreSQL aplica Row Level Security.
- Sessão no servidor com Spring Session JDBC em vez de JWT, cookies HttpOnly e proteção CSRF double-submit.
- O frontend Next.js fala só com a própria origem; /api é roteado ao backend, sem CORS. Erros seguem a RFC 9457 (problem+json).
Principais funcionalidades
- Cadastro da empresa com usuário OWNER e confirmação de e-mail.
- Login, logout, recuperação e redefinição de senha com tokens de uso único.
- Equipe com convites, papéis OWNER / ADMIN / MEMBER, desativação e reativação de usuários.
- Clientes: cadastro, busca paginada, edição, arquivamento e restauração, com controle de concorrência via ETag e If-Match.
- Rate limit de login por endereço e por conta.
Desafios técnicos
- Garantir que uma empresa nunca acesse dados de outra, mesmo conhecendo o UUID exato do registro — coberto por testes de isolamento entre tenants.
- Tokens de e-mail de uso único sob concorrência: o consumo é um UPDATE … RETURNING atômico no PostgreSQL, testado com várias threads.
- Evitar enumeração de contas: cadastro e recuperação de senha respondem sempre da mesma forma, com o mesmo custo de BCrypt.
- Testes de integração contra um PostgreSQL real com Testcontainers e migrations versionadas com Flyway.