Modelo: a loja recebe produtos via WhatsApp de lojas físicas; alta rotatividade; o site não garante estoque.
- Subir Postgres
docker compose up -d
- Variáveis de ambiente
cp .env.example .env- Ajuste
ADMIN_API_KEY(e, quando for integrar, credenciais do WhatsApp/MP)
- Banco + Prisma
npm run db:pushnpm run db:studio
- Rodar apps
npm run dev
- API health:
GET /health - Produto:
GET /api/products/:slug - Criar pedido:
POST /api/orders - Webhook WhatsApp:
GET|POST /api/webhooks/whatsapp - Admin (header
x-admin-key):POST /api/admin/productsGET /api/admin/ordersGET /api/admin/orders/:orderIdPOST /api/admin/orders/:orderId/confirmPOST /api/admin/orders/:orderId/cancel
- Arquitetura: docs/architecture.md
- Modelagem do banco: docs/database.md
- Fluxo de estados: docs/order-flow.md
- Boas práticas UX (venda sob consulta): docs/ux.md
Para trocar os placeholders por fotos reais (e testar melhor a dinâmica do carrossel), basta adicionar imagens em:
apps/web/public/product-images/
Use o mesmo nome do slug do produto/story. Exemplos:
apps/web/public/product-images/vestido-verde.jpgapps/web/public/product-images/vestido-verde.pngapps/web/public/product-images/vestido-verde.webp
O endpoint GET /api/product-image?slug=... vai automaticamente usar a foto real se existir; se não existir, ele cai no SVG gerado.
Se você quiser gerar imagens automaticamente (para apresentar e testar o carrossel), use o script:
- Configure no
.env(raiz):OPENAI_API_KEY(e opcionalmenteOPENAI_IMAGE_MODEL,OPENAI_IMAGE_SIZE) - Rode:
node scripts/generate-product-images.mjs
Ele busca os produtos no banco e salva arquivos em apps/web/public/product-images/<slug>.png.