E-commerce full-stack de produtos de tecnologia. Loja dark, moderna e rápida.
- Frontend: Next.js 14 (App Router) + Tailwind CSS + Zustand + React Query + framer-motion
- Backend: Node.js + Fastify + Knex + JWT (access + refresh com rotação)
- Banco: PostgreSQL 16
- Infra: Docker Compose (um comando sobe tudo)
docker compose up --buildServiços disponíveis após subir:
| Serviço | URL | Descrição |
|---|---|---|
| Frontend | http://localhost:3000 | Loja |
| Backend | http://localhost:4000 | API (health em /api/health) |
| Postgres | localhost:5432 | Banco de dados |
| Mailpit UI | http://localhost:8025 | Caixa de entrada do e-mail mockado |
Na primeira inicialização, migrations e seed rodam automaticamente.
| Papel | Senha | |
|---|---|---|
| Admin | admin@techstore.com | Admin@123 |
| Cliente | cliente@techstore.com | Cliente@123 |
Formas de pagamento (mock):
- Cartão de crédito: número terminado em
1000a1999→ aprovado. Qualquer outro final válido → recusado. - PIX: gera um QR code com expiração de 15 minutos; a confirmação é simulada via endpoint de simulação.
docker compose exec backend npm test.
├── docker-compose.yml
├── .env.example
├── backend/ # API Fastify + Knex
│ ├── src/
│ │ ├── modules/ # auth, products, orders, payments, admin, email, cep
│ │ ├── middleware/ # auth (JWT), requireRole, rateLimit
│ │ ├── schemas/ # validação Zod (frontend e backend)
│ │ └── plugins/ # knex, errors, swagger
│ ├── migrations/
│ └── seeds/
└── frontend/ # Next.js App Router
└── src/
└── app/ # (store) e (admin)
Veja .env.example. Em produção, troque todos os segredos.
# Logs
docker compose logs -f backend frontend
# Recriar o banco do zero
docker compose down -v && docker compose up --buildDecisões importantes documentadas inline no código e na seção "Resumo" entregue ao final. Pontos-chave: cookies httpOnly+SameSite em vez de localStorage; rotação de refresh tokens com detecção de reuso; rate limiting em login/checkout; validação Zod compartilhada; erros normalizados com handler centralizado; autorização por papel em todas as rotas protegidas.