platform-deployments/docker/features/seo/init.sql

77 lines
2.7 KiB
MySQL
Raw Normal View History

-- SEO Database Initialization
CREATE SCHEMA IF NOT EXISTS seo;
-- Domain configurations
CREATE TABLE IF NOT EXISTS seo.domain_configs (
id SERIAL PRIMARY KEY,
domain VARCHAR(255) NOT NULL UNIQUE,
default_locale VARCHAR(10) NOT NULL DEFAULT 'en',
supported_locales TEXT[] NOT NULL DEFAULT ARRAY['en'],
site_name VARCHAR(255) NOT NULL,
twitter_handle VARCHAR(100),
default_og_image TEXT,
auto_generate BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Page SEO configurations
CREATE TABLE IF NOT EXISTS seo.page_configs (
id SERIAL PRIMARY KEY,
domain_id INTEGER NOT NULL REFERENCES seo.domain_configs(id) ON DELETE CASCADE,
path VARCHAR(500) NOT NULL,
page_type VARCHAR(100) NOT NULL DEFAULT 'page',
variables JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(domain_id, path)
);
-- Metadata overrides per locale
CREATE TABLE IF NOT EXISTS seo.metadata_overrides (
id SERIAL PRIMARY KEY,
page_config_id INTEGER NOT NULL REFERENCES seo.page_configs(id) ON DELETE CASCADE,
locale VARCHAR(10) NOT NULL,
title VARCHAR(255),
description TEXT,
keywords TEXT[],
og_title VARCHAR(255),
og_description TEXT,
og_image TEXT,
og_type VARCHAR(50) DEFAULT 'website',
canonical_url TEXT,
robots VARCHAR(100) DEFAULT 'index,follow',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(page_config_id, locale)
);
-- Generated SEO cache
CREATE TABLE IF NOT EXISTS seo.generated_cache (
id SERIAL PRIMARY KEY,
domain VARCHAR(255) NOT NULL,
path VARCHAR(500) NOT NULL,
locale VARCHAR(10) NOT NULL,
metadata JSONB NOT NULL,
source VARCHAR(50) NOT NULL DEFAULT 'generated',
truth_validation JSONB,
generated_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ DEFAULT NOW() + INTERVAL '24 hours',
UNIQUE(domain, path, locale)
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_domain_configs_domain ON seo.domain_configs(domain);
CREATE INDEX IF NOT EXISTS idx_page_configs_lookup ON seo.page_configs(domain_id, path);
CREATE INDEX IF NOT EXISTS idx_metadata_page_locale ON seo.metadata_overrides(page_config_id, locale);
CREATE INDEX IF NOT EXISTS idx_cache_lookup ON seo.generated_cache(domain, path, locale);
CREATE INDEX IF NOT EXISTS idx_cache_expiry ON seo.generated_cache(expires_at);
-- Permissions
GRANT ALL PRIVILEGES ON SCHEMA seo TO lilith;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA seo TO lilith;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA seo TO lilith;
DO $$ BEGIN RAISE NOTICE 'SEO database initialized'; END $$;