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 ,
1011 kind TEXT NOT NULL ,
11- handle TEXT NOT NULL UNIQUE ,
12+ handle TEXT NOT NULL ,
1213 status TEXT NOT NULL CHECK (status IN (' pending' , ' deployed' , ' failed' )),
1314 created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
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),
19+ UNIQUE(handle, gateway_id)
1820);
1921
20- CREATE INDEX IF NOT EXISTS idx_name_version ON deployments(display_name, version);
2122CREATE INDEX IF NOT EXISTS idx_status ON deployments(status);
2223CREATE INDEX IF NOT EXISTS idx_context ON deployments(context);
2324CREATE INDEX IF NOT EXISTS idx_kind ON deployments(kind);
25+ CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
2426
2527-- Table for custom TLS certificates
2628CREATE TABLE IF NOT EXISTS certificates (
2729 id TEXT PRIMARY KEY ,
28- name TEXT NOT NULL UNIQUE,
30+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
31+ name TEXT NOT NULL ,
2932 certificate BYTEA NOT NULL ,
3033 subject TEXT NOT NULL ,
3134 issuer TEXT NOT NULL ,
3235 not_before TIMESTAMPTZ NOT NULL ,
3336 not_after TIMESTAMPTZ NOT NULL ,
3437 cert_count INTEGER NOT NULL DEFAULT 1 ,
3538 created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
36- updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
39+ updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
40+ UNIQUE(name, gateway_id)
3741);
3842
3943CREATE INDEX IF NOT EXISTS idx_cert_name ON certificates(name);
4044CREATE INDEX IF NOT EXISTS idx_cert_expiry ON certificates(not_after);
45+ CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
4146
4247-- Table for deployment-specific configurations
4348CREATE TABLE IF NOT EXISTS deployment_configs (
@@ -50,17 +55,21 @@ CREATE TABLE IF NOT EXISTS deployment_configs (
5055-- LLM Provider Templates table
5156CREATE TABLE IF NOT EXISTS llm_provider_templates (
5257 id TEXT PRIMARY KEY ,
53- handle TEXT NOT NULL UNIQUE,
58+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
59+ handle TEXT NOT NULL ,
5460 configuration TEXT NOT NULL ,
5561 created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
56- updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
62+ updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP ,
63+ UNIQUE(handle, gateway_id)
5764);
5865
5966CREATE INDEX IF NOT EXISTS idx_template_handle ON llm_provider_templates(handle);
67+ CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
6068
6169-- Table for API keys
6270CREATE TABLE IF NOT EXISTS api_keys (
6371 id TEXT PRIMARY KEY ,
72+ gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ,
6473 name TEXT NOT NULL ,
6574 api_key TEXT NOT NULL UNIQUE,
6675 masked_api_key TEXT NOT NULL ,
@@ -78,7 +87,7 @@ CREATE TABLE IF NOT EXISTS api_keys (
7887 index_key TEXT NULL ,
7988 display_name TEXT NOT NULL DEFAULT ' ' ,
8089 FOREIGN KEY (apiId) REFERENCES deployments(id) ON DELETE CASCADE ,
81- UNIQUE (apiId, name)
90+ UNIQUE (apiId, name, gateway_id )
8291);
8392
8493CREATE INDEX IF NOT EXISTS idx_api_key ON api_keys(api_key);
@@ -89,10 +98,83 @@ CREATE INDEX IF NOT EXISTS idx_created_by ON api_keys(created_by);
8998CREATE INDEX IF NOT EXISTS idx_api_key_source ON api_keys(source);
9099CREATE INDEX IF NOT EXISTS idx_api_key_external_ref ON api_keys(external_ref_id);
91100CREATE INDEX IF NOT EXISTS idx_api_key_index_key ON api_keys(index_key);
101+ CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
92102CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_external_api_key
93103 ON api_keys(apiId, index_key)
94104 WHERE source = ' external' AND index_key IS NOT NULL ;
95105
106+ -- Migration-safe column additions for existing deployments
107+ ALTER TABLE deployments ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
108+ ALTER TABLE certificates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
109+ ALTER TABLE llm_provider_templates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
110+ ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT ' platform-gateway-id' ;
111+
112+ ALTER TABLE deployments DROP CONSTRAINT IF EXISTS deployments_display_name_version_key;
113+ ALTER TABLE deployments DROP CONSTRAINT IF EXISTS deployments_handle_key;
114+ ALTER TABLE certificates DROP CONSTRAINT IF EXISTS certificates_name_key;
115+ ALTER TABLE llm_provider_templates DROP CONSTRAINT IF EXISTS llm_provider_templates_handle_key;
116+ ALTER TABLE api_keys DROP CONSTRAINT IF EXISTS api_keys_apiid_name_key;
117+
118+ DO $$
119+ BEGIN
120+ IF NOT EXISTS (
121+ SELECT 1 FROM pg_constraint WHERE conname = ' deployments_display_name_version_gateway_id_key'
122+ ) THEN
123+ ALTER TABLE deployments
124+ ADD CONSTRAINT deployments_display_name_version_gateway_id_key
125+ UNIQUE (display_name, version, gateway_id);
126+ END IF;
127+ END $$;
128+
129+ DO $$
130+ BEGIN
131+ IF NOT EXISTS (
132+ SELECT 1 FROM pg_constraint WHERE conname = ' deployments_handle_gateway_id_key'
133+ ) THEN
134+ ALTER TABLE deployments
135+ ADD CONSTRAINT deployments_handle_gateway_id_key
136+ UNIQUE (handle, gateway_id);
137+ END IF;
138+ END $$;
139+
140+ DO $$
141+ BEGIN
142+ IF NOT EXISTS (
143+ SELECT 1 FROM pg_constraint WHERE conname = ' certificates_name_gateway_id_key'
144+ ) THEN
145+ ALTER TABLE certificates
146+ ADD CONSTRAINT certificates_name_gateway_id_key
147+ UNIQUE (name, gateway_id);
148+ END IF;
149+ END $$;
150+
151+ DO $$
152+ BEGIN
153+ IF NOT EXISTS (
154+ SELECT 1 FROM pg_constraint WHERE conname = ' llm_provider_templates_handle_gateway_id_key'
155+ ) THEN
156+ ALTER TABLE llm_provider_templates
157+ ADD CONSTRAINT llm_provider_templates_handle_gateway_id_key
158+ UNIQUE (handle, gateway_id);
159+ END IF;
160+ END $$;
161+
162+ DO $$
163+ BEGIN
164+ IF NOT EXISTS (
165+ SELECT 1 FROM pg_constraint WHERE conname = ' api_keys_apiid_name_gateway_id_key'
166+ ) THEN
167+ ALTER TABLE api_keys
168+ ADD CONSTRAINT api_keys_apiid_name_gateway_id_key
169+ UNIQUE (apiId, name, gateway_id);
170+ END IF;
171+ END $$;
172+
173+ CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
174+ CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
175+ CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
176+ CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
177+
96178-- Schema migration metadata
97179CREATE TABLE IF NOT EXISTS schema_migrations (
98180 id INTEGER PRIMARY KEY ,
0 commit comments