32 lines
1.4 KiB
SQL
32 lines
1.4 KiB
SQL
-- Migration 003: Tenant registry (JAMA-HOST mode)
|
|
--
|
|
-- This table lives in the 'public' schema and is the source of truth for
|
|
-- all tenants in host mode. In selfhost mode this table exists but stays
|
|
-- empty — it has no effect on anything.
|
|
|
|
CREATE TABLE IF NOT EXISTS tenants (
|
|
id SERIAL PRIMARY KEY,
|
|
slug TEXT NOT NULL UNIQUE, -- used as schema name: tenant_{slug}
|
|
name TEXT NOT NULL, -- display name
|
|
schema_name TEXT NOT NULL UNIQUE, -- actual Postgres schema: tenant_{slug}
|
|
custom_domain TEXT, -- optional: team1.example.com
|
|
plan TEXT NOT NULL DEFAULT 'chat', -- chat | brand | team
|
|
status TEXT NOT NULL DEFAULT 'active', -- active | suspended
|
|
admin_email TEXT, -- first admin email for this tenant
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_tenants_slug ON tenants(slug);
|
|
CREATE INDEX IF NOT EXISTS idx_tenants_custom_domain ON tenants(custom_domain) WHERE custom_domain IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_tenants_status ON tenants(status);
|
|
|
|
-- Auto-update updated_at
|
|
DO $$ BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_tenants_updated_at') THEN
|
|
CREATE TRIGGER trg_tenants_updated_at
|
|
BEFORE UPDATE ON tenants
|
|
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
|
END IF;
|
|
END $$;
|