4.6 KiB
Etapa 1/8 — Setup do Projeto
Contexto do projeto
Estou construindo o SeConectai Vendas: um CRM/controle de vendas multi-tenant. Existe um painel master (eu, dono da plataforma, que vendo o acesso ao sistema) e painéis de tenant (meus clientes, que usam o sistema para cadastrar os próprios clientes/vendas).
Stack definida:
- Node.js 20+ / TypeScript
- NestJS (organizado em módulos por domínio)
- PostgreSQL 16 + Prisma ORM
- Redis (usado a partir de uma etapa futura, mas já deve subir no compose)
- Docker + Docker Compose para todo o ambiente (dev e produção)
- Multi-tenancy: banco único, isolamento por
tenant_id+ Row Level Security (RLS) do Postgres
Esta é a Etapa 1 de 8 de um build faseado. Cada etapa será entregue separadamente. Nesta etapa, quero apenas a fundação do projeto — nenhuma feature de negócio ainda.
Objetivo desta etapa
Criar a estrutura base do repositório, ambiente Docker funcional, conexão com banco de dados via Prisma, e o schema inicial do banco já migrado.
Tarefas
-
Estrutura do projeto NestJS
- Criar projeto NestJS em TypeScript com estrutura modular:
src/modules/<dominio>/...(os domínios virão nas próximas etapas — por ora, criar sósrc/modules/health/com um endpointGET /healthque retorna status da API e status da conexão com o banco). - Configurar ESLint + Prettier com regras razoáveis para TypeScript.
- Configurar variáveis de ambiente via
.env(usar@nestjs/config), com um.env.exampledocumentando todas as chaves necessárias.
- Criar projeto NestJS em TypeScript com estrutura modular:
-
Docker Compose
- Criar
docker-compose.ymlcom os serviços:app(build a partir de umDockerfilemulti-stage — stage de build e stage de produção enxuto)postgres(Postgres 16, volume nomeado para persistência, healthcheck)redis(Redis 7, volume nomeado, healthcheck) — não será usado ainda, mas deixar disponível
- Criar
docker-compose.override.yml(ou perfildev) com hot-reload do backend para desenvolvimento local. - Garantir que
docker compose upsobe tudo e a API responde emGET /healthcom status 200.
- Criar
-
Banco de dados e Prisma
- Inicializar Prisma (
prisma/schema.prisma) e traduzir exatamente o schema SQL abaixo para o formato Prisma, preservando nomes de tabelas/campos, tipos, enums, defaults, unique constraints e índices. - Não implemente ainda a lógica de RLS na aplicação (isso é da Etapa
2) — mas a migration gerada deve incluir os comandos
ALTER TABLE ... ENABLE ROW LEVEL SECURITYe asCREATE POLICYdefinidos no schema, via uma migration SQL raw do Prisma (Prisma não suporta RLS nativamente, então usarprisma migrate devseguido de uma migration manual.sqlpara as policies). - Rodar a migration inicial e confirmar que todas as tabelas, enums,
views e policies foram criadas corretamente no Postgres do
docker-compose.
Schema de referência (colar aqui o conteúdo completo do arquivo
seconectai-vendas-schema.sqlfornecido separadamente — use-o como fonte de verdade). - Inicializar Prisma (
-
Scripts utilitários
package.jsoncom scripts:dev,build,start:prod,lint,test,prisma:migrate,prisma:generate,prisma:studio.README.mdinicial explicando como subir o projeto localmente (docker compose up, variáveis de ambiente necessárias, como rodar migrations).
-
Testes
- Configurar Jest (já vem com NestJS) e criar um teste simples do
endpoint
/health.
- Configurar Jest (já vem com NestJS) e criar um teste simples do
endpoint
Estrutura de pastas esperada
seconectai-vendas/
├── docker-compose.yml
├── docker-compose.override.yml
├── Dockerfile
├── .env.example
├── package.json
├── prisma/
│ ├── schema.prisma
│ └── migrations/
├── src/
│ ├── main.ts
│ ├── app.module.ts
│ ├── config/
│ └── modules/
│ └── health/
│ ├── health.module.ts
│ ├── health.controller.ts
│ └── health.service.ts
└── test/
Critérios de aceite
docker compose upsobeapp,postgreseredissem erroGET /healthretorna 200 com status da API e status da conexão com o banco- Todas as tabelas, enums, views e índices do schema fornecido existem
no banco após a migration (conferir com
\dte\dvno psql) - As policies de RLS estão criadas (
\d+ customersmostra a policy) .env.exampledocumenta todas as variáveis necessáriasnpm run lintenpm run testrodam sem erro- README explica como subir o ambiente do zero