Criar as tabelas no banco de dados
Em SQL Editor, execute:
-- Tabela de usuários aprovados
CREATE TABLE IF NOT EXISTS public.approved_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
email TEXT UNIQUE NOT NULL,
name TEXT,
is_admin BOOLEAN DEFAULT FALSE,
approved BOOLEAN DEFAULT FALSE,
turma TEXT,
semestre_atual INTEGER,
semestre_confirmado_em TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Adicionar campos em tabela existente (rode se a tabela já existe):
-- ALTER TABLE public.approved_users ADD COLUMN IF NOT EXISTS turma TEXT;
-- ALTER TABLE public.approved_users ADD COLUMN IF NOT EXISTS semestre_atual INTEGER;
-- ALTER TABLE public.approved_users ADD COLUMN IF NOT EXISTS semestre_confirmado_em TIMESTAMPTZ;
-- Tabela de resumos
CREATE TABLE IF NOT EXISTS public.resumos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title TEXT NOT NULL,
materia TEXT NOT NULL,
semestre INTEGER NOT NULL,
description TEXT,
content TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Tabela de acessos por usuário+resumo
CREATE TABLE IF NOT EXISTS public.user_access (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
resumo_id UUID REFERENCES public.resumos(id) ON DELETE CASCADE,
granted_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ DEFAULT (NOW() + INTERVAL '50 days'),
UNIQUE(user_id, resumo_id)
);
-- Adicionar coluna em tabela existente (rode se a tabela já existe):
-- ALTER TABLE public.user_access ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ DEFAULT (NOW() + INTERVAL '50 days');
-- UPDATE public.user_access SET expires_at = granted_at + INTERVAL '50 days' WHERE expires_at IS NULL;
-- Habilitar RLS
ALTER TABLE public.approved_users ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.resumos ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.user_access ENABLE ROW LEVEL SECURITY;
-- Policies
CREATE POLICY "Users see own profile" ON public.approved_users FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Admins see all users" ON public.approved_users FOR ALL USING (EXISTS (SELECT 1 FROM public.approved_users WHERE user_id = auth.uid() AND is_admin = TRUE));
CREATE POLICY "Resumos visíveis" ON public.resumos FOR SELECT USING (TRUE);
CREATE POLICY "Acesso próprio" ON public.user_access FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Admin gerencia acesso" ON public.user_access FOR ALL USING (EXISTS (SELECT 1 FROM public.approved_users WHERE user_id = auth.uid() AND is_admin = TRUE));
-- ─── SISTEMA DE VENDAS ─────────────────────────────────────
-- Compras coletivas (sala de espera)
CREATE TABLE IF NOT EXISTS public.compras_coletivas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
codigo TEXT NOT NULL,
tipo TEXT NOT NULL DEFAULT 'dupla',
status TEXT NOT NULL DEFAULT 'aguardando',
slots_total INTEGER NOT NULL DEFAULT 2,
slots_preenchidos INTEGER NOT NULL DEFAULT 0,
preco_individual DECIMAL(10,2) NOT NULL,
preco_dupla DECIMAL(10,2),
criador_user_id UUID REFERENCES auth.users(id),
expira_em TIMESTAMPTZ NOT NULL,
segunda_chance_expira_em TIMESTAMPTZ,
criado_em TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS public.compra_participantes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
compra_id UUID REFERENCES public.compras_coletivas(id) ON DELETE CASCADE,
user_id UUID REFERENCES auth.users(id),
email TEXT,
status_pagamento TEXT NOT NULL DEFAULT 'pendente',
mp_payment_id TEXT,
mp_preference_id TEXT,
valor_pago DECIMAL(10,2),
resumos_selecionados JSONB DEFAULT '[]',
pago_em TIMESTAMPTZ,
criado_em TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(compra_id, user_id)
);
CREATE TABLE IF NOT EXISTS public.assinaturas_ia (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE UNIQUE,
status TEXT NOT NULL DEFAULT 'ativa',
mp_subscription_id TEXT,
valor DECIMAL(10,2) DEFAULT 15.00,
inicio_em TIMESTAMPTZ DEFAULT NOW(),
proximo_pagamento TIMESTAMPTZ,
criado_em TIMESTAMPTZ DEFAULT NOW()
);
-- RLS para tabelas de vendas
ALTER TABLE public.compras_coletivas ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.compra_participantes ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.assinaturas_ia ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Participante vê sua compra" ON public.compra_participantes FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Participante insere" ON public.compra_participantes FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Compras visíveis" ON public.compras_coletivas FOR SELECT USING (TRUE);
CREATE POLICY "Criador insere compra" ON public.compras_coletivas FOR INSERT WITH CHECK (auth.uid() = criador_user_id);
CREATE POLICY "Criador atualiza compra" ON public.compras_coletivas FOR UPDATE USING (auth.uid() = criador_user_id);
CREATE POLICY "Assinatura própria" ON public.assinaturas_ia FOR SELECT USING (auth.uid() = user_id);