Uma API RESTful para uma loja online de suplementos, construΓda com Node.js, TypeScript e Express. Possui autenticaΓ§Γ£o de usuΓ‘rios, gerenciamento de produtos, processamento de pagamentos via Pix com Woovi, hospedagem de imagens via ImgBB, cache com Redis e observabilidade completa com logs estruturados e mΓ©tricas Prometheus.
- VisΓ£o Geral
- Arquitetura
- Stack TecnolΓ³gica
- Estrutura do Projeto
- Endpoints da API
- VariΓ‘veis de Ambiente
- Executando o Projeto
- Executando os Testes
A API da Loja de Suplementos permite que clientes naveguem e comprem suplementos via pagamentos Pix, enquanto administradores gerenciam o catΓ‘logo de produtos. O status do pagamento Γ© atualizado automaticamente via webhooks da Woovi. O sistema utiliza Redis para cachear respostas paginadas de produtos e pedidos, reduzindo a carga no banco de dados.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Cliente β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β HTTP
ββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Servidor Express β
β ββββββββββββββββ βββββββββββββ ββββββββββββββββββββ β
β β Rate Limiter β β Helmet β β logs pino-http β β
β ββββββββββββββββ βββββββββββββ ββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Rotas β β
β β /api/auth /api/supplements /api/payment β β
β ββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β Middlewares β β
β β AuthMiddleware Β· RoleMiddleware Β· Validate(Zod) β β
β ββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β Controllers β β
β ββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β Services β β
β ββββββββ¬βββββββββββββββββββββββββ¬ββββββββββββββββββββ β
β β β β
β ββββββββΌβββββββ βββββββββΌβββββββ β
β β MongoDB β β Redis Cache β β
β β (Mongoose) β β (Upstash) β β
β βββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
ββββββββββΌβββββββββ ββββββββββΌβββββββββ
β ImgBB (imagens)β β Woovi (Pix) β
βββββββββββββββββββ βββββββββββββββββββ
- A requisiΓ§Γ£o passa pelo rate limiter global e pelos middlewares de seguranΓ§a (Helmet, CORS)
- Middlewares especΓficos de rota sΓ£o aplicados: autenticaΓ§Γ£o JWT, verificaΓ§Γ£o de papel (role) e validaΓ§Γ£o com Zod
- O controller delega ao serviΓ§o correspondente
- Os serviΓ§os interagem com MongoDB, cache Redis e APIs externas (ImgBB, Woovi)
- Erros sobem atΓ© o handler global de erros, que responde com JSON estruturado usando
AppError
- Respostas de
GET /supplementssΓ£o cacheadas por 60 segundos com a chavesupplements:{page}:{limit} - Respostas de
GET /order/*sΓ£o cacheadas por 30 segundos com as chavesorders:user:{id}:{page}:{limit}eorders:admin:{page}:{limit} - O cache Γ© invalidado em operaΓ§Γ΅es de escrita (criar/deletar/atualizar suplemento, novo pedido de pagamento)
POST /api/payment
β
βΌ
Busca suplementos e calcula o total
β
βΌ
POST para a API da Woovi β obtΓ©m QR Code + brCode
β
βΌ
Salva o Pedido (isPaid: false)
β
βΌ
Retorna o QR Code ao cliente
β
βΌ (assΓncrono, via webhook)
POST /api/payment/webhook (Woovi)
β
βΌ
Encontra o Pedido pelo correlationID β define isPaid: true
| Camada | Tecnologia |
|---|---|
| Runtime | Node.js + TypeScript |
| Framework | Express |
| Banco de Dados | MongoDB (Mongoose + mongoose-paginate-v2) |
| Cache | Redis (Upstash) |
| AutenticaΓ§Γ£o | JWT (jsonwebtoken) + bcryptjs |
| ValidaΓ§Γ£o | Zod |
| Upload de Arquivos | Multer + ImgBB API |
| Pagamentos | Woovi (Open Pix) |
| Logging | Pino + pino-pretty (dev) / pino file transport (prod) |
| MΓ©tricas | Prometheus (prom-client) |
| SeguranΓ§a | Helmet + CORS + express-rate-limit |
| Testes | Jest |
src/
βββ controllers/
β βββ auth/
β β βββ LoginController.ts
β β βββ RegisterController.ts
β βββ payments/
β β βββ PaymentsController.ts
β βββ supplements/
β βββ SupplementsController.ts
β
βββ services/
β βββ ConvertImages.ts
β βββ CreatePaymentService.ts
β βββ CreateSupplement.ts
β βββ CreateUser.ts
β βββ DeleteSupplementService.ts
β βββ GetOrdersService.ts
β βββ GetSupplementsService.ts
β βββ UpdateSupplementService.ts
β βββ ValidateUser.ts
β
βββ models/
β βββ Order.ts
β βββ Supplement.ts
β βββ User.ts
β
βββ middlewares/
β βββ AuthMiddleware.ts
β βββ RateLimiter.ts
β βββ RoleMiddleware.ts
β βββ ValidateMiddleware.ts
β
βββ routes/
β βββ authRoutes.ts
β βββ paymentsRoutes.ts
β βββ supplementsRoutes.ts
β
βββ validators/
β βββ auth.validator.ts
β βββ payments.validator.ts
β βββ supplements.validator.ts
β
βββ db/
β βββ connectToDB.ts
β
βββ lib/
β βββ cache.ts
β
βββ observability/
β βββ logger.ts
β
βββ utils/
β βββ AppError.ts
β
βββ server.ts
| MΓ©todo | Caminho | Auth | DescriΓ§Γ£o |
|---|---|---|---|
POST |
/register |
β | Registrar um novo usuΓ‘rio |
POST |
/login |
β | Fazer login e receber um token JWT |
POST /register β Body
{
"username": "joaosilva",
"email": "joao@exemplo.com",
"password": "senha123"
}POST /login β Body
{
"email": "joao@exemplo.com",
"password": "senha123"
}| MΓ©todo | Caminho | Auth | Papel | DescriΓ§Γ£o |
|---|---|---|---|---|
GET |
/supplements |
β | β | Listar suplementos (paginado) |
POST |
/supplements |
β JWT | admin | Adicionar um novo suplemento com imagens |
PATCH |
/supplements/:id |
β JWT | admin | Atualizar um suplemento |
DELETE |
/supplements/:id |
β JWT | admin | Deletar um suplemento |
GET /supplements β ParΓ’metros de query
?page=1&limit=10
POST /supplements β multipart/form-data
name string
description string (mΓ‘x. 400 caracteres)
price number
image arquivo(s) (atΓ© 5)
| MΓ©todo | Caminho | Auth | Papel | DescriΓ§Γ£o |
|---|---|---|---|---|
POST |
/payment |
β JWT | customer | Criar um pagamento Pix |
POST |
/payment/webhook |
β | β | Webhook da Woovi para confirmaΓ§Γ£o de pagamento |
GET |
/order/admin |
β JWT | admin | Listar todos os pedidos (paginado) |
GET |
/order/costumer |
β JWT | β | Listar pedidos do usuΓ‘rio autenticado |
POST /payment β Body
{
"supplementsIds": ["id1", "id2"],
"addressUser": "Rua Principal, 123"
}| MΓ©todo | Caminho | DescriΓ§Γ£o |
|---|---|---|
GET |
/health |
VerificaΓ§Γ£o de saΓΊde (status do DB + uptime) |
GET |
/metrics |
MΓ©tricas do Prometheus |
Crie um arquivo .env na raiz do projeto:
# Servidor
PORT=3000
NODE_ENV=development
# Banco de Dados
MONGODB_URI=mongodb://localhost:27017/supplements-store
# Cache
UPSTASH_REDIS_REST_URL=redis://localhost:6379
# AutenticaΓ§Γ£o
JWT_SECRET=seu_jwt_secret_aqui
# APIs Externas
IMGBB_API_KEY=sua_chave_imgbb
WOOVI_API_URL=https://api.woovi.com/api/v1/charge
WOOVI_API_KEY=sua_chave_woovi
# Logging
LOG_LEVEL=debug| VariΓ‘vel | DescriΓ§Γ£o |
|---|---|
PORT |
Porta em que o servidor escuta |
NODE_ENV |
development ou production |
MONGODB_URI |
String de conexΓ£o com o MongoDB |
UPSTASH_REDIS_REST_URL |
URL de conexΓ£o com o Redis |
JWT_SECRET |
Chave secreta para assinar tokens JWT |
IMGBB_API_KEY |
Chave de API do imgbb.com |
WOOVI_API_URL |
Endpoint de cobranΓ§a da Woovi (OpenPix) |
WOOVI_API_KEY |
Chave de autorizaΓ§Γ£o da API da Woovi |
LOG_LEVEL |
NΓvel de log do Pino (debug, info, warn, error) |
- Node.js 18+
- MongoDB
- Redis
npm installnpm run devnpm run build
npm startOs testes utilizam Jest com mock de mΓ³dulos para todas as dependΓͺncias externas (MongoDB, Redis, axios). NΓ£o sΓ£o necessΓ‘rias conexΓ΅es reais para executar a suΓte de testes.
# Executar todos os testes
npm test
# Modo watch
npm run test:watch
# RelatΓ³rio de cobertura
npm run test:coverage| Suite | O que Γ© testado |
|---|---|
ConvertImages.test.ts |
Upload no ImgBB, codificaΓ§Γ£o base64, tratamento de erros |
CreatePayment.test.ts |
CΓ‘lculo de preΓ§o, chamada Γ API da Woovi, persistΓͺncia do pedido |
CreateSupplement.test.ts |
CriaΓ§Γ£o de suplemento, salvamento no DB, tratamento de erros |
CreateUser.test.ts |
VerificaΓ§Γ£o de duplicatas, criaΓ§Γ£o de usuΓ‘rio, chamadas ao logger |