Full-Stack — Cometa Geek 3D
E-commerce brasileiro de impressão 3D sob encomenda. Repo: valentierro/cometageek3d.
Stack
| Camada |
Tecnologia |
| Framework |
Next.js 14 App Router, React 18, TypeScript |
| DB |
PostgreSQL + Prisma 6 (db push, sem migrations) |
| Auth |
Auth.js v5 beta, Credentials, JWT, bcrypt, roles ADMIN / CUSTOMER |
| Pagamentos |
Mercado Pago Checkout Pro (Pix + cartão) |
| Frete |
Melhor Envio OAuth + API (PAC/SEDEX) |
| Storage |
Vercel Blob (prod) / public/uploads + public/models (dev) |
| 3D preview |
Google <model-viewer> — não Three.js/R3F |
| 3D server |
@gltf-transform + Draco via compressGlb() |
| Email |
Hostinger SMTP (nodemailer) ou Resend |
| Styling |
Tailwind 3, dark mode class, tokens brand-* / surface-* |
| Testes |
Vitest (src/lib/__tests__/) |
| Deploy |
Vercel + cron |
Estrutura App Router
src/app/
├── (store)/ # Loja pública (SiteShell)
├── (auth)/ # entrar, cadastro, reset senha
├── painel/ # Área do cliente
└── admin/ # Backoffice
Lógica de negócio em src/lib/ — rotas API delegam, não embutem regras.
Cores e tipografia
brand.orange: #ff8a3d
brand.gold: #ffb454
brand.teal: #2fb5c4
Fontes: Plus Jakarta Sans (body), Outfit (heading). Utility: cn() de @/lib/utils.
Regras obrigatórias
- Lógica em
src/lib/ — orders, products, mercadopago, melhor-envio, etc.
- Respeitar layout groups —
(store), (auth), painel, admin + shells existentes.
- Imports
@/ e classes Tailwind do tema (geek-*, brand-*, surface-*, dark:).
- 3D preview =
ProductModelViewer com <model-viewer>. Compressão GLB só via glb-compress.ts.
- Snapshot no checkout — preços/nomes/endereços gravados em
Order/OrderItem, nunca reler preço vivo.
- Env via
src/lib/env.ts — não ler process.env solto na UI.
- Uploads — imagens ≤5 MB, modelos ≤20 MB input / ≤10 MB pós-compressão (
storage.ts).
- Copy pt-BR, moeda BRL via
formatCurrency().
- Schema — editar
prisma/schema.prisma + npm run db:push + db:generate.
- Auth —
requireAdmin() / requireCustomer(); middleware protege /admin, /painel.
Fluxos críticos
- Checkout:
/api/checkout → lib/orders.ts → Mercado Pago → webhook /api/webhooks/mercadopago
- Frete: Melhor Envio OAuth em admin → cotação no checkout → webhook envio
- Admin produto: upload imagem + GLB → compress →
Product.modelUrl
Scripts úteis
npm run dev # unset DATABASE_URL + polling
npm run build && npm run lint && npm run test
npm run db:push && npm run db:seed
Arquivos de referência
| Arquivo |
Conteúdo |
prisma/schema.prisma |
Modelo de dados |
src/lib/orders.ts |
Checkout/pedidos |
src/lib/mercadopago.ts |
Pagamentos |
src/lib/melhor-envio/ |
Frete |
src/components/product/ProductModelViewer.tsx |
Preview 3D |
src/lib/constants.ts |
Site, nav, brand |
.env.example |
Variáveis completas |
Para detalhes de env e integrações, ver reference.md.
1---2name: fullstack-cometageek3d3description: Full-stack development for Cometa Geek 3D e-commerce (Next.js 14, Prisma, Auth.js, Mercado Pago, Melhor Envio, model-viewer). Use when building or maintaining cometageek3d, geek 3D printing shop features, checkout, admin, or the valentierro/cometageek3d repository.4---56# Full-Stack — Cometa Geek 3D78E-commerce brasileiro de impressão 3D sob encomenda. Repo: `valentierro/cometageek3d`.910## Stack1112| Camada | Tecnologia |13|--------|------------|14| Framework | Next.js 14 App Router, React 18, TypeScript |15| DB | PostgreSQL + Prisma 6 (`db push`, sem migrations) |16| Auth | Auth.js v5 beta, Credentials, JWT, bcrypt, roles `ADMIN` / `CUSTOMER` |17| Pagamentos | Mercado Pago Checkout Pro (Pix + cartão) |18| Frete | Melhor Envio OAuth + API (PAC/SEDEX) |19| Storage | Vercel Blob (prod) / `public/uploads` + `public/models` (dev) |20| 3D preview | Google `<model-viewer>` — **não** Three.js/R3F |21| 3D server | `@gltf-transform` + Draco via `compressGlb()` |22| Email | Hostinger SMTP (nodemailer) ou Resend |23| Styling | Tailwind 3, dark mode `class`, tokens `brand-*` / `surface-*` |24| Testes | Vitest (`src/lib/__tests__/`) |25| Deploy | Vercel + cron |2627## Estrutura App Router2829```30src/app/31├── (store)/ # Loja pública (SiteShell)32├── (auth)/ # entrar, cadastro, reset senha33├── painel/ # Área do cliente34└── admin/ # Backoffice35```3637Lógica de negócio em `src/lib/` — rotas API delegam, não embutem regras.3839## Cores e tipografia4041```ts42brand.orange: #ff8a3d43brand.gold: #ffb45444brand.teal: #2fb5c445```4647Fontes: Plus Jakarta Sans (body), Outfit (heading). Utility: `cn()` de `@/lib/utils`.4849## Regras obrigatórias50511. **Lógica em `src/lib/`** — orders, products, mercadopago, melhor-envio, etc.522. **Respeitar layout groups** — `(store)`, `(auth)`, `painel`, `admin` + shells existentes.533. **Imports `@/`** e classes Tailwind do tema (`geek-*`, `brand-*`, `surface-*`, `dark:`).544. **3D preview = `ProductModelViewer`** com `<model-viewer>`. Compressão GLB só via `glb-compress.ts`.555. **Snapshot no checkout** — preços/nomes/endereços gravados em `Order`/`OrderItem`, nunca reler preço vivo.566. **Env via `src/lib/env.ts`** — não ler `process.env` solto na UI.577. **Uploads** — imagens ≤5 MB, modelos ≤20 MB input / ≤10 MB pós-compressão (`storage.ts`).588. **Copy pt-BR**, moeda BRL via `formatCurrency()`.599. **Schema** — editar `prisma/schema.prisma` + `npm run db:push` + `db:generate`.6010. **Auth** — `requireAdmin()` / `requireCustomer()`; middleware protege `/admin`, `/painel`.6162## Fluxos críticos6364- **Checkout:** `/api/checkout` → `lib/orders.ts` → Mercado Pago → webhook `/api/webhooks/mercadopago`65- **Frete:** Melhor Envio OAuth em admin → cotação no checkout → webhook envio66- **Admin produto:** upload imagem + GLB → compress → `Product.modelUrl`6768## Scripts úteis6970```bash71npm run dev # unset DATABASE_URL + polling72npm run build && npm run lint && npm run test73npm run db:push && npm run db:seed74```7576## Arquivos de referência7778| Arquivo | Conteúdo |79|---------|----------|80| `prisma/schema.prisma` | Modelo de dados |81| `src/lib/orders.ts` | Checkout/pedidos |82| `src/lib/mercadopago.ts` | Pagamentos |83| `src/lib/melhor-envio/` | Frete |84| `src/components/product/ProductModelViewer.tsx` | Preview 3D |85| `src/lib/constants.ts` | Site, nav, brand |86| `.env.example` | Variáveis completas |8788Para detalhes de env e integrações, ver [reference.md](reference.md).