Supabase
Client, env vars e pacote compartilhado
O Vendee usa Supabase como backend completo: autenticação, PostgreSQL, Row Level Security, funções RPC e edge functions.
Ambientes
| Ambiente | Project ref | Uso |
|---|---|---|
| Desenvolvimento | nwcdzokqsnojkapkdbqe (vendee-db0) | Todo desenvolvimento local e preview |
| Produção | separado, não documentado aqui | Apenas deploy oficial |
Nunca usar o projeto de produção para desenvolvimento local. Todo trabalho local, testes e migrations vão para vendee-db0.
Client
O client Supabase é exportado pelo pacote @repo/supabase:
import { supabase } from "@repo/supabase/client";No apps/app, um re-export local facilita o uso:
// src/lib/supabase.ts
export { supabase } from "@repo/supabase/client";Nunca instancie um novo client com createClient(). Use sempre o singleton exportado do pacote — ele já está configurado com auth persistente e listeners de sessão.
Variáveis de ambiente
O client detecta automaticamente o ambiente:
| Variável | Ambiente |
|---|---|
VITE_SUPABASE_URL | Vite (apps/app) |
VITE_SUPABASE_PUBLISHABLE_KEY | Vite (apps/app); legado VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY |
NEXT_PUBLIC_SUPABASE_URL | Next.js (docs) |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Next.js (docs); legado NEXT_PUBLIC_SUPABASE_ANON_KEY |
Tipos
Os tipos são gerados a partir do schema do banco e exportados por @repo/supabase/types:
import type { Database } from "@repo/supabase/types";
type Deal = Database["public"]["Tables"]["deals"]["Row"];
type DealInsert = Database["public"]["Tables"]["deals"]["Insert"];
type DealUpdate = Database["public"]["Tables"]["deals"]["Update"];Regenerar tipos
bunx supabase gen types typescript --project-id <project-id> > packages/supabase/src/types.tsAutenticação
O Supabase Auth gerencia:
- Login com email/senha
- Magic links (convites e login sem senha)
- Reset de senha
- Callback de autenticação (
/auth/callback)
Edge Functions
Edge functions são usadas para lógica server-side que precisa rodar com service_role (bypassando RLS) ou que envolve APIs externas. Exemplos no projeto:
admin-create-workspace— cria workspace + membro gestor + seed inicial- Funções de geração de PDF de propostas
Chamada via client:
const { data, error } = await supabase.functions.invoke("admin-create-workspace", {
body: { name: "Cliente novo", admin_email: "[email protected]" },
});Edge functions devem ser mantidas finas — só lógica que precisa rodar no servidor. Lógica de UI e validação de formulário ficam no client.