Pular para o conteúdo
VSValter Silva
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.