80 lines
2.8 KiB
SQL
80 lines
2.8 KiB
SQL
-- Platform Schema Migration 001: Platform Service State
|
|
-- Defines storage for onboarding, preferences, profiles, quota alerts, and search history.
|
|
|
|
CREATE SCHEMA IF NOT EXISTS platform;
|
|
|
|
-- Dashboard preferences per tenant/user
|
|
CREATE TABLE IF NOT EXISTS platform.dashboard_preferences (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id TEXT NOT NULL,
|
|
actor_id TEXT NOT NULL,
|
|
preferences JSONB NOT NULL DEFAULT '{}',
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_by TEXT,
|
|
UNIQUE(tenant_id, actor_id)
|
|
);
|
|
|
|
CREATE INDEX idx_dashboard_preferences_tenant ON platform.dashboard_preferences(tenant_id);
|
|
|
|
-- Saved dashboard profiles per tenant
|
|
CREATE TABLE IF NOT EXISTS platform.dashboard_profiles (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id TEXT NOT NULL,
|
|
profile_id TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
preferences JSONB NOT NULL DEFAULT '{}',
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_by TEXT,
|
|
UNIQUE(tenant_id, profile_id)
|
|
);
|
|
|
|
CREATE INDEX idx_dashboard_profiles_tenant ON platform.dashboard_profiles(tenant_id);
|
|
CREATE INDEX idx_dashboard_profiles_profile ON platform.dashboard_profiles(tenant_id, profile_id);
|
|
|
|
-- Onboarding state per tenant/user
|
|
CREATE TABLE IF NOT EXISTS platform.onboarding_state (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id TEXT NOT NULL,
|
|
actor_id TEXT NOT NULL,
|
|
status TEXT NOT NULL,
|
|
steps JSONB NOT NULL DEFAULT '[]',
|
|
skipped_reason TEXT,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_by TEXT,
|
|
UNIQUE(tenant_id, actor_id)
|
|
);
|
|
|
|
CREATE INDEX idx_onboarding_state_tenant ON platform.onboarding_state(tenant_id);
|
|
|
|
-- Quota alert subscriptions (per tenant)
|
|
CREATE TABLE IF NOT EXISTS platform.quota_alerts (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id TEXT NOT NULL,
|
|
alert_id TEXT NOT NULL,
|
|
quota_id TEXT NOT NULL,
|
|
severity TEXT NOT NULL,
|
|
threshold NUMERIC(18, 4) NOT NULL,
|
|
condition TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
created_by TEXT,
|
|
UNIQUE(tenant_id, alert_id)
|
|
);
|
|
|
|
CREATE INDEX idx_quota_alerts_tenant ON platform.quota_alerts(tenant_id);
|
|
CREATE INDEX idx_quota_alerts_quota ON platform.quota_alerts(tenant_id, quota_id);
|
|
|
|
-- Search history (optional, user-scoped)
|
|
CREATE TABLE IF NOT EXISTS platform.search_history (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
tenant_id TEXT NOT NULL,
|
|
actor_id TEXT NOT NULL,
|
|
query TEXT NOT NULL,
|
|
sources TEXT[] NOT NULL DEFAULT '{}',
|
|
result_count INT NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_search_history_tenant ON platform.search_history(tenant_id);
|
|
CREATE INDEX idx_search_history_created ON platform.search_history(tenant_id, created_at DESC);
|