Files
petlink_final/docs/PROGRESS.md

228 lines
9.7 KiB
Markdown

# PetLink — Registo de Progresso
## ⚡ HANDOFF — PRÓXIMA SESSÃO COMEÇA AQUI
**Estado:** Toda a camada de código está completa e compila sem erros TypeScript. Bloqueado na migração da base de dados por DATABASE_URL de placeholder.
**Próxima tarefa:** Configurar DATABASE_URL real do Supabase → correr `npx prisma migrate dev --name init` → correr seed → testar fluxo de registo e login
**Ficheiro relevante:** `.env.local` — substituir `DATABASE_URL` pelo valor real de: https://supabase.com/dashboard → Settings → Database → Connection string → URI (Transaction pooler)
**Credenciais em falta:** `DATABASE_URL` real do Supabase (actualmente tem placeholder `postgresql://user:password@host:5432/pawlink`)
**Atenção:** Prisma v7 + pnpm requer `output = "../node_modules/.prisma/client"` no schema (já configurado). NextAuth v5 usa `lib/auth/config.ts` (não `pages/api/auth`). Zod v4 usa `error:` em vez de `required_error:` e `errorMap:`.
---
## Estado Geral
- **Fase actual:** Fase 1 — MVP
- **Última actualização:** 2026-05-21 09:57
- **Sessão #:** 3
---
## Legenda de Estados
- ✅ Concluído e testado
- 🔄 Em progresso
- ⏳ Por fazer
- ❌ Bloqueado — indicar motivo
- ⚠️ Feito com mock — substituir quando credencial disponível
---
## ⚠️ Credenciais Necessárias
| Credencial | Variável | Desbloqueia | Estado |
|---|---|---|---|
| Supabase DB | `DATABASE_URL` | Migrações + seed + dados reais | ❌ Placeholder — configurar em supabase.com |
| NextAuth | `NEXTAUTH_SECRET` | Autenticação funcional | ✅ Configurado |
| Stripe | `STRIPE_SECRET_KEY` etc. | Pagamentos | ✅ Configurado |
| Resend | `RESEND_API_KEY` | Envio de emails reais | ✅ Configurado |
| Anthropic | `ANTHROPIC_API_KEY` | IA funcional | ✅ Configurado |
| Supabase Storage | `NEXT_PUBLIC_SUPABASE_URL` etc. | Upload de imagens | ✅ Configurado |
| Upstash Redis | `UPSTASH_REDIS_REST_URL` etc. | Rate limiting | ✅ Configurado |
---
## Fase 1 — MVP
### Infra-estrutura e Configuração
- ✅ Setup Next.js + TypeScript + Tailwind + shadcn/ui
- ✅ Configuração ESLint + Prettier + Husky + lint-staged
- ✅ Esquema Prisma completo (`prisma/schema.prisma`)
-`prisma.config.ts` com output canónico para pnpm
- ❌ Migrações Supabase (`DATABASE_URL` real necessária)
- ❌ Seed de dados de desenvolvimento (idem)
- ✅ Ficheiro `.env.example` com todas as variáveis
- ⏳ Deploy inicial Vercel + domínio
### Autenticação
- ✅ Configuração NextAuth v5 + Prisma adapter (`lib/auth/config.ts`)
- ✅ Route handler (`app/api/auth/[...nextauth]/route.ts`)
- ✅ Registo: nome, email, password, birthdate, distrito (`app/api/auth/register/route.ts`)
- ✅ Validação de +18 anos no servidor (`lib/auth/age-validation.ts`)
- ✅ Hash de password com bcrypt custo 12 (`lib/auth/password.ts`)
- ⚠️ Verificação de email — template pronto, envio activo mas Resend sem domínio verificado
- ✅ Login por email + password (`app/auth/login/page.tsx`)
- ✅ Página de registo (`app/auth/register/page.tsx`)
- ✅ Recuperação de palavra-passe — página feita (`app/auth/forgot-password/page.tsx`), API TODO
- ✅ Middleware de protecção de rotas (`middleware.ts`)
- ✅ Controlo de acesso por roles (USER, SHELTER_ADMIN, ADMIN)
### Validações (Zod v4)
-`lib/validations/auth.ts` — login, register, forgot/reset password
-`lib/validations/animal.ts` — filtros, create, update
-`lib/validations/reservation.ts` — create, update
-`lib/validations/donation.ts` — discriminated union (MONETARY, FOOD, TOYS)
### Base de Dados
-`lib/db/prisma.ts` — singleton com hot-reload safe
### Email
-`lib/email/index.ts` — wrapper Resend + templates HTML (reserva + boas-vindas)
### Canis
- ⏳ Registo de canis (admin)
- ✅ Perfil público — listagem (`app/main/shelters/page.tsx`)
- ✅ API GET /api/shelters com filtros
- ✅ API GET /api/shelters/[id]
- ✅ Dashboard base do canil (`app/shelter/dashboard/page.tsx`)
- ✅ Layout do painel de canil (`app/shelter/layout.tsx`)
### Animais
- ⏳ CRUD de animais pelo canil (UI)
- ⏳ Upload de fotos (Supabase Storage)
- ✅ API GET /api/animals com filtros, paginação, urgência
- ✅ API GET /api/animals/[id]
- ✅ Página inicial — listagem com mock data (`app/page.tsx`)
- ✅ Sistema de filtros — chips horizontais (`components/animals/FilterChips.tsx`)
- ✅ Ficha detalhada do animal (`app/main/animals/[id]/page.tsx`)
- ✅ Animal card com badge urgente (`components/animals/AnimalCard.tsx`)
### Reservas
- ✅ API POST /api/reservations — cria em transacção + actualiza animal + envia email
- ✅ API PATCH /api/reservations/[id] — CONFIRMED/CANCELLED/COMPLETED com estados do animal
- ✅ API GET /api/reservations — histórico do utilizador
- ⏳ UI de criação de reserva no detalhe do animal
### Utilizadores
- ✅ API GET /api/users/me — perfil com contagens
- ✅ API PATCH /api/users/me — actualizar nome e distrito
- ✅ Área de conta (`app/main/account/page.tsx`)
### UI / UX
- ✅ Design system completo (`app/globals.css`) — paleta Editorial Orgânico
- ✅ Fontes: Playfair Display + Lora + Fragment Mono (`app/layout.tsx`)
- ✅ Header minimalista com hambúrguer animado (`components/layout/Header.tsx`)
- ✅ Side menu com overlay (`components/layout/SideMenu.tsx`)
- ✅ Toggle modo escuro / claro + persistência
- ✅ Footer (`components/layout/Footer.tsx`)
- ✅ Design responsivo mobile-first
---
## Fase 2 — Doações (Por iniciar)
- ⏳ Integração Stripe + Payment Element
- ⏳ Suporte MBWay
- ⏳ Fluxo doação monetária
- ⏳ Webhook Stripe + confirmação
- ⏳ Fluxo doação de ração
- ⏳ Fluxo doação de brinquedos
- ⏳ Sistema de necessidades dos canis (ShelterNeed)
- ⏳ Email recibo de doação
- ⏳ Histórico de doações na conta
---
## Fase 3 — IA e Comunidade (Por iniciar)
- ⏳ Match inteligente (Claude API)
- ⏳ Chatbot Paws — suporte com streaming
- ⏳ Geração automática de descrições de animais
---
## Fase 4 — Escala (Por iniciar)
- ⏳ App móvel React Native
- ⏳ Dashboard analítico
- ⏳ API pública
---
## Decisões Técnicas Tomadas
| Data | Decisão | Motivo |
|---|---|---|
| 2026-05-21 | Prisma v7 requer `output` explícito no schema com pnpm | pnpm cria dois peers de @prisma/client; sem output explícito o gerador escreve para o peer errado |
| 2026-05-21 | Zod v4: `required_error` → remover, `errorMap``error` | Breaking change do Zod v4 |
| 2026-05-21 | NextAuth v5: config em `lib/auth/config.ts` exporta `handlers, auth, signIn, signOut` | API do NextAuth v5 beta |
| 2026-05-21 | Emails com HTML inline em vez de react-email | react-email requer render server-side separado; HTML inline funciona directamente com Resend |
---
## Problemas Conhecidos / Bloqueios
| # | Descrição | Estado | Sessão |
|---|---|---|---|
| 1 | DATABASE_URL é placeholder — migrações bloqueadas | ❌ Aguarda credencial real | 3 |
| 2 | `app/main/donations/route.ts` — não criado | ⏳ Fase 2 | — |
---
## Dependências Externas
| Serviço | Estado | Notas |
|---|---|---|
| Supabase (PostgreSQL) | ❌ URL placeholder | Configurar em supabase.com → Settings → DB |
| Supabase Storage | ✅ Configurado | Upload de fotos ainda não implementado na UI |
| Vercel | ⏳ Por configurar | — |
| Stripe | ✅ Configurado | Integração Fase 2 |
| Resend | ✅ Configurado | Verificar domínio @petlink.pt |
| Anthropic Claude API | ✅ Configurado | Integração Fase 3 |
| Upstash Redis | ✅ Configurado | Rate limiting ainda não implementado |
| Cloudflare | ⏳ Por configurar | — |
---
## Histórico de Sessões
### Sessão #3 — 2026-05-21
**Trabalho realizado:** Implementação de toda a camada lib/ (db, auth, email, validations), NextAuth v5, todas as API routes, middleware de protecção, páginas de auth (login, registo, forgot-password), área de conta, dashboard de canil, listagem de canis, correção Prisma v7 + pnpm.
**Ficheiros criados/modificados:**
- `lib/db/prisma.ts` — singleton Prisma
- `lib/auth/age-validation.ts` — validação +18
- `lib/auth/password.ts` — bcrypt hash/verify
- `lib/auth/config.ts` — NextAuth v5 config
- `lib/validations/auth.ts` — schemas Zod v4
- `lib/validations/animal.ts` — schemas Zod v4
- `lib/validations/reservation.ts` — schemas Zod v4
- `lib/validations/donation.ts` — schemas Zod v4
- `lib/email/index.ts` — wrapper Resend + templates HTML
- `app/api/auth/[...nextauth]/route.ts` — NextAuth handler
- `app/api/auth/register/route.ts` — POST registo
- `app/api/animals/route.ts` — GET lista
- `app/api/animals/[id]/route.ts` — GET detalhe
- `app/api/shelters/route.ts` — GET lista
- `app/api/shelters/[id]/route.ts` — GET detalhe
- `app/api/reservations/route.ts` — POST + GET
- `app/api/reservations/[id]/route.ts` — PATCH
- `app/api/users/me/route.ts` — GET + PATCH
- `middleware.ts` — protecção de rotas
- `app/auth/register/page.tsx` — página de registo
- `app/auth/forgot-password/page.tsx` — recuperação de password
- `app/main/account/page.tsx` — área de conta
- `app/main/shelters/page.tsx` — listagem de canis
- `app/shelter/dashboard/page.tsx` — dashboard canil
- `app/shelter/layout.tsx` — layout painel canil
- `prisma/schema.prisma` — output explícito para pnpm
**Próximos passos:**
1. Configurar `DATABASE_URL` real → https://supabase.com/dashboard → Settings → Database → URI
2. Correr `npx prisma migrate dev --name init`
3. Criar seed (`prisma/seed.ts`) com dados de demonstração
4. Testar fluxo registo → login → reserva → email
5. Implementar UI de criação de reserva no detalhe do animal
6. Fase 2: integração Stripe para doações monetárias
**Notas:** Zero erros TypeScript. Prisma v7 com pnpm requer `output = "../node_modules/.prisma/client"` no schema.