From 310dd115b2d8274b6cd2c537db60399a760c25fe Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 14 Feb 2026 01:30:51 +0800 Subject: [PATCH] chore(db): keep drizzle migrations folder journal-only --- lib/db/migrate.ts | 39 +++++++++++++++++++ .../0010_add_qianwen_video_provider.sql | 0 .../0011_add_site_settings_and_nav_links.sql | 0 .../0011_add_user_name.sql | 0 .../0012_add_auth_settings.sql | 0 .../0013_add_login_token.sql | 0 .../0014_add_site_logo_dark.sql | 0 .../0016_add_show_auto_model.sql | 0 .../0017_add_volcano_vision_provider.sql | 0 .../0018_add_volcano_video_support.sql | 0 .../0019_add_sub_model_support.sql | 0 .../0020_add_usage_time_limit.sql | 0 .../0021_add_generated_image.sql | 0 .../0022_add_monthly_image_limit.sql | 0 .../0023_add_featured_and_department.sql | 0 .../0024_add_dingtalk_userid.sql | 0 .../0025_add_dingtalk_organizations.sql | 0 .../0026_add_fallback_model_ids.sql | 0 18 files changed, 39 insertions(+) rename lib/db/{migrations => migrations_legacy}/0010_add_qianwen_video_provider.sql (100%) rename lib/db/{migrations => migrations_legacy}/0011_add_site_settings_and_nav_links.sql (100%) rename lib/db/{migrations => migrations_legacy}/0011_add_user_name.sql (100%) rename lib/db/{migrations => migrations_legacy}/0012_add_auth_settings.sql (100%) rename lib/db/{migrations => migrations_legacy}/0013_add_login_token.sql (100%) rename lib/db/{migrations => migrations_legacy}/0014_add_site_logo_dark.sql (100%) rename lib/db/{migrations => migrations_legacy}/0016_add_show_auto_model.sql (100%) rename lib/db/{migrations => migrations_legacy}/0017_add_volcano_vision_provider.sql (100%) rename lib/db/{migrations => migrations_legacy}/0018_add_volcano_video_support.sql (100%) rename lib/db/{migrations => migrations_legacy}/0019_add_sub_model_support.sql (100%) rename lib/db/{migrations => migrations_legacy}/0020_add_usage_time_limit.sql (100%) rename lib/db/{migrations => migrations_legacy}/0021_add_generated_image.sql (100%) rename lib/db/{migrations => migrations_legacy}/0022_add_monthly_image_limit.sql (100%) rename lib/db/{migrations => migrations_legacy}/0023_add_featured_and_department.sql (100%) rename lib/db/{migrations => migrations_legacy}/0024_add_dingtalk_userid.sql (100%) rename lib/db/{migrations => migrations_legacy}/0025_add_dingtalk_organizations.sql (100%) rename lib/db/{migrations => migrations_legacy}/0026_add_fallback_model_ids.sql (100%) diff --git a/lib/db/migrate.ts b/lib/db/migrate.ts index 462042b46..5144e0092 100644 --- a/lib/db/migrate.ts +++ b/lib/db/migrate.ts @@ -3,11 +3,49 @@ import { sql } from "drizzle-orm"; import { drizzle } from "drizzle-orm/postgres-js"; import { migrate } from "drizzle-orm/postgres-js/migrator"; import postgres from "postgres"; +import { readFileSync, readdirSync } from "node:fs"; +import { join } from "node:path"; config({ path: ".env.local", }); +function assertMigrationJournalIsConsistent() { + const migrationsDir = join(process.cwd(), "lib/db/migrations"); + const journalPath = join(migrationsDir, "meta", "_journal.json"); + const journal = JSON.parse(readFileSync(journalPath, "utf8")) as { + entries: { tag: string }[]; + }; + + const tags = new Set(journal.entries.map((entry) => entry.tag)); + const sqlFiles = readdirSync(migrationsDir) + .filter((file) => file.endsWith(".sql")) + .map((file) => file.slice(0, -4)); + const sqlSet = new Set(sqlFiles); + + const extraSqlFiles = sqlFiles.filter((tag) => !tags.has(tag)); + const missingSqlFiles = Array.from(tags).filter((tag) => !sqlSet.has(tag)); + + if (extraSqlFiles.length === 0 && missingSqlFiles.length === 0) { + return; + } + + const details = [ + extraSqlFiles.length > 0 + ? `extra sql files not in journal: ${extraSqlFiles.join(", ")}` + : null, + missingSqlFiles.length > 0 + ? `journal entries missing sql files: ${missingSqlFiles.join(", ")}` + : null, + ] + .filter(Boolean) + .join(" | "); + + throw new Error( + `Migration journal mismatch. Keep lib/db/migrations/*.sql in sync with meta/_journal.json. ${details}` + ); +} + const runMigrate = async () => { if (!process.env.POSTGRES_URL) { throw new Error("POSTGRES_URL is not defined"); @@ -19,6 +57,7 @@ const runMigrate = async () => { console.log("⏳ Running migrations..."); const start = Date.now(); + assertMigrationJournalIsConsistent(); await migrate(db, { migrationsFolder: "./lib/db/migrations" }); await db.execute(sql` ALTER TABLE "AiProvider" DROP CONSTRAINT IF EXISTS "AiProvider_type_check"; diff --git a/lib/db/migrations/0010_add_qianwen_video_provider.sql b/lib/db/migrations_legacy/0010_add_qianwen_video_provider.sql similarity index 100% rename from lib/db/migrations/0010_add_qianwen_video_provider.sql rename to lib/db/migrations_legacy/0010_add_qianwen_video_provider.sql diff --git a/lib/db/migrations/0011_add_site_settings_and_nav_links.sql b/lib/db/migrations_legacy/0011_add_site_settings_and_nav_links.sql similarity index 100% rename from lib/db/migrations/0011_add_site_settings_and_nav_links.sql rename to lib/db/migrations_legacy/0011_add_site_settings_and_nav_links.sql diff --git a/lib/db/migrations/0011_add_user_name.sql b/lib/db/migrations_legacy/0011_add_user_name.sql similarity index 100% rename from lib/db/migrations/0011_add_user_name.sql rename to lib/db/migrations_legacy/0011_add_user_name.sql diff --git a/lib/db/migrations/0012_add_auth_settings.sql b/lib/db/migrations_legacy/0012_add_auth_settings.sql similarity index 100% rename from lib/db/migrations/0012_add_auth_settings.sql rename to lib/db/migrations_legacy/0012_add_auth_settings.sql diff --git a/lib/db/migrations/0013_add_login_token.sql b/lib/db/migrations_legacy/0013_add_login_token.sql similarity index 100% rename from lib/db/migrations/0013_add_login_token.sql rename to lib/db/migrations_legacy/0013_add_login_token.sql diff --git a/lib/db/migrations/0014_add_site_logo_dark.sql b/lib/db/migrations_legacy/0014_add_site_logo_dark.sql similarity index 100% rename from lib/db/migrations/0014_add_site_logo_dark.sql rename to lib/db/migrations_legacy/0014_add_site_logo_dark.sql diff --git a/lib/db/migrations/0016_add_show_auto_model.sql b/lib/db/migrations_legacy/0016_add_show_auto_model.sql similarity index 100% rename from lib/db/migrations/0016_add_show_auto_model.sql rename to lib/db/migrations_legacy/0016_add_show_auto_model.sql diff --git a/lib/db/migrations/0017_add_volcano_vision_provider.sql b/lib/db/migrations_legacy/0017_add_volcano_vision_provider.sql similarity index 100% rename from lib/db/migrations/0017_add_volcano_vision_provider.sql rename to lib/db/migrations_legacy/0017_add_volcano_vision_provider.sql diff --git a/lib/db/migrations/0018_add_volcano_video_support.sql b/lib/db/migrations_legacy/0018_add_volcano_video_support.sql similarity index 100% rename from lib/db/migrations/0018_add_volcano_video_support.sql rename to lib/db/migrations_legacy/0018_add_volcano_video_support.sql diff --git a/lib/db/migrations/0019_add_sub_model_support.sql b/lib/db/migrations_legacy/0019_add_sub_model_support.sql similarity index 100% rename from lib/db/migrations/0019_add_sub_model_support.sql rename to lib/db/migrations_legacy/0019_add_sub_model_support.sql diff --git a/lib/db/migrations/0020_add_usage_time_limit.sql b/lib/db/migrations_legacy/0020_add_usage_time_limit.sql similarity index 100% rename from lib/db/migrations/0020_add_usage_time_limit.sql rename to lib/db/migrations_legacy/0020_add_usage_time_limit.sql diff --git a/lib/db/migrations/0021_add_generated_image.sql b/lib/db/migrations_legacy/0021_add_generated_image.sql similarity index 100% rename from lib/db/migrations/0021_add_generated_image.sql rename to lib/db/migrations_legacy/0021_add_generated_image.sql diff --git a/lib/db/migrations/0022_add_monthly_image_limit.sql b/lib/db/migrations_legacy/0022_add_monthly_image_limit.sql similarity index 100% rename from lib/db/migrations/0022_add_monthly_image_limit.sql rename to lib/db/migrations_legacy/0022_add_monthly_image_limit.sql diff --git a/lib/db/migrations/0023_add_featured_and_department.sql b/lib/db/migrations_legacy/0023_add_featured_and_department.sql similarity index 100% rename from lib/db/migrations/0023_add_featured_and_department.sql rename to lib/db/migrations_legacy/0023_add_featured_and_department.sql diff --git a/lib/db/migrations/0024_add_dingtalk_userid.sql b/lib/db/migrations_legacy/0024_add_dingtalk_userid.sql similarity index 100% rename from lib/db/migrations/0024_add_dingtalk_userid.sql rename to lib/db/migrations_legacy/0024_add_dingtalk_userid.sql diff --git a/lib/db/migrations/0025_add_dingtalk_organizations.sql b/lib/db/migrations_legacy/0025_add_dingtalk_organizations.sql similarity index 100% rename from lib/db/migrations/0025_add_dingtalk_organizations.sql rename to lib/db/migrations_legacy/0025_add_dingtalk_organizations.sql diff --git a/lib/db/migrations/0026_add_fallback_model_ids.sql b/lib/db/migrations_legacy/0026_add_fallback_model_ids.sql similarity index 100% rename from lib/db/migrations/0026_add_fallback_model_ids.sql rename to lib/db/migrations_legacy/0026_add_fallback_model_ids.sql