Skip to content

Commit 077d234

Browse files
chore(db): squash managed MCP migration
1 parent e1a6e22 commit 077d234

7 files changed

Lines changed: 59 additions & 41858 deletions
Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,52 @@
1-
-- Adds the managed MCP credential type separately from the storage migration. PostgreSQL cannot
2-
-- use a new enum label in an index predicate until the transaction that introduced it commits.
3-
ALTER TYPE "public"."credential_type" ADD VALUE IF NOT EXISTS 'managed_mcp' BEFORE 'env_workspace';
1+
-- Pure expand: every new column is nullable, and no managed_mcp row can predate this migration.
2+
ALTER TYPE "public"."credential_type" ADD VALUE IF NOT EXISTS 'managed_mcp' BEFORE 'env_workspace';--> statement-breakpoint
3+
ALTER TABLE "credential" ADD COLUMN IF NOT EXISTS "mcp_server_id" text;--> statement-breakpoint
4+
ALTER TABLE "credential" ADD COLUMN IF NOT EXISTS "mcp_tools" jsonb;--> statement-breakpoint
5+
ALTER TABLE "credential" ADD COLUMN IF NOT EXISTS "mcp_tools_refreshed_at" timestamp;--> statement-breakpoint
6+
ALTER TABLE "mcp_servers" ADD COLUMN IF NOT EXISTS "credential_group_id" text;--> statement-breakpoint
7+
8+
-- NOT VALID avoids scanning existing tables while the foreign keys are installed. The new
9+
-- nullable columns contain no values, so validation is immediate and safe.
10+
ALTER TABLE "credential" ADD CONSTRAINT "credential_mcp_server_id_mcp_servers_id_fk" FOREIGN KEY ("mcp_server_id") REFERENCES "public"."mcp_servers"("id") ON DELETE cascade ON UPDATE no action NOT VALID;--> statement-breakpoint
11+
ALTER TABLE "credential" VALIDATE CONSTRAINT "credential_mcp_server_id_mcp_servers_id_fk";--> statement-breakpoint
12+
ALTER TABLE "mcp_servers" ADD CONSTRAINT "mcp_servers_credential_group_id_credential_group_id_fk" FOREIGN KEY ("credential_group_id") REFERENCES "public"."credential_group"("id") ON DELETE set null ON UPDATE no action NOT VALID;--> statement-breakpoint
13+
ALTER TABLE "mcp_servers" VALIDATE CONSTRAINT "mcp_servers_credential_group_id_credential_group_id_fk";--> statement-breakpoint
14+
15+
ALTER TABLE "credential" ADD CONSTRAINT "credential_managed_mcp_source_check" CHECK ((type::text <> 'managed_mcp') OR (
16+
id LIKE 'mcp-cg-%'
17+
AND account_id IS NULL
18+
AND provider_id IS NULL
19+
AND authorization_app_id IS NULL
20+
AND credential_group_enrollment_id IS NOT NULL
21+
AND credential_group_option_id IS NULL
22+
AND mcp_server_id IS NOT NULL
23+
AND managed_oauth_status IS NOT NULL
24+
AND (managed_oauth_status <> 'active' OR (
25+
encrypted_oauth_token_set IS NOT NULL
26+
AND mcp_tools IS NOT NULL
27+
))
28+
AND granted_at IS NOT NULL
29+
AND managed_oauth_scope_version IS NULL
30+
AND provider_subject_id IS NULL
31+
AND provider_tenant_id IS NULL
32+
AND granted_scopes IS NULL
33+
AND provider_metadata IS NULL
34+
AND created_by IS NULL
35+
AND env_key IS NULL
36+
AND env_owner_user_id IS NULL
37+
AND encrypted_service_account_key IS NULL
38+
AND unredacted = false
39+
)) NOT VALID;--> statement-breakpoint
40+
ALTER TABLE "credential" VALIDATE CONSTRAINT "credential_managed_mcp_source_check";--> statement-breakpoint
41+
ALTER TABLE "credential" ADD CONSTRAINT "credential_creator_source_check" CHECK ((type::text = 'managed_mcp') OR created_by IS NOT NULL) NOT VALID;--> statement-breakpoint
42+
ALTER TABLE "credential" VALIDATE CONSTRAINT "credential_creator_source_check";--> statement-breakpoint
43+
ALTER TABLE "credential" ALTER COLUMN "created_by" DROP NOT NULL;--> statement-breakpoint
44+
45+
-- The commit makes the new enum label visible and moves the index builds outside the migration
46+
-- runner's transaction, as required by PostgreSQL for the partial and concurrent indexes.
47+
COMMIT;--> statement-breakpoint
48+
SET lock_timeout = 0;--> statement-breakpoint
49+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "credential_mcp_server_idx" ON "credential" USING btree ("mcp_server_id");--> statement-breakpoint
50+
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS "credential_managed_mcp_enrollment_server_unique" ON "credential" USING btree ("credential_group_enrollment_id","mcp_server_id") WHERE "credential"."type" = 'managed_mcp';--> statement-breakpoint
51+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "mcp_servers_credential_group_idx" ON "mcp_servers" USING btree ("credential_group_id");--> statement-breakpoint
52+
SET lock_timeout = '5s';

packages/db/migrations/0316_credential_group_managed_mcp_constraints.sql

Lines changed: 0 additions & 47 deletions
This file was deleted.

packages/db/migrations/0317_managed_mcp_external_identity.sql

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/db/migrations/meta/0315_snapshot.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3022,7 +3022,7 @@
30223022
"name": "created_by",
30233023
"type": "text",
30243024
"primaryKey": false,
3025-
"notNull": true
3025+
"notNull": false
30263026
},
30273027
"created_at": {
30283028
"name": "created_at",
@@ -3340,15 +3340,19 @@
33403340
},
33413341
"credential_managed_oauth_source_check": {
33423342
"name": "credential_managed_oauth_source_check",
3343-
"value": "(type::text <> 'managed_oauth') OR (\n account_id IS NULL\n AND provider_id IS NOT NULL\n AND authorization_app_id IS NOT NULL\n AND provider_subject_id IS NOT NULL\n AND managed_oauth_status IS NOT NULL\n AND granted_scopes IS NOT NULL\n AND cardinality(granted_scopes) > 0\n AND (managed_oauth_status <> 'active' OR encrypted_oauth_token_set IS NOT NULL)\n AND granted_at IS NOT NULL\n )"
3343+
"value": "(type::text <> 'managed_oauth') OR (\n account_id IS NULL\n AND provider_id IS NOT NULL\n AND authorization_app_id IS NOT NULL\n AND provider_subject_id IS NOT NULL\n AND managed_oauth_status IS NOT NULL\n AND granted_scopes IS NOT NULL\n AND cardinality(granted_scopes) > 0\n AND encrypted_oauth_token_set IS NOT NULL\n AND granted_at IS NOT NULL\n )"
33443344
},
33453345
"credential_managed_oauth_group_binding_check": {
33463346
"name": "credential_managed_oauth_group_binding_check",
33473347
"value": "(type::text <> 'managed_oauth') OR (\n credential_group_enrollment_id IS NOT NULL\n AND credential_group_option_id IS NOT NULL\n AND managed_oauth_scope_version IS NOT NULL\n AND managed_oauth_scope_version > 0\n )"
33483348
},
33493349
"credential_managed_mcp_source_check": {
33503350
"name": "credential_managed_mcp_source_check",
3351-
"value": "(type::text <> 'managed_mcp') OR (\n account_id IS NULL\n AND provider_id IS NULL\n AND authorization_app_id IS NULL\n AND credential_group_enrollment_id IS NOT NULL\n AND credential_group_option_id IS NULL\n AND mcp_server_id IS NOT NULL\n AND managed_oauth_status IS NOT NULL\n AND encrypted_oauth_token_set IS NOT NULL\n AND granted_at IS NOT NULL\n AND env_key IS NULL\n AND env_owner_user_id IS NULL\n AND encrypted_service_account_key IS NULL\n AND unredacted = false\n )"
3351+
"value": "(type::text <> 'managed_mcp') OR (\n id LIKE 'mcp-cg-%'\n AND account_id IS NULL\n AND provider_id IS NULL\n AND authorization_app_id IS NULL\n AND credential_group_enrollment_id IS NOT NULL\n AND credential_group_option_id IS NULL\n AND mcp_server_id IS NOT NULL\n AND managed_oauth_status IS NOT NULL\n AND (managed_oauth_status <> 'active' OR (\n encrypted_oauth_token_set IS NOT NULL\n AND mcp_tools IS NOT NULL\n ))\n AND granted_at IS NOT NULL\n AND managed_oauth_scope_version IS NULL\n AND provider_subject_id IS NULL\n AND provider_tenant_id IS NULL\n AND granted_scopes IS NULL\n AND provider_metadata IS NULL\n AND created_by IS NULL\n AND env_key IS NULL\n AND env_owner_user_id IS NULL\n AND encrypted_service_account_key IS NULL\n AND unredacted = false\n )"
3352+
},
3353+
"credential_creator_source_check": {
3354+
"name": "credential_creator_source_check",
3355+
"value": "(type::text = 'managed_mcp') OR created_by IS NOT NULL"
33523356
},
33533357
"credential_workspace_env_source_check": {
33543358
"name": "credential_workspace_env_source_check",

0 commit comments

Comments
 (0)