Attiva il form footer, API subscribe/confirm/unsubscribe e endpoint admin protetti, riusando Resend per le email. Co-authored-by: Cursor <cursoragent@cursor.com>
50 lines
1.7 KiB
SQL
50 lines
1.7 KiB
SQL
-- Newsletter subscribers and campaign send log
|
|
CREATE TABLE IF NOT EXISTS newsletter_subscribers (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
email TEXT NOT NULL COLLATE NOCASE,
|
|
status TEXT NOT NULL CHECK (status IN ('pending', 'active', 'unsubscribed')),
|
|
locale TEXT NOT NULL DEFAULT 'it',
|
|
confirm_token TEXT,
|
|
unsubscribe_token TEXT NOT NULL,
|
|
source TEXT NOT NULL DEFAULT 'footer',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
confirmed_at TEXT,
|
|
unsubscribed_at TEXT,
|
|
UNIQUE (email)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_subscribers_status
|
|
ON newsletter_subscribers (status);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_subscribers_confirm_token
|
|
ON newsletter_subscribers (confirm_token);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_subscribers_unsubscribe_token
|
|
ON newsletter_subscribers (unsubscribe_token);
|
|
|
|
CREATE TABLE IF NOT EXISTS newsletter_campaigns (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
subject TEXT NOT NULL,
|
|
body_text TEXT NOT NULL,
|
|
body_html TEXT,
|
|
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'sending', 'sent', 'failed')),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
sent_at TEXT,
|
|
created_by TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS newsletter_campaign_sends (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
campaign_id INTEGER NOT NULL,
|
|
subscriber_id INTEGER NOT NULL,
|
|
email TEXT NOT NULL,
|
|
status TEXT NOT NULL CHECK (status IN ('queued', 'sent', 'failed', 'skipped')),
|
|
error TEXT,
|
|
sent_at TEXT,
|
|
FOREIGN KEY (campaign_id) REFERENCES newsletter_campaigns (id),
|
|
FOREIGN KEY (subscriber_id) REFERENCES newsletter_subscribers (id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_campaign_sends_campaign
|
|
ON newsletter_campaign_sends (campaign_id);
|