From cb0885dd713bd4b6d1de9a494a69eba71992bfc3 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Mon, 4 Oct 2021 23:14:03 +0200 Subject: [PATCH] :sparkles: db migrate script --- util/src/entities/BaseClass.ts | 3 +- util/src/migrations/migrate_db_engine.ts | 47 ++++++++++++++++++++++++ util/src/util/Database.ts | 6 ++- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 util/src/migrations/migrate_db_engine.ts diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts index f105086a..beccf04b 100644 --- a/util/src/entities/BaseClass.ts +++ b/util/src/entities/BaseClass.ts @@ -15,7 +15,7 @@ import "missing-native-js-functions"; // btw. we don't use class-validator for everything, because we need to explicitly set the type instead of deriving it from typescript also it doesn't easily support nested objects export class BaseClassWithoutId extends BaseEntity { - constructor(private props?: any) { + constructor(props?: any) { super(); this.assign(props); } @@ -56,7 +56,6 @@ export class BaseClassWithoutId extends BaseEntity { @BeforeUpdate() @BeforeInsert() validate() { - this.assign(this.props); return this; } diff --git a/util/src/migrations/migrate_db_engine.ts b/util/src/migrations/migrate_db_engine.ts new file mode 100644 index 00000000..b2e71f94 --- /dev/null +++ b/util/src/migrations/migrate_db_engine.ts @@ -0,0 +1,47 @@ +import { config } from "dotenv"; +config(); +import * as Models from "../entities"; +import { User } from "../entities/User"; +import { createConnection, Connection } from "typeorm"; +import { initDatabase } from "../util/Database"; +import "missing-native-js-functions"; + +async function main() { + if (!process.env.FROM) throw new Error("FROM database env connection string not set"); + + // @ts-ignore + const entities = Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name); + + const newDB = await initDatabase(); + + // @ts-ignore + const oldDB = await createConnection({ + type: process.env.FROM.split(":")[0]?.replace("+srv", ""), + url: process.env.FROM, + entities, + name: "old", + }); + + await Promise.all( + entities.map(async (x) => { + const data = await oldDB.manager.find(User); + + await Promise.all( + data.map(async (x) => { + try { + await newDB.manager.insert(User, x); + } catch (error) { + if (!x.id) throw new Error("object doesn't have a unique id: " + x); + await newDB.manager.update(User, { id: x.id }, x); + } + }) + ); + // @ts-ignore + console.log("migrated all " + x.name); + }) + ); + + console.log("SUCCESS migrated all data"); +} + +main().caught(); diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts index 6445bd60..5f057053 100644 --- a/util/src/util/Database.ts +++ b/util/src/util/Database.ts @@ -11,7 +11,7 @@ var promise: Promise; var dbConnection: Connection | undefined; let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db"); -export function initDatabase() { +export function initDatabase(): Promise { if (promise) return promise; // prevent initalizing multiple times const type = dbConnectionString.includes(":") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite"; @@ -23,7 +23,8 @@ export function initDatabase() { type, url: isSqlite ? undefined : dbConnectionString, database: isSqlite ? dbConnectionString : undefined, - entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"), + // @ts-ignore + entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name), synchronize: type !== "mongodb", logging: false, cache: { @@ -31,6 +32,7 @@ export function initDatabase() { }, bigNumberStrings: false, supportBigNumbers: true, + name: "default", }); promise.then((connection) => {