UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

87 lines (86 loc) 4.15 kB
//#region src/database/migrations/20260512B-add-mcp-oauth.ts async function up(knex) { await knex.schema.alterTable("directus_settings", (table) => { table.boolean("mcp_oauth_enabled").defaultTo(false).notNullable(); table.boolean("mcp_oauth_dcr_enabled").defaultTo(false).notNullable(); table.boolean("mcp_oauth_cimd_enabled").defaultTo(false).notNullable(); }); await knex.schema.createTable("directus_oauth_clients", (table) => { table.string("client_id", 255).primary().notNullable(); table.string("client_name", 200).notNullable(); table.json("redirect_uris").notNullable(); table.json("grant_types").notNullable(); table.string("token_endpoint_auth_method").notNullable().defaultTo("none"); table.string("client_secret_hash", 64).nullable(); table.string("registration_type", 10).notNullable().defaultTo("dcr"); table.text("client_uri").nullable(); table.text("logo_uri").nullable(); table.text("tos_uri").nullable(); table.text("policy_uri").nullable(); table.timestamp("metadata_fetched_at").nullable(); table.timestamp("metadata_expires_at").nullable(); table.string("metadata_etag", 255).nullable(); table.timestamp("date_created").notNullable().defaultTo(knex.fn.now()).index(); }); await knex.schema.createTable("directus_oauth_consents", (table) => { table.uuid("id").primary().notNullable(); table.uuid("user").notNullable().references("id").inTable("directus_users").onDelete("CASCADE"); table.string("client", 255).notNullable().references("client_id").inTable("directus_oauth_clients").onDelete("CASCADE"); table.string("redirect_uri", 255).notNullable(); table.string("scope").nullable(); table.timestamp("date_created").notNullable(); table.timestamp("date_updated").notNullable(); table.unique([ "user", "client", "redirect_uri" ]); table.index("client"); }); await knex.schema.createTable("directus_oauth_codes", (table) => { table.uuid("id").primary().notNullable(); table.string("code_hash", 64).notNullable().unique(); table.string("client", 255).notNullable().references("client_id").inTable("directus_oauth_clients").onDelete("CASCADE"); table.uuid("user").notNullable().references("id").inTable("directus_users").onDelete("CASCADE"); table.string("redirect_uri", 255).notNullable(); table.string("resource").notNullable(); table.string("code_challenge", 128).notNullable(); table.string("code_challenge_method", 10).notNullable(); table.string("scope").nullable(); table.timestamp("expires_at").notNullable().index(); table.timestamp("used_at").nullable().index(); }); await knex.schema.createTable("directus_oauth_tokens", (table) => { table.uuid("id").primary().notNullable(); table.string("client", 255).notNullable().references("client_id").inTable("directus_oauth_clients").onDelete("CASCADE"); table.uuid("user").notNullable().references("id").inTable("directus_users").onDelete("CASCADE"); table.string("session", 64).notNullable().index(); table.string("previous_session", 64).nullable().index(); table.string("resource").notNullable(); table.string("code_hash", 64).notNullable().index(); table.string("scope").nullable(); table.timestamp("expires_at").notNullable().index(); table.timestamp("date_created").notNullable(); table.unique(["client", "user"]); }); await knex.schema.alterTable("directus_sessions", (table) => { table.string("oauth_client", 255).nullable().references("client_id").inTable("directus_oauth_clients").onDelete("CASCADE").index(); }); } async function down(knex) { await knex.schema.alterTable("directus_sessions", (table) => { table.dropForeign("oauth_client"); table.dropColumn("oauth_client"); }); await knex.schema.dropTable("directus_oauth_tokens"); await knex.schema.dropTable("directus_oauth_codes"); await knex.schema.dropTable("directus_oauth_consents"); await knex.schema.dropTable("directus_oauth_clients"); await knex.schema.alterTable("directus_settings", (table) => { table.dropColumn("mcp_oauth_enabled"); table.dropColumn("mcp_oauth_dcr_enabled"); table.dropColumn("mcp_oauth_cimd_enabled"); }); } //#endregion export { down, up };