Files
2026-08-14 17:35:24 -03:00

116 lines
4.6 KiB
Markdown

# 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
1. **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 endpoint
`GET /health` que 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.example` documentando todas as chaves necessárias.
2. **Docker Compose**
- Criar `docker-compose.yml` com os serviços:
- `app` (build a partir de um `Dockerfile` multi-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 perfil `dev`) com hot-reload
do backend para desenvolvimento local.
- Garantir que `docker compose up` sobe tudo e a API responde em
`GET /health` com status 200.
3. **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 SECURITY` e as `CREATE POLICY`
definidos no schema, via uma migration SQL raw do Prisma (Prisma não
suporta RLS nativamente, então usar `prisma migrate dev` seguido de
uma migration manual `.sql` para 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.sql` fornecido separadamente — use-o como
fonte de verdade).
4. **Scripts utilitários**
- `package.json` com scripts: `dev`, `build`, `start:prod`,
`lint`, `test`, `prisma:migrate`, `prisma:generate`, `prisma:studio`.
- `README.md` inicial explicando como subir o projeto localmente
(`docker compose up`, variáveis de ambiente necessárias, como rodar
migrations).
5. **Testes**
- Configurar Jest (já vem com NestJS) e criar um teste simples do
endpoint `/health`.
## 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 up` sobe `app`, `postgres` e `redis` sem erro
- [ ] `GET /health` retorna 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 `\dt` e `\dv` no psql)
- [ ] As policies de RLS estão criadas (`\d+ customers` mostra a policy)
- [ ] `.env.example` documenta todas as variáveis necessárias
- [ ] `npm run lint` e `npm run test` rodam sem erro
- [ ] README explica como subir o ambiente do zero