11-- PostgreSQL Schema for Gateway-Controller API Configurations
2- -- Version: 6
2+ -- Version: 8
33
44-- Main table for deployments
55CREATE TABLE IF NOT EXISTS deployments (
66 id TEXT PRIMARY KEY ,
7+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
78 display_name TEXT NOT NULL ,
89 version TEXT NOT NULL ,
910 context TEXT NOT NULL ,
@@ -14,17 +15,18 @@ CREATE TABLE IF NOT EXISTS deployments (
1415 updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
1516 deployed_at TIMESTAMPTZ ,
1617 deployed_version BIGINT NOT NULL DEFAULT 0 ,
17- UNIQUE(display_name, version)
18+ UNIQUE(display_name, version, gateway_id )
1819);
1920
20- CREATE INDEX IF NOT EXISTS idx_name_version ON deployments(display_name, version);
2121CREATE INDEX IF NOT EXISTS idx_status ON deployments(status);
2222CREATE INDEX IF NOT EXISTS idx_context ON deployments(context);
2323CREATE INDEX IF NOT EXISTS idx_kind ON deployments(kind);
24+ CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
2425
2526-- Table for custom TLS certificates
2627CREATE TABLE IF NOT EXISTS certificates (
2728 id TEXT PRIMARY KEY ,
29+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
2830 name TEXT NOT NULL UNIQUE,
2931 certificate BYTEA NOT NULL ,
3032 subject TEXT NOT NULL ,
@@ -38,6 +40,7 @@ CREATE TABLE IF NOT EXISTS certificates (
3840
3941CREATE INDEX IF NOT EXISTS idx_cert_name ON certificates(name);
4042CREATE INDEX IF NOT EXISTS idx_cert_expiry ON certificates(not_after);
43+ CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
4144
4245-- Table for deployment-specific configurations
4346CREATE TABLE IF NOT EXISTS deployment_configs (
@@ -50,17 +53,20 @@ CREATE TABLE IF NOT EXISTS deployment_configs (
5053-- LLM Provider Templates table
5154CREATE TABLE IF NOT EXISTS llm_provider_templates (
5255 id TEXT PRIMARY KEY ,
56+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
5357 handle TEXT NOT NULL UNIQUE,
5458 configuration TEXT NOT NULL ,
5559 created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
5660 updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
5761);
5862
5963CREATE INDEX IF NOT EXISTS idx_template_handle ON llm_provider_templates(handle);
64+ CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
6065
6166-- Table for API keys
6267CREATE TABLE IF NOT EXISTS api_keys (
6368 id TEXT PRIMARY KEY ,
69+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
6470 name TEXT NOT NULL ,
6571 api_key TEXT NOT NULL UNIQUE,
6672 masked_api_key TEXT NOT NULL ,
@@ -78,7 +84,7 @@ CREATE TABLE IF NOT EXISTS api_keys (
7884 index_key TEXT NULL ,
7985 display_name TEXT NOT NULL DEFAULT ' ' ,
8086 FOREIGN KEY (apiId) REFERENCES deployments(id) ON DELETE CASCADE ,
81- UNIQUE (apiId, name)
87+ UNIQUE (apiId, name, gateway_id )
8288);
8389
8490CREATE INDEX IF NOT EXISTS idx_api_key ON api_keys(api_key);
@@ -89,10 +95,63 @@ CREATE INDEX IF NOT EXISTS idx_created_by ON api_keys(created_by);
8995CREATE INDEX IF NOT EXISTS idx_api_key_source ON api_keys(source);
9096CREATE INDEX IF NOT EXISTS idx_api_key_external_ref ON api_keys(external_ref_id);
9197CREATE INDEX IF NOT EXISTS idx_api_key_index_key ON api_keys(index_key);
98+ CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
9299CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_external_api_key
93100 ON api_keys(apiId, index_key)
94101 WHERE source = ' external' AND index_key IS NOT NULL ;
95102
103+ -- Migration-safe column additions for existing deployments
104+ ALTER TABLE deployments ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
105+ ALTER TABLE certificates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
106+ ALTER TABLE llm_provider_templates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
107+ ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
108+
109+ ALTER TABLE deployments ALTER COLUMN gateway_id SET DEFAULT ' platform-gateway-id' ;
110+ UPDATE deployments SET gateway_id = ' platform-gateway-id' WHERE gateway_id IS NULL ;
111+ ALTER TABLE deployments ALTER COLUMN gateway_id SET NOT NULL ;
112+
113+ ALTER TABLE certificates ALTER COLUMN gateway_id SET DEFAULT ' platform-gateway-id' ;
114+ UPDATE certificates SET gateway_id = ' platform-gateway-id' WHERE gateway_id IS NULL ;
115+ ALTER TABLE certificates ALTER COLUMN gateway_id SET NOT NULL ;
116+
117+ ALTER TABLE llm_provider_templates ALTER COLUMN gateway_id SET DEFAULT ' platform-gateway-id' ;
118+ UPDATE llm_provider_templates SET gateway_id = ' platform-gateway-id' WHERE gateway_id IS NULL ;
119+ ALTER TABLE llm_provider_templates ALTER COLUMN gateway_id SET NOT NULL ;
120+
121+ ALTER TABLE api_keys ALTER COLUMN gateway_id SET DEFAULT ' platform-gateway-id' ;
122+ UPDATE api_keys SET gateway_id = ' platform-gateway-id' WHERE gateway_id IS NULL ;
123+ ALTER TABLE api_keys ALTER COLUMN gateway_id SET NOT NULL ;
124+
125+ ALTER TABLE deployments DROP CONSTRAINT IF EXISTS deployments_display_name_version_key;
126+ ALTER TABLE api_keys DROP CONSTRAINT IF EXISTS api_keys_apiid_name_key;
127+
128+ DO $$
129+ BEGIN
130+ IF NOT EXISTS (
131+ SELECT 1 FROM pg_constraint WHERE conname = ' deployments_display_name_version_gateway_id_key'
132+ ) THEN
133+ ALTER TABLE deployments
134+ ADD CONSTRAINT deployments_display_name_version_gateway_id_key
135+ UNIQUE (display_name, version, gateway_id);
136+ END IF;
137+ END $$;
138+
139+ DO $$
140+ BEGIN
141+ IF NOT EXISTS (
142+ SELECT 1 FROM pg_constraint WHERE conname = ' api_keys_apiid_name_gateway_id_key'
143+ ) THEN
144+ ALTER TABLE api_keys
145+ ADD CONSTRAINT api_keys_apiid_name_gateway_id_key
146+ UNIQUE (apiId, name, gateway_id);
147+ END IF;
148+ END $$;
149+
150+ CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
151+ CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
152+ CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
153+ CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
154+
96155-- Schema migration metadata
97156CREATE TABLE IF NOT EXISTS schema_migrations (
98157 id INTEGER PRIMARY KEY ,
0 commit comments