Files
alert-message-center/apps/server/src/db/migrate.ts
2026-01-15 21:10:25 +08:00

75 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { eq } from "drizzle-orm";
import { drizzle } from "drizzle-orm/postgres-js";
import { migrate } from "drizzle-orm/postgres-js/migrator";
import postgres from "postgres";
import * as schema from "./schema";
import { users } from "./schema";
const connectionString =
process.env.DATABASE_URL ||
"postgres://postgres:password@localhost:5432/alert_message_center";
export async function migrateUserTokens(db: ReturnType<typeof drizzle>) {
console.log("⏳ Checking for user tokens that need shortening...");
try {
const allUsers = await db.select().from(users);
let updatedCount = 0;
for (const user of allUsers) {
if (user.personalToken && user.personalToken.length > 8) {
const newToken = user.personalToken.substring(0, 8);
console.log(
`Updating user ${user.name}: ${user.personalToken} -> ${newToken}`,
);
await db
.update(users)
.set({ personalToken: newToken })
.where(eq(users.id, user.id));
updatedCount++;
}
}
if (updatedCount > 0) {
console.log(`✅ Updated ${updatedCount} user tokens.`);
} else {
console.log(" No tokens need shortening.");
}
} catch (error) {
console.error("❌ Failed to migrate user tokens:", error);
}
}
async function main() {
console.log("⏳ Running database migrations...");
const sql = postgres(connectionString, { max: 1 });
const db = drizzle(sql, { schema });
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const migrationsFolder = path.resolve(__dirname, "../../drizzle");
console.log(`📂 Migrations folder: ${migrationsFolder}`);
if (!fs.existsSync(migrationsFolder)) {
console.error(`❌ Migrations folder not found: ${migrationsFolder}`);
process.exit(1);
}
try {
await migrate(db, { migrationsFolder });
console.log("✅ Database migrations completed!");
await migrateUserTokens(db);
} catch (error) {
console.error("❌ Migration failed:", error);
process.exit(1);
} finally {
await sql.end();
}
}
// Only run main if this script is executed directly
if (import.meta.main) {
main();
}