Guia de referência de como o site funciona: como subir o ambiente, como logar em cada perfil e o que cada painel faz.
Pré-requisitos: Node 20+, Docker Desktop rodando, make.
make devIsso instala dependências, sobe o Supabase local (Postgres + Auth + Studio +
caixa de e-mail), gera o .env.local, aplica migrations pendentes e roda a
aplicação.
| Serviço | URL |
|---|---|
| Aplicação | http://localhost:3000 |
| Studio (Supabase) | http://127.0.0.1:55423 |
| Caixa de e-mail (Mailpit) | http://127.0.0.1:55424 |
| Índice de todas as telas | http://localhost:3000/rotas |
As portas usam a faixa
554xxem vez da543xxpadrão do Supabase CLI porque outro projeto Supabase já ocupa essa faixa nesta máquina, e a faixa544xxcaiu na reserva dinâmica de portas do Windows/WinNAT. Os valores reais vivem emsupabase/config.toml.
Outros comandos úteis: make reset (recria banco com seed, apaga dados
locais), make studio / make mail (abrem essas URLs no navegador), make stop (derruba containers preservando dados), make help (lista tudo).
O login é sem senha, por link mágico. Não existe cadastro de senha nem
formulário de "criar conta" separado — é sempre o mesmo fluxo em /entrar,
mudando apenas o e-mail digitado.
Passo a passo:
- Abra http://localhost:3000/entrar
- Digite um dos e-mails do seed (tabela abaixo)
- Envie o formulário — a resposta na tela é sempre a mesma frase genérica, exista ou não conta com aquele e-mail (evita que alguém descubra quais e-mails têm conta)
- Abra a caixa de e-mail local: http://127.0.0.1:55424 (Mailpit) — em desenvolvimento nenhum e-mail sai da máquina, tudo é capturado ali
- Clique no link mágico do e-mail mais recente
- Isso troca o link por uma sessão (
/api/auth/callback) e te redireciona para a página que você pediu originalmente (ou para/por padrão) - Navegue até o painel — o link não "sabe" seu papel, quem decide se você pode entrar em cada painel é o layout daquela seção (item 3)
Papel (role) |
Painel | Contexto | |
|---|---|---|---|
admin@exemplo.local |
admin |
/admin |
Administração da plataforma inteira |
contato@santaclara.com.br |
organizacao |
/organizacao |
Dono(a) da organização "Fazenda Santa Clara" |
marina-e-thiago@exemplo.local |
cliente |
/painel |
Anfitriã(o) do evento marina-e-thiago (casamento), hospedado na Fazenda Santa Clara |
Outros e-mails cliente também existem no seed, cada um anfitrião de um dos
eventos de exemplo: 15-anos-sofia@exemplo.local,
aniversario-do-bento@exemplo.local, convencao-nexus-2026@exemplo.local.
Os e-mails e dados vêm de src/lib/mock-data.ts → gerados para
supabase/seed.sql via npm run db:seed / make seed.
Três papéis no enum user_role (supabase/migrations/20260803120100_profiles.sql),
guardado em profiles.role:
admin— acesso à plataforma inteiraorganizacao— dono/membro de uma organização (ex.: um espaço de eventos que hospeda festas de vários clientes)cliente— anfitrião de um evento específico
A checagem de papel acontece no servidor, no layout de cada seção
protegida — não no src/proxy.ts (renomeação do antigo middleware.ts), que
só renova o cookie de sessão:
| Rota | Guarda (src/lib/auth/guards.ts) |
Layout |
|---|---|---|
/admin |
requireAdmin — só admin |
src/app/admin/layout.tsx |
/organizacao |
requireOrganizationMember — precisa ser membro da organização, ou admin |
src/app/organizacao/layout.tsx |
/painel, /painel/*, /onboarding |
requireSession — qualquer usuário logado |
src/app/painel/layout.tsx |
Além disso, toda tabela tem RLS (Row Level Security) no Postgres como última linha de defesa — mesmo que uma rota de API esqueça de checar o papel, o banco recusa a leitura/escrita fora do escopo do usuário.
A landing pública (
/) não linka/painel,/adminnem/rotas— essas rotas continuam acessíveis por URL direta e, para a equipe/cliente, pelo botão "Entrar" no cabeçalho. O índice/rotassegue existindo para desenvolvimento.
Métricas da plataforma, lista de organizações, clientes recentes.
Catálogo/espaço da organização, endereços, calendário de eventos daquela organização.
| Rota | Tela |
|---|---|
/onboarding |
Assistente de criação de evento |
/painel |
Visão geral: contagem regressiva, confirmações de RSVP, link público do evento, atividade recente |
/painel/convidados |
Gestão de convidados |
/painel/editor |
Editor da página do evento: tema, tipografia, textos, preview ao vivo |
/painel/moderacao |
Fila de moderação da galeria/mural |
| Rota | Tela |
|---|---|
/e/[slug] |
Página do evento |
/e/[slug]/rsvp |
Confirmação de presença (3 passos) |
/e/[slug]/presentes |
Lista de presentes → checkout → sucesso |
/e/[slug]/galeria |
Galeria e mural de fotos |
/e/[slug]/amigo-secreto |
Amigo secreto — cadastro |
/e/[slug]/amigo-secreto/revelacao |
Amigo secreto — revelação |
Slugs de exemplo do seed: marina-e-thiago, 15-anos-sofia,
aniversario-do-bento, convencao-nexus-2026.
profiles (role: admin | organizacao | cliente)
└─ organizations ← organization_members
└─ events (+ event_content, rsvp_settings, media_settings)
├─ guests / guest_invites / rsvp_responses
├─ schedule_items / menu_items / bar_items
├─ photos / mural (+ reações, buckets de storage)
├─ gifts / gift_reservations / payments / payment_events
└─ amigo secreto: secret_santa_participants, wishlists,
exclusions, draws, assignments, reveals
email_messages / email_suppressions — fila de e-mails transacionais,
processada por cron via /api/interno/fila-email/processar
supabase/migrations/ é a única fonte de verdade do schema — nada de alterar
schema direto pelo painel do Supabase em staging/produção, isso é sobrescrito
na próxima promoção.
src/
proxy.ts Renova a sessão (era o middleware.ts)
app/
page.tsx Landing
entrar/ Login por link mágico
rotas/ Índice navegável de todas as telas
onboarding/ Criação de evento
painel/ Layout + telas do cliente
organizacao/ admin/ Layouts que guardam papel
e/[slug]/ Páginas públicas do evento
api/ Route handlers
lib/
auth/ Guardas de rota (requireAdmin, requireSession, ...)
db/ Acesso a dados (único lugar com snake_case)
supabase/ Clients: server, client, admin (service-role)
fixtures/ O que ainda não migrou pro banco (ver fixtures/README.md)
mock-data.ts Fonte do seed — não importar em páginas
supabase/
migrations/ Schema (fonte de verdade)
seed.sql Gerado a partir de mock-data.ts
Alguns módulos (presentes, galeria, mural, amigo secreto) ainda leem
fixtures em src/lib/fixtures/ em vez do banco — cada um migra em seu
próprio change.
README.md— visão geral do projeto, comandos, ambientes (local → staging → produção)AGENTS.md— aviso de que esta versão do Next.js tem mudanças de ruptura; consultenode_modules/next/dist/docs/antes de escrever código/rotasno app rodando — índice ao vivo de todas as telas