-- Schéma pre Modulárny generátor newsletterov (COOP Jednota)
-- 1. Tabuľka šablón / konceptov newslettera
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 cenoviek (Badges)
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 (Data Mapper Presets)
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. Východiskové referenčné cenovky (Seed dát pre COOP Jednota)
INSERT INTO badges (name, svg_raw, layers_config) VALUES
(
'Žltá AKCIA',
'',
'[
{"id": "l1", "type": "text", "text": "AKCIA", "x": 80, "y": 32, "fontSize": 24, "fontWeight": "900", "fill": "#e0001b", "align": "center"},
{"id": "l2", "type": "text", "text": "{zlava}", "x": 80, "y": 64, "fontSize": 22, "fontWeight": "800", "fill": "#001a33", "align": "center"}
]'::jsonb
),
(
'Červená SUPER CENA',
'',
'[
{"id": "l1", "type": "text", "text": "SUPER CENA", "x": 80, "y": 34, "fontSize": 18, "fontWeight": "900", "fill": "#ffffff", "align": "center"},
{"id": "l2", "type": "text", "text": "{zlava}", "x": 80, "y": 64, "fontSize": 24, "fontWeight": "900", "fill": "#ffd100", "align": "center"}
]'::jsonb
),
(
'Percentuálna zľava (Kruh)',
'',
'[
{"id": "l1", "type": "text", "text": "ZĽAVA", "x": 50, "y": 36, "fontSize": 13, "fontWeight": "800", "fill": "#ffffff", "align": "center"},
{"id": "l2", "type": "text", "text": "{zlava}%", "x": 50, "y": 68, "fontSize": 24, "fontWeight": "900", "fill": "#ffd100", "align": "center"}
]'::jsonb
)
ON CONFLICT DO NOTHING;
-- 5. Nastavenie RLS (Row Level Security) - pre interný nástroj povolíme verejný 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;
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);