API REST para gerenciamento de produtos, mesas, sessões de mesa e pedidos em um restaurante.
Stack: Node.js, Express 5, TypeScript, PostgreSQL, Knex, Zod, Swagger UI.
- Node.js definido em
.nvmrc(lts/krypton) - npm
- PostgreSQL acessível por connection string
- nvm recomendado para usar a versão correta do Node.js
nvm install && nvm use
npm install
cp .env.example .envConfigure a variável DATABASE_URL no .env:
DATABASE_URL=postgresql://user:password@host/database?sslmode=requireO projeto está configurado para PostgreSQL com SSL (ex: NeonDB). Para banco local sem SSL, ajuste o knexfile.ts.
npm run knex -- migrate:latest # cria as tabelas
npm run knex -- seed:run # insere produtos e mesas para testes
npm run knex -- migrate:rollback # desfaz a última migrationnpm run dev| Recurso | URL |
|---|---|
| API | http://localhost:3333 |
| Swagger UI | http://localhost:3333/swagger |
| Health check | GET http://localhost:3333/health/db |
GET /health/dbGET /products
GET /products?name=pizza
POST /products
PUT /products/:id
DELETE /products/:idRegras:
namemínimo 5 caracteres, único (case-insensitive)pricemaior que zero
GET /tablesGET /tables-sessions
GET /tables-sessions?status=open
GET /tables-sessions?status=closed&limit=10
POST /tables-sessions
PATCH /tables-sessions/:idRegras:
- Uma mesa só pode ter uma sessão aberta por vez
- Sessão já encerrada não pode ser encerrada novamente
status:openouclosed—limit: máximo 100, padrão 50
POST /orders
GET /orders/table-session/:table_session_id
GET /orders/table-session/:table_session_id/totalRegras:
- A sessão de mesa precisa existir e estar aberta
- O produto precisa existir
unit_priceé capturado no momento do pedido — mudanças futuras no preço do produto não afetam pedidos já criados
Resposta do total:
{
"total_amount": "59.80",
"total_items": "2"
}npm run knex -- migrate:latest && npm run knex -- seed:runnpm run devGET /health/db— confirma conexão com bancoGET /tables— escolhe uma mesaPOST /tables-sessions— abre sessão para a mesaGET /products— lista produtos disponíveisPOST /orders— registra pedidosGET /orders/table-session/:id/total— consulta contaPATCH /tables-sessions/:id— encerra sessão
src/
server.ts # Express, Swagger, rotas, middleware de erro
routes/ # Endpoints e mapeamento para controllers
controllers/ # Validação HTTP (Zod) + chamada ao service
services/ # Regras de negócio e AppError
schemas/ # Schemas Zod por domínio
database/
knex.ts # Instância Knex
migrations/ # Migrations com timestamp
seeds/ # Dados iniciais de desenvolvimento
types/ # Tipos TypeScript das tabelas (*Row, *Insert)
middlewares/ # Tratamento centralizado de erros
utils/ # AppError, constantes Swagger
docs/swagger/ # Documento OpenAPI e paths por domínio
Disponível em http://localhost:3333/swagger após subir o servidor.
Ao alterar rotas, schemas ou respostas, atualize os arquivos em src/docs/swagger/paths/.
O projeto usa a arquitetura Controllers → Services → Knex de forma intencional, sem uma camada de repositories entre services e banco.
Repositories fariam sentido se:
- O ORM/query builder pudesse ser trocado (Knex já é a abstração sobre SQL)
- Houvesse uma suite de testes unitários que precisasse mockar o banco
- Os domínios fossem complexos o suficiente para justificar agregados com múltiplas tabelas
Neste projeto, os repositories seriam wrappers finos em torno do Knex sem lógica própria, adicionando arquivos e indireção sem benefício real. As queries PostgreSQL-específicas (RETURNING *, whereRaw, COALESCE) quebrariam de qualquer forma em uma eventual troca de banco. Quando testes forem introduzidos, a camada de repositories pode ser adicionada para viabilizar mocks.
- Adicionar script de
buildpara validar compilação TypeScript - Adicionar script de
testcom cobertura de regras de negócio nos services - Adicionar script de
lintpara padronizar o código - Criar ambiente Docker para PostgreSQL local
- Avaliar autenticação e autorização antes de expor rotas administrativas