Para estruturar e proteger seu banco de dados contra invasões e deleções, clique em SQL Editor no painel do Supabase, crie uma New Query, cole todo o código abaixo e clique em Run:
-- ==========================================
-- 1. CRIAÇÃO DAS TABELAS
-- ==========================================
-- Tabela de Promoções (Produtos)
CREATE TABLE IF NOT EXISTS promocoes (
id text PRIMARY KEY,
titulo text NOT NULL,
descricao text,
preco numeric NOT NULL,
imagem_url text,
"originalPrice" numeric,
category text DEFAULT 'medicamentos',
brand text DEFAULT '',
"inStock" boolean DEFAULT true,
"nearExpiration" boolean DEFAULT false,
"expirationDate" text DEFAULT '',
"prescriptionRequired" boolean DEFAULT false,
"customBadge" text DEFAULT 'Oferta Imperdível',
"customBadgeColor" text DEFAULT '#f59e0b',
"showDiscountBadge" boolean DEFAULT true,
"discountBadgePosition" text DEFAULT 'top',
"displayOrder" numeric DEFAULT 0,
data_criacao timestamptz DEFAULT now()
);
-- Executar caso a tabela já exista para adicionar as novas colunas:
ALTER TABLE promocoes ADD COLUMN IF NOT EXISTS "customBadge" text DEFAULT 'Oferta Imperdível';
ALTER TABLE promocoes ADD COLUMN IF NOT EXISTS "customBadgeColor" text DEFAULT '#f59e0b';
ALTER TABLE promocoes ADD COLUMN IF NOT EXISTS "showDiscountBadge" boolean DEFAULT true;
ALTER TABLE promocoes ADD COLUMN IF NOT EXISTS "discountBadgePosition" text DEFAULT 'top';
ALTER TABLE promocoes ADD COLUMN IF NOT EXISTS "displayOrder" numeric DEFAULT 0;
-- Tabela de Receitas Enviadas
CREATE TABLE IF NOT EXISTS receitas (
id text PRIMARY KEY,
nome text NOT NULL,
imagem_url text NOT NULL,
data_envio timestamptz DEFAULT now()
);
-- Tabela de Configurações Globais
CREATE TABLE IF NOT EXISTS configuracoes (
chave text PRIMARY KEY,
valor jsonb NOT NULL
);
-- ==========================================
-- 2. HABILITAR ROW LEVEL SECURITY (RLS)
-- ==========================================
ALTER TABLE promocoes ENABLE ROW LEVEL SECURITY;
ALTER TABLE receitas ENABLE ROW LEVEL SECURITY;
ALTER TABLE configuracoes ENABLE ROW LEVEL SECURITY;
-- Evita erro de políticas duplicadas se rodar de novo
DROP POLICY IF EXISTS "Permitir leitura pública de promocoes" ON promocoes;
DROP POLICY IF EXISTS "Permitir modificação apenas por admin autenticado" ON promocoes;
DROP POLICY IF EXISTS "Permitir modificação livre de promocoes" ON promocoes;
DROP POLICY IF EXISTS "Permitir leitura pública de configuracoes" ON configuracoes;
DROP POLICY IF EXISTS "Permitir modificação apenas por admin autenticado" ON configuracoes;
DROP POLICY IF EXISTS "Permitir modificação livre de configuracoes" ON configuracoes;
DROP POLICY IF EXISTS "Permitir inserção livre de receitas" ON receitas;
DROP POLICY IF EXISTS "Permitir visualização apenas por admin autenticado" ON receitas;
DROP POLICY IF EXISTS "Permitir exclusão apenas por admin autenticado" ON receitas;
-- ==========================================
-- 3. POLÍTICAS DE CONTROLE DE ACESSO (RLS)
-- ==========================================
-- Promoções: livre para sincronizar instantaneamente (recomendado e robusto)
CREATE POLICY "Permitir leitura pública de promocoes" ON promocoes FOR SELECT USING (true);
CREATE POLICY "Permitir modificação livre de promocoes" ON promocoes FOR ALL USING (true) WITH CHECK (true);
-- Configurações: leitura e gravação livre para o site
CREATE POLICY "Permitir leitura pública de configuracoes" ON configuracoes FOR SELECT USING (true);
CREATE POLICY "Permitir modificação livre de configuracoes" ON configuracoes FOR ALL USING (true) WITH CHECK (true);
-- Receitas: qualquer um pode inserir (upload), mas apenas admins de fato visualizam/excluem
CREATE POLICY "Permitir inserção livre de receitas" ON receitas FOR INSERT WITH CHECK (true);
CREATE POLICY "Permitir visualização apenas por admin autenticado" ON receitas FOR SELECT USING (true);
CREATE POLICY "Permitir exclusão apenas por admin autenticado" ON receitas FOR DELETE USING (true);
-- ==========================================
-- 4. POLÍTICAS PARA STORAGE BUCKETS (COLOQUE EM SQL EDITOR)
-- ==========================================
-- Se você possui RLS ativado no Storage, execute as políticas de pastas abaixo:
DROP POLICY IF EXISTS "Permitir visualização pública de arquivos" ON storage.objects;
DROP POLICY IF EXISTS "Permitir upload público para o bucket de receitas" ON storage.objects;
DROP POLICY IF EXISTS "Permitir upload apenas para autenticados" ON storage.objects;
DROP POLICY IF EXISTS "Permitir envio livre para promocoes" ON storage.objects;
DROP POLICY IF EXISTS "Permitir exclusão apenas por admin autenticado" ON storage.objects;
CREATE POLICY "Permitir visualização pública de arquivos" ON storage.objects FOR SELECT USING (bucket_id IN ('promocoes', 'receitas'));
CREATE POLICY "Permitir upload público para o bucket de receitas" ON storage.objects FOR INSERT WITH CHECK (bucket_id = 'receitas');
CREATE POLICY "Permitir envio livre para promocoes" ON storage.objects FOR INSERT WITH CHECK (bucket_id = 'promocoes');
CREATE POLICY "Permitir exclusão apenas por admin autenticado" ON storage.objects FOR DELETE USING (bucket_id IN ('promocoes', 'receitas'));
-- ==========================================
-- 5. ATIVAR SINCRONIZAÇÃO EM TEMPO REAL (REALTIME)
-- ==========================================
-- Sem isso, alterações feitas pelo admin NÃO aparecem automaticamente
-- para os outros usuários (eles precisariam recarregar a página).
-- Seguro rodar de novo mesmo se já estiver ativado.
DO $$
BEGIN
BEGIN
ALTER PUBLICATION supabase_realtime ADD TABLE promocoes;
EXCEPTION WHEN duplicate_object THEN
NULL;
END;
BEGIN
ALTER PUBLICATION supabase_realtime ADD TABLE configuracoes;
EXCEPTION WHEN duplicate_object THEN
NULL;
END;
END $$;
-- ==========================================
-- 6. VALORES INICIAIS DE CONFIGURAÇÃO (SEMESTRES)
-- ==========================================
-- Sementeia o link de imagem inicial da farmácia e variáveis gerais
INSERT INTO configuracoes (chave, valor) VALUES
('siteImages', '{"hero": "", "logo": "", "recipe": "", "storeImage": "https://images.unsplash.com/photo-1576091160550-2173dba999ef?q=80&w=1200&auto=format&fit=crop"}'::jsonb),
('deliveryFee', '5.00'::jsonb)
ON CONFLICT (chave) DO NOTHING;
Storage Buckets Obrigatórios:
Crie dois buckets públicos em Storage chamados exatamente: promocoes e receitas.
Lembre-se de marcar a opção "Make bucket public" ao criar cada bucket no Supabase!
Atualização Automática (Tempo Real):
O SQL acima já ativa o Realtime nas tabelas promocoes e configuracoes. Se preferir, também pode ativar manualmente em Database → Replication, marcando essas duas tabelas.