Files
petlink_final/docs/PROGRESS.md

9.7 KiB

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