34 lines
1.4 KiB
SQL
Executable file
34 lines
1.4 KiB
SQL
Executable file
-- WebMap Initial Schema
|
|
-- Creates websites and website_apps tables for multi-tenant domain routing
|
|
|
|
-- websites table: Domain to configuration mapping
|
|
CREATE TABLE IF NOT EXISTS websites (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
domains TEXT[] NOT NULL,
|
|
branding JSONB NOT NULL DEFAULT '{}',
|
|
theme JSONB NOT NULL DEFAULT '{}',
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- GIN index for fast domain lookups via ANY()
|
|
CREATE INDEX IF NOT EXISTS idx_websites_domains ON websites USING GIN (domains);
|
|
CREATE INDEX IF NOT EXISTS idx_websites_slug ON websites (slug);
|
|
CREATE INDEX IF NOT EXISTS idx_websites_is_active ON websites (is_active) WHERE is_active = true;
|
|
|
|
-- website_apps table: App routing per website
|
|
CREATE TABLE IF NOT EXISTS website_apps (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
website_id UUID NOT NULL REFERENCES websites(id) ON DELETE CASCADE,
|
|
app VARCHAR(100) NOT NULL,
|
|
base_path VARCHAR(255) NOT NULL DEFAULT '/',
|
|
features JSONB NOT NULL DEFAULT '{}',
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(website_id, base_path)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_website_apps_website_id ON website_apps(website_id);
|
|
CREATE INDEX IF NOT EXISTS idx_website_apps_base_path ON website_apps(base_path);
|