- supabase/schema.sql: idempotentny skript (tabulky, RLS, bucket newsletter-assets) - supabase/assets + npm run db:upload-assets: staticke obrazky sablony - adresa uloziska sa sklada z NEXT_PUBLIC_SUPABASE_URL namiesto pevneho projektu - .env.example a navod na instalaciu v README Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62 lines
2.9 KiB
SQL
62 lines
2.9 KiB
SQL
-- Schéma pre Modulárny generátor newsletterov (COOP Jednota)
|
||
--
|
||
-- Založenie databázy na novom Supabase projekte:
|
||
-- Supabase Dashboard → SQL Editor → vložiť celý tento súbor → Run.
|
||
-- Skript je idempotentný – dá sa spustiť opakovane bez straty dát.
|
||
|
||
-- 1. Tabuľka šablón / konceptov newslettera
|
||
-- data = { preheader, modules[] } – celý obsah kampane ako JSON
|
||
CREATE TABLE IF NOT EXISTS templates (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
title TEXT NOT NULL DEFAULT 'Nový newsletter',
|
||
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'ready', 'exported')),
|
||
data JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||
brevo_campaign_id INTEGER,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
-- Index pre rýchle zoradenie podľa dátumu úpravy
|
||
CREATE INDEX IF NOT EXISTS idx_templates_updated_at ON templates(updated_at DESC);
|
||
|
||
-- 2. Tabuľka šablón cenoviek (Badges)
|
||
-- layers_config = { layers[], width, align, paddingTop, paddingBottom }
|
||
-- (staršie záznamy môžu mať len pole vrstiev – aplikácia podporuje oba tvary)
|
||
CREATE TABLE IF NOT EXISTS badges (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
name TEXT NOT NULL,
|
||
svg_background_url TEXT,
|
||
svg_raw TEXT,
|
||
layers_config JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||
preview_image_url TEXT,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
-- 3. Tabuľka uložených profilov mapovania importu (zatiaľ nevyužitá aplikáciou)
|
||
CREATE TABLE IF NOT EXISTS mapping_presets (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
name TEXT NOT NULL,
|
||
file_type TEXT NOT NULL CHECK (file_type IN ('csv', 'json', 'xml')),
|
||
mapping_rules JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
-- 4. RLS (Row Level Security) – interný nástroj: povolený prístup cez anon kľúč
|
||
ALTER TABLE templates ENABLE ROW LEVEL SECURITY;
|
||
ALTER TABLE badges ENABLE ROW LEVEL SECURITY;
|
||
ALTER TABLE mapping_presets ENABLE ROW LEVEL SECURITY;
|
||
|
||
DROP POLICY IF EXISTS "Allow public all on templates" ON templates;
|
||
DROP POLICY IF EXISTS "Allow public all on badges" ON badges;
|
||
DROP POLICY IF EXISTS "Allow public all on mapping_presets" ON mapping_presets;
|
||
|
||
CREATE POLICY "Allow public all on templates" ON templates FOR ALL USING (true) WITH CHECK (true);
|
||
CREATE POLICY "Allow public all on badges" ON badges FOR ALL USING (true) WITH CHECK (true);
|
||
CREATE POLICY "Allow public all on mapping_presets" ON mapping_presets FOR ALL USING (true) WITH CHECK (true);
|
||
|
||
-- 5. Úložisko obrázkov (Storage bucket) – verejne čitateľné, aby sa obrázky zobrazili v e-mailoch.
|
||
-- Nahrávanie ide cez /api/upload so service_role kľúčom (obchádza RLS), ďalšie politiky netreba.
|
||
INSERT INTO storage.buckets (id, name, public)
|
||
VALUES ('newsletter-assets', 'newsletter-assets', true)
|
||
ON CONFLICT (id) DO UPDATE SET public = true;
|