Repositório de estudos de Node.js — uma jornada aula a aula, dos conceitos básicos do runtime até uma API REST com Fastify, PostgreSQL e Docker.
- Node.js + TypeScript (ESM)
- Fastify 5 — framework HTTP
- @fastify/jwt + bcrypt — autenticação com JWT e hash de senhas
- PostgreSQL 16 — banco de dados (driver
pg) - Vitest — testes automatizados
- GitHub Actions — CI (build e testes a cada push/PR)
- Docker + Docker Compose — containerização da API e do banco
| Aula | Tema | Material |
|---|---|---|
| 01 | Node.js, NPM e TypeScript — conceitos básicos e estrutura inicial do projeto | docs/lesson-1.md |
| 02 | Assíncrono: Promises, async/await, event loop, call stack e microtasks | docs/lesson-2.md |
| 03 | HTTP, REST e a primeira API em Node.js puro | docs/lesson-3.md |
| 04 | Fastify: saindo do Node.js puro | docs/lesson-4.md |
| 05 | CRUD completo, PostgreSQL, Docker e repository pattern | docs/lesson-5.md |
| 06 | Dockerização da API | docs/lesson-6.md |
| 07 | Validação, schemas do Fastify e tratamento de erros | docs/lesson-7.md |
| 08 | Autenticação com JWT e bcrypt | docs/lesson-8.md |
| 09 | Testes automatizados com Vitest | docs/lesson-9.md |
| 10 | Docker em produção: multi-stage build | docs/lesson-10.md |
| 11 | Migrations com SQL puro | docs/lesson-11.md |
| 12 | Produção: logs, request ID, health probes e graceful shutdown | docs/lesson-12.md |
| 13 | CI com GitHub Actions | docs/lesson-13.md |
| Método | Rota | Auth | Descrição |
|---|---|---|---|
| GET | /health/live |
— | Liveness probe (processo de pé) |
| GET | /health/ready |
— | Readiness probe (testa conexão com o banco) |
| POST | /auth/register |
— | Registra usuário (senha com hash bcrypt) |
| POST | /auth/login |
— | Autentica e retorna o token JWT |
| GET | /users |
🔒 | Lista usuários |
| GET | /users/:id |
🔒 | Busca usuário por id |
| POST | /users |
🔒 | Cria usuário |
| PUT | /users/:id |
🔒 | Atualiza usuário |
| DELETE | /users/:id |
🔒 | Remove usuário |
Rotas com 🔒 exigem o header Authorization: Bearer <token> (token obtido no login).
migrations/ # Migrations em SQL puro (001_..., 002_...)
src/
├── config/ # Conexão com o banco (pg)
├── controllers/ # Camada HTTP (request/response)
├── database/ # Runner de migrations
├── errors/ # Erros da aplicação (AppError)
├── repositories/ # Acesso a dados (repository pattern)
├── routes/ # Registro de rotas e schemas
├── schemas/ # Schemas de validação do Fastify
├── services/ # Regras de negócio
├── types/ # Tipos TypeScript
├── app.ts # Instância do Fastify (buildApp)
└── server.ts # Entrypoint (buildApp + listen)
tests/ # Testes (Vitest)
docker compose up --buildO compose sobe o Postgres, espera o healthcheck, roda as migrations (serviço migrate) e só então inicia a API.
- API: http://localhost:3000
- PostgreSQL:
localhost:5432(dbnode_bootcamp, user/senhapostgres)
Suba apenas o banco pelo Docker e rode a API na máquina:
docker compose up -d postgres
npm install
cp .env.example .env
npm run build
npm run migrate
npm startAs variáveis de ambiente ficam documentadas em .env.example: PORT, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD, JWT_SECRET — e opcionalmente LOG_LEVEL (padrão info).
npm test # roda a suíte uma vez
npm run test:watch # modo watchOs testes usam mocks do repository (unitários) e app.inject() do Fastify (rotas), sem precisar de banco nem servidor rodando.