Clone
-- Users table
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Authorized emails (whitelist)
CREATE TABLE IF NOT EXISTS authorized_emails (
email TEXT PRIMARY KEY,
authorized BOOLEAN DEFAULT true,
added_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- URL entries
CREATE TABLE IF NOT EXISTS entries (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
name TEXT NOT NULL,
original_url TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
logo_url TEXT,
qr_code_url TEXT,
click_count INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- Create index for faster slug lookups
CREATE INDEX IF NOT EXISTS idx_entries_slug ON entries(slug);
CREATE INDEX IF NOT EXISTS idx_entries_user_id ON entries(user_id);
-- Analytics
CREATE TABLE IF NOT EXISTS analytics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
entry_id TEXT NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
ip_hash TEXT,
user_agent TEXT,
referer TEXT,
country TEXT,
city TEXT,
FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
);
-- Create index for analytics queries
CREATE INDEX IF NOT EXISTS idx_analytics_entry_id ON analytics(entry_id);
CREATE INDEX IF NOT EXISTS idx_analytics_timestamp ON analytics(timestamp);
-- Magic link tokens
CREATE TABLE IF NOT EXISTS auth_tokens (
token TEXT PRIMARY KEY,
email TEXT NOT NULL,
expires_at DATETIME NOT NULL,
used BOOLEAN DEFAULT false,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Create index for token lookups
CREATE INDEX IF NOT EXISTS idx_auth_tokens_email ON auth_tokens(email);
CREATE INDEX IF NOT EXISTS idx_auth_tokens_expires_at ON auth_tokens(expires_at);