Files
coding-starter/migrations/pg/2026-04-17_campaigns.sql

43 lines
1.4 KiB
PL/PgSQL

-- Wird pro Tenant-Schema ausgeführt (SET search_path = tenant_<id>, public vorher)
CREATE TABLE IF NOT EXISTS campaigns (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
subject TEXT NOT NULL,
html_body TEXT NOT NULL,
plain_body TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'draft'
CHECK (status IN ('draft','scheduled','sending','sent','paused','cancelled')),
scheduled_at TIMESTAMPTZ,
cron_expression TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS campaign_recipients (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
campaign_id UUID NOT NULL REFERENCES campaigns(id) ON DELETE CASCADE,
list_id UUID,
segment_id UUID,
CONSTRAINT recipient_has_one CHECK (
(list_id IS NOT NULL AND segment_id IS NULL) OR
(segment_id IS NOT NULL AND list_id IS NULL)
)
);
CREATE TABLE IF NOT EXISTS campaign_triggers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
campaign_id UUID NOT NULL REFERENCES campaigns(id) ON DELETE CASCADE,
trigger_type TEXT NOT NULL CHECK (trigger_type IN ('cron', 'event')),
trigger_value TEXT NOT NULL
);
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN NEW.updated_at = now(); RETURN NEW; END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER campaigns_updated_at
BEFORE UPDATE ON campaigns
FOR EACH ROW EXECUTE FUNCTION update_updated_at();