feat: sessão #3 — lib (db/auth/email/validations), API routes, NextAuth v5, middleware, páginas account/shelters/shelter-dashboard, Prisma v7 fix
This commit is contained in:
224
docs/PROGRESS.md
224
docs/PROGRESS.md
@@ -2,85 +2,130 @@
|
||||
|
||||
## ⚡ HANDOFF — PRÓXIMA SESSÃO COMEÇA AQUI
|
||||
|
||||
**Estado:** Projecto Next.js criado, dependências instaladas, ferramentas configuradas e esquema Prisma definido. Parado por falta de base de dados.
|
||||
**Próxima tarefa:** Configurar Supabase e obter `DATABASE_URL` para correr migrações e seed.
|
||||
**Ficheiro relevante:** `.env.local`
|
||||
**Atenção:** O utilizador tem de fornecer a `DATABASE_URL` do Supabase para prosseguir.
|
||||
**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-04 09:49
|
||||
- **Sessão #:** 1
|
||||
- **Última actualização:** 2026-05-21 09:57
|
||||
- **Sessão #:** 3
|
||||
|
||||
---
|
||||
|
||||
## Legenda de Estados
|
||||
- ✅ Concluído
|
||||
- ✅ Concluído e testado
|
||||
- 🔄 Em progresso
|
||||
- ⏳ Por fazer
|
||||
- ❌ Bloqueado (indicar motivo)
|
||||
- ⚠️ Atenção necessária
|
||||
- ❌ 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 14 + TypeScript + Tailwind + shadcn/ui
|
||||
- ✅ Configuração ESLint + Prettier + Husky
|
||||
- 🔄 Esquema Prisma criado, falta ligação Supabase
|
||||
- ⏳ Migrações iniciais da base de dados
|
||||
- ⏳ Seed de dados de desenvolvimento
|
||||
- ✅ Configuração variáveis de ambiente (.env.example)
|
||||
- ✅ 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.js
|
||||
- ⏳ Registo de utilizador (nome, email, password, birthdate, distrito)
|
||||
- ⏳ Validação de +18 anos no servidor
|
||||
- ⏳ Verificação de email (Resend)
|
||||
- ⏳ Login por email + password
|
||||
- ⏳ Recuperação de palavra-passe
|
||||
- ⏳ Middleware de protecção de rotas
|
||||
- ⏳ Controlo de acesso por roles (USER, SHELTER_ADMIN, ADMIN)
|
||||
- ✅ 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 (painel admin)
|
||||
- ⏳ Perfil público do canil (nome, morada, horários, contacto)
|
||||
- ⏳ Painel privado do canil (dashboard base)
|
||||
- ⏳ 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 (painel do canil)
|
||||
- ⏳ CRUD de animais pelo canil (UI)
|
||||
- ⏳ Upload de fotos (Supabase Storage)
|
||||
- ⏳ Listagem pública com SSR (página inicial)
|
||||
- ⏳ Sistema de filtros (distrito, espécie, raça, sexo, esterilizado)
|
||||
- ⏳ Ficha detalhada do animal
|
||||
- ⏳ Galeria de fotos
|
||||
- ⏳ Badge de animal urgente
|
||||
- ⏳ Estado do animal (Disponível / Reservado / Adoptado)
|
||||
- ✅ 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
|
||||
- ⏳ Calendário de datas disponíveis
|
||||
- ⏳ Criação de reserva (animal → Reservado)
|
||||
- ⏳ Email de confirmação (react-email + Resend)
|
||||
- ⏳ Histórico de reservas na área de conta
|
||||
- ⏳ Confirmação/cancelamento pelo canil
|
||||
- ✅ 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
|
||||
- ⏳ Layout principal (Header, Footer)
|
||||
- ⏳ Menu lateral (3 traços, canto superior direito)
|
||||
- ⏳ Modo escuro / claro (toggle + persistência)
|
||||
- ⏳ Área de conta (definições, palavra-passe, dados)
|
||||
- ⏳ Design responsivo (mobile-first)
|
||||
- ✅ 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 (PaymentIntent + Payment Element)
|
||||
- ⏳ Integração Stripe + Payment Element
|
||||
- ⏳ Suporte MBWay
|
||||
- ⏳ Fluxo doação monetária
|
||||
- ⏳ Webhook Stripe
|
||||
- ⏳ Webhook Stripe + confirmação
|
||||
- ⏳ Fluxo doação de ração
|
||||
- ⏳ Fluxo doação de brinquedos
|
||||
- ⏳ Sistema de necessidades dos canis (ShelterNeed)
|
||||
@@ -90,72 +135,93 @@
|
||||
---
|
||||
|
||||
## Fase 3 — IA e Comunidade (Por iniciar)
|
||||
|
||||
- ⏳ Match inteligente (Claude API)
|
||||
- ⏳ Chatbot de suporte Paws (streaming)
|
||||
- ⏳ Chatbot Paws — suporte com streaming
|
||||
- ⏳ Geração automática de descrições de animais
|
||||
- ⏳ Perfis pós-adopção
|
||||
- ⏳ Sistema de notificações por email
|
||||
- ⏳ Destaque de animais urgentes
|
||||
- ⏳ Registo de voluntários
|
||||
- ⏳ Avaliações de canis
|
||||
|
||||
---
|
||||
|
||||
## Fase 4 — Escala (Por iniciar)
|
||||
|
||||
- ⏳ App móvel React Native
|
||||
- ⏳ Relatórios fiscais (IRS)
|
||||
- ⏳ Dashboard analítico
|
||||
- ⏳ API pública
|
||||
- ⏳ Suporte multilingue
|
||||
|
||||
---
|
||||
|
||||
## 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 detectada |
|
||||
|---|-----------|--------|-----------------|
|
||||
| — | — | — | — |
|
||||
| # | 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 Configuradas
|
||||
## Dependências Externas
|
||||
|
||||
| Serviço | Estado | Notas |
|
||||
|---------|--------|-------|
|
||||
| Supabase (PostgreSQL) | ⏳ Por configurar | — |
|
||||
| Supabase Storage | ⏳ Por configurar | — |
|
||||
|---|---|---|
|
||||
| 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 | ⏳ Por configurar | — |
|
||||
| Resend | ⏳ Por configurar | — |
|
||||
| Anthropic Claude API | ⏳ Por configurar | — |
|
||||
| Upstash Redis | ⏳ 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 #1 — 2026-05-04
|
||||
**Duração:** —
|
||||
**Trabalho realizado:**
|
||||
- Leitura de toda a documentação
|
||||
- Criação de docs/PROGRESS.md
|
||||
### 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:**
|
||||
- docs/PROGRESS.md
|
||||
- `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 para a sessão seguinte:**
|
||||
- Iniciar a Fase 1 — Infra-estrutura e Configuração (Setup Next.js, instalar dependências, prisma init, shadcn init)
|
||||
**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:**
|
||||
- Nenhuma.
|
||||
**Notas:** Zero erros TypeScript. Prisma v7 com pnpm requer `output = "../node_modules/.prisma/client"` no schema.
|
||||
|
||||
Reference in New Issue
Block a user