Aqui esta o SQL completo. Copie e cole no SQL Editor do seu Supabase:
-- =============================================
-- CONTROLAAI - SCHEMA COMPLETO
-- =============================================
-- 1. TABELA PROFILES
CREATE TABLE IF NOT EXISTS public.profiles (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
name TEXT,
avatar_url TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'profiles_select_own') THEN
CREATE POLICY "profiles_select_own" ON public.profiles FOR SELECT USING (auth.uid() = id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'profiles_insert_own') THEN
CREATE POLICY "profiles_insert_own" ON public.profiles FOR INSERT WITH CHECK (auth.uid() = id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'profiles_update_own') THEN
CREATE POLICY "profiles_update_own" ON public.profiles FOR UPDATE USING (auth.uid() = id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'profiles_delete_own') THEN
CREATE POLICY "profiles_delete_own" ON public.profiles FOR DELETE USING (auth.uid() = id);
END IF;
END $$;
-- 2. TABELA CATEGORIES
CREATE TABLE IF NOT EXISTS public.categories (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
type TEXT NOT NULL DEFAULT 'expense' CHECK (type IN ('income', 'expense')),
color TEXT DEFAULT '#10b981',
icon TEXT DEFAULT 'tag',
created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE public.categories ENABLE ROW LEVEL SECURITY;
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'categories_select_own') THEN
CREATE POLICY "categories_select_own" ON public.categories FOR SELECT USING (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'categories_insert_own') THEN
CREATE POLICY "categories_insert_own" ON public.categories FOR INSERT WITH CHECK (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'categories_update_own') THEN
CREATE POLICY "categories_update_own" ON public.categories FOR UPDATE USING (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'categories_delete_own') THEN
CREATE POLICY "categories_delete_own" ON public.categories FOR DELETE USING (auth.uid() = user_id);
END IF;
END $$;
-- 3. TABELA TRANSACTIONS
CREATE TABLE IF NOT EXISTS public.transactions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
category_id UUID REFERENCES public.categories(id) ON DELETE SET NULL,
title TEXT NOT NULL,
notes TEXT,
amount NUMERIC NOT NULL,
type TEXT NOT NULL CHECK (type IN ('income', 'expense')),
date DATE NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE public.transactions ENABLE ROW LEVEL SECURITY;
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'transactions_select_own') THEN
CREATE POLICY "transactions_select_own" ON public.transactions FOR SELECT USING (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'transactions_insert_own') THEN
CREATE POLICY "transactions_insert_own" ON public.transactions FOR INSERT WITH CHECK (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'transactions_update_own') THEN
CREATE POLICY "transactions_update_own" ON public.transactions FOR UPDATE USING (auth.uid() = user_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'transactions_delete_own') THEN
CREATE POLICY "transactions_delete_own" ON public.transactions FOR DELETE USING (auth.uid() = user_id);
END IF;
END $$;
-- 4. TRIGGER PARA CRIAR PROFILE AUTOMATICAMENTE NO SIGNUP
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
BEGIN
INSERT INTO public.profiles (id, name)
VALUES (new.id, coalesce(new.raw_user_meta_data ->> 'full_name', null))
ON CONFLICT (id) DO NOTHING;
RETURN new;
END;
$$;
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();
-- 5. FUNCAO PARA CRIAR CATEGORIAS PADRAO
CREATE OR REPLACE FUNCTION public.seed_default_categories(p_user_id UUID)
RETURNS void LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
BEGIN
INSERT INTO public.categories (user_id, name, type, color, icon) VALUES
(p_user_id, 'Salario', 'income', '#22c55e', 'banknote'),
(p_user_id, 'Freelance', 'income', '#10b981', 'briefcase'),
(p_user_id, 'Investimentos', 'income', '#06b6d4', 'trending-up'),
(p_user_id, 'Outros Ganhos', 'income', '#3b82f6', 'plus-circle'),
(p_user_id, 'Alimentacao', 'expense', '#ef4444', 'utensils'),
(p_user_id, 'Transporte', 'expense', '#f97316', 'car'),
(p_user_id, 'Moradia', 'expense', '#8b5cf6', 'home'),
(p_user_id, 'Saude', 'expense', '#ec4899', 'heart'),
(p_user_id, 'Educacao', 'expense', '#6366f1', 'book'),
(p_user_id, 'Lazer', 'expense', '#f59e0b', 'gamepad'),
(p_user_id, 'Compras', 'expense', '#14b8a6', 'shopping-bag'),
(p_user_id, 'Contas', 'expense', '#64748b', 'file-text')
ON CONFLICT DO NOTHING;
END;
$$;Depois de executar o SQL, voce precisa configurar as variaveis de ambiente no v0. Va no painel lateral esquerdo, clique em "Vars" e adicione:
| Chave | Valor |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | https://aaeqaimmaxxswiqphern.supabase.co |
NEXT_PUBLIC_SUPABASE_ANON_KEY | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFhZXFhaW1tYXh4c3dpcXBoZXJuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzI0OTU2NzQsImV4cCI6MjA4ODA3MTY3NH0.3GzbRwS0_yHwAoiZtrBPopNtgQ0AwdEOQG_7tCo01yE |
Me avise quando terminar!
O erro "Failed to fetch RSC payload" indica que o app esta tendo problemas de conexao, provavelmente porque as variaveis de ambiente do Supabase nao estao configuradas. O app tenta carregar a pagina de login mas falha porque nao consegue conectar ao Supabase.
Vou verificar se as variaveis estao sendo usadas corretamente e checar o client do Supabase:
Encontrei o problema! Nao ha variaveis de ambiente configuradas e o Supabase nao esta conectado. Voce precisa adicionar as variaveis manualmente no v0.
Faca isso agora:
| Chave | Valor |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | https://aaeqaimmaxxswiqphern.supabase.co |
NEXT_PUBLIC_SUPABASE_ANON_KEY | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFhZXFhaW1tYXh4c3dpcXBoZXJuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzI0OTU2NzQsImV4cCI6MjA4ODA3MTY3NH0.3GzbRwS0_yHwAoiZtrBPopNtgQ0AwdEOQG_7tCo01yE |
Depois de adicionar as variaveis, o app vai reiniciar automaticamente e deve funcionar. Me avise quando tiver adicionado!
You can send messages while the preview loads