116 lines
4.6 KiB
Markdown
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
|