-- 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;