API REST com Fastify, TypeScript, Drizzle ORM e PostgreSQL (via Docker).
| Ferramenta | Versão mínima |
|---|---|
| Node.js | 20+ |
| pnpm | 9+ |
| Docker | Para o banco |
pnpm install
cp .env.example .envConteúdo padrão do .env:
DATABASE_URL=postgresql://wltech:wltech@localhost:5432/wltech
PORT=3333
HOST=0.0.0.0
JWT_SECRET=altere-para-um-segredo-forte-em-producao
JWT_EXPIRES_IN=7dO
.envnão é versionado.
pnpm docker:up| Configuração | Valor padrão |
|---|---|
| Host | localhost:5432 |
| Banco | wltech |
| Usuário/senha | wltech / wltech |
| Driver | pg |
| ORM | Drizzle |
pnpm docker:down
docker volume rm api-wltech_postgres_data 2>/dev/null || true
pnpm docker:up
pnpm db:migrate
pnpm db:seedO schema fica em src/db/schema/. As migrations SQL geradas ficam em drizzle/.
1. Altere o schema em src/db/schema/ (ex.: roles.ts, users.ts).
2. Gere a migration:
pnpm db:generate3. Aplique no banco:
pnpm db:migratepnpm db:studio| Comando | Quando usar |
|---|---|
pnpm db:generate |
Depois de mudar o schema — gera SQL em drizzle/ |
pnpm db:migrate |
Aplica migrations pendentes |
pnpm db:push |
Sincroniza schema direto no Postgres (dev) |
pnpm db:studio |
UI para inspecionar dados |
pnpm docker:up |
Sobe PostgreSQL |
pnpm docker:down |
Para PostgreSQL |
pnpm db:seed| Senha | Role | |
|---|---|---|
| admin@wltech.dev | dev123 | admin |
| manager@wltech.dev | dev123 | manager |
| user@wltech.dev | dev123 | user |
Orçamentos de exemplo (3 registros — FoodFlow, Clínica Online, Loja VIP).
Cria/atualiza tabelas e popula o seed:
pnpm setupEquivalente manual:
pnpm docker:up
pnpm db:migrate
pnpm db:seedpnpm devAPI em: http://localhost:3333
pnpm build
pnpm start| Método | Rota | Descrição |
|---|---|---|
| GET | /health |
Health check |
| GET | /roles |
Lista todas as roles |
| GET | /users |
Lista usuários com nome da role |
| GET | /budgets |
Lista orçamentos de clientes |
| POST | /budgets |
Cria solicitação de orçamento |
curl http://localhost:3333/health
curl http://localhost:3333/roles
curl http://localhost:3333/users
curl http://localhost:3333/budgets| Script | Descrição |
|---|---|
pnpm dev |
Servidor em modo watch |
pnpm build |
Compila TypeScript para dist/ |
pnpm start |
Roda dist/server.js |
pnpm setup |
docker:up + db:migrate + db:seed |
pnpm db:generate |
Gera migration a partir do schema |
pnpm db:migrate |
Executa migrations |
pnpm db:push |
Sincroniza schema no PostgreSQL |
pnpm db:seed |
Popula dados de desenvolvimento |
pnpm db:studio |
Abre Drizzle Studio |
pnpm docker:up |
Sobe PostgreSQL |
pnpm docker:down |
Para PostgreSQL |
Imports usam o alias @/ apontando para src/ (ex.: @/lib/errors/app-error.js). No build, tsc-alias reescreve os caminhos para o dist/.
.
├── docker-compose.yml # PostgreSQL
├── drizzle.config.ts
├── drizzle/ # Migrations SQL
├── .env.example
└── src/
├── server.ts
└── db/
├── index.ts
├── seed.ts
└── schema/
├── roles.ts
├── users.ts
├── budgets.ts
└── index.ts
└── routes/
├── index.ts
├── health.ts
├── roles.ts
├── users.ts
└── budgets.ts
└── lib/
└── validators/
├── brazilian-phone.ts
└── budget.ts
cp .env.example .envpnpm docker:up
pnpm db:migrate
pnpm db:seedConfirme que o container está rodando (pnpm docker:up) e que DATABASE_URL no .env usa postgresql://wltech:wltech@localhost:5432/wltech.
pnpm db:migrate
pnpm db:seed