9.7 KiB
PawLink — 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.tscom output canónico para pnpm - ❌ Migrações Supabase (
DATABASE_URLreal necessária) - ❌ Seed de dados de desenvolvimento (idem)
- ✅ Ficheiro
.env.examplecom 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
- ✅
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 @pawlink.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 Prismalib/auth/age-validation.ts— validação +18lib/auth/password.ts— bcrypt hash/verifylib/auth/config.ts— NextAuth v5 configlib/validations/auth.ts— schemas Zod v4lib/validations/animal.ts— schemas Zod v4lib/validations/reservation.ts— schemas Zod v4lib/validations/donation.ts— schemas Zod v4lib/email/index.ts— wrapper Resend + templates HTMLapp/api/auth/[...nextauth]/route.ts— NextAuth handlerapp/api/auth/register/route.ts— POST registoapp/api/animals/route.ts— GET listaapp/api/animals/[id]/route.ts— GET detalheapp/api/shelters/route.ts— GET listaapp/api/shelters/[id]/route.ts— GET detalheapp/api/reservations/route.ts— POST + GETapp/api/reservations/[id]/route.ts— PATCHapp/api/users/me/route.ts— GET + PATCHmiddleware.ts— protecção de rotasapp/auth/register/page.tsx— página de registoapp/auth/forgot-password/page.tsx— recuperação de passwordapp/main/account/page.tsx— área de contaapp/main/shelters/page.tsx— listagem de canisapp/shelter/dashboard/page.tsx— dashboard canilapp/shelter/layout.tsx— layout painel canilprisma/schema.prisma— output explícito para pnpm
Próximos passos:
- Configurar
DATABASE_URLreal → https://supabase.com/dashboard → Settings → Database → URI - Correr
npx prisma migrate dev --name init - Criar seed (
prisma/seed.ts) com dados de demonstração - Testar fluxo registo → login → reserva → email
- Implementar UI de criação de reserva no detalhe do animal
- 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.