API de produtos e pedidos com autenticação JWT, documentação Swagger e uma suíte de 10 testes principais.
- Node.js 18+, TypeScript, NestJS
- PostgreSQL + Knex (sem ORMs)
- Jest com suíte enxuta (10 testes principais)
- Swagger em
/docs
- Instale dependências
npm install- Configure o
.env(use.env.examplecomo base)
Valores padrão para dev:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=backendtest
DB_USER=postgres
DB_PASSWORD=postgres
JWT_SECRET=super-secret
ADMIN_USER=admin
ADMIN_PASSWORD=admin
- Suba o banco e aplique migrations/seeds
# se já houver Postgres local rodando, pule para migrations/seeds
docker-compose up -d db
npm run migration:latest
npm run seed:run- Rode em modo dev
npm run dev
# ou produção
npm run build && npm run start:proddocker-compose up --buildExpõe a API em http://localhost:3000 e o Swagger em http://localhost:3000/docs.
npm run dev– start com reloadnpm run build/npm run start:prodnpm run migration:latest/npm run migration:rollbacknpm run seed:runnpm run test/npm run test:cov(suíte enxuta)npm run lint/npm run format
- Endpoint:
POST /auth/login - Payload:
{ "username": "admin", "password": "admin" }(ajuste conforme.env) - Resposta:
{ "access_token": "..." } - Use
Authorization: Bearer <token>em todos os endpoints de produtos/pedidos.
POST /products– cria produto{ "name": "Caderno", "category": "Papelaria", "description": "200 folhas", "price": 25.5, "stockQuantity": 100 }GET /products– listaGET /products/:id– detalhePUT /products/:id– atualizaDELETE /products/:id– remove
POST /orders– cria pedidoRegras:{ "status": "Concluído", "items": [ { "productId": "11111111-1111-1111-1111-111111111111", "quantity": 2 } ] }- Status aceitos:
Pendente(default),Concluído,Cancelado - Sempre valida estoque; se
Concluído, estoque é baixado na mesma transação. total_amounté a soma deline_total(preço congelado no momento da compra).
- Status aceitos:
GET /ordersGET /orders/:id
- Acesse
/docsapós subir a API. - Documentação inclui exemplos, tags (Auth, Products, Orders) e bearer auth configurado.
- IDs em UUID para evitar colisão entre ambientes/seeds e facilitar replicação.
- Tabelas:
products,orders,order_items(migrations emmigrations/20240424120000_init_schema.ts). - Seeds iniciais em
seeds/initial_products.ts(dois produtos prontos para testar).
- Camadas: controller → service (use-case) → repository.
- DIP: services dependem de interfaces via tokens (
PRODUCT_REPOSITORY,ORDER_REPOSITORY,TRANSACTION_MANAGER). - LSP/ISP: Repositórios in-memory e Knex implementam as mesmas interfaces; contratos focados em cada agregado.
- SRP: casos de uso separados (ex.:
CreateOrderService,UpdateProductService). - OCP: políticas extensíveis (
OrderStatusPolicy) isolam regras de status/estoque.
- Suíte reduzida com 10 testes principais cobrindo fluxo happy-path e validações centrais.
npm run testroda tudo;npm run test:covcontinua disponível, porém sem meta de cobertura total.
cp .env.example .env
docker-compose up --build # sobe db + api
# autenticar
curl -X POST http://localhost:3000/auth/login -d '{"username":"admin","password":"admin"}' -H "Content-Type: application/json"
# usar token nas chamadas seguintes- Middleware global de log (
RequestLoggerMiddleware) registramethod path -> status (ms)sem logar corpo ou credenciais. - Migrations habilitam
uuid-ossppara geração de UUID no Postgres.