# Fullstack Cometageek3d

> 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.

- Skill: `valentierro/fullstack-cometageek3d` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add valentierro/fullstack-cometageek3d`
- Raw SKILL.md: https://api.skillmd.com/api/skills/valentierro/fullstack-cometageek3d/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: valentierro (https://skillmd.com/u/valentierro)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/valentierro/fullstack-cometageek3d

---


# 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

```ts
brand.orange: #ff8a3d
brand.gold:   #ffb454
brand.teal:   #2fb5c4
```

Fontes: Plus Jakarta Sans (body), Outfit (heading). Utility: `cn()` de `@/lib/utils`.

## Regras obrigatórias

1. **Lógica em `src/lib/`** — orders, products, mercadopago, melhor-envio, etc.
2. **Respeitar layout groups** — `(store)`, `(auth)`, `painel`, `admin` + shells existentes.
3. **Imports `@/`** e classes Tailwind do tema (`geek-*`, `brand-*`, `surface-*`, `dark:`).
4. **3D preview = `ProductModelViewer`** com `<model-viewer>`. Compressão GLB só via `glb-compress.ts`.
5. **Snapshot no checkout** — preços/nomes/endereços gravados em `Order`/`OrderItem`, nunca reler preço vivo.
6. **Env via `src/lib/env.ts`** — não ler `process.env` solto na UI.
7. **Uploads** — imagens ≤5 MB, modelos ≤20 MB input / ≤10 MB pós-compressão (`storage.ts`).
8. **Copy pt-BR**, moeda BRL via `formatCurrency()`.
9. **Schema** — editar `prisma/schema.prisma` + `npm run db:push` + `db:generate`.
10. **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

```bash
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](reference.md).

