228 lines
9.7 KiB
Markdown
228 lines
9.7 KiB
Markdown
# 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.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 @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 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.
|