From e4fdf4e197a8f7007b50d0e49f622947ffa82a9f Mon Sep 17 00:00:00 2001 From: boufni95 Date: Thu, 21 Dec 2023 19:31:38 +0100 Subject: [PATCH] migrate with command --- src/index.ts | 9 +++++- src/services/storage/db.ts | 27 +++++----------- src/services/storage/index.ts | 6 ++-- src/services/storage/migrations/runner.ts | 38 +++++++++++++++++++++++ 4 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 src/services/storage/migrations/runner.ts diff --git a/src/index.ts b/src/index.ts index 5e05c5e1..93ac691d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,11 +6,18 @@ import Main, { LoadMainSettingsFromEnv } from './services/main/index.js' import Storage from './services/storage/index.js' import { LoadNosrtSettingsFromEnv } from './services/nostr/index.js' import nostrMiddleware from './nostrMiddleware.js' +import { TypeOrmMigrationRunner } from './services/storage/migrations/runner.js'; +import { getLogger } from './services/helpers/logger.js'; const start = async () => { + const log = getLogger({}) const mainSettings = LoadMainSettingsFromEnv() const storageManager = new Storage(mainSettings.storageSettings) - await storageManager.Connect() + const manualMigration = await TypeOrmMigrationRunner(log, storageManager, mainSettings.storageSettings.dbSettings, process.argv[2]) + if (manualMigration) { + log("migrations run sucessfully, exiting") + return + } const mainHandler = new Main(mainSettings, storageManager) await mainHandler.lnd.Warmup() const serverMethods = GetServerMethods(mainHandler) diff --git a/src/services/storage/db.ts b/src/services/storage/db.ts index 5c60da51..0754bd13 100644 --- a/src/services/storage/db.ts +++ b/src/services/storage/db.ts @@ -1,5 +1,5 @@ import "reflect-metadata" -import { DataSource } from "typeorm" +import { DataSource, Migration } from "typeorm" import { AddressReceivingTransaction } from "./entity/AddressReceivingTransaction.js" import { User } from "./entity/User.js" import { UserReceivingAddress } from "./entity/UserReceivingAddress.js" @@ -24,20 +24,16 @@ import { LndMetrics1703170330183 } from "./migrations/1703170330183-lnd_metrics. export type DbSettings = { databaseFile: string migrate: boolean - doInitialMigration: boolean } export const LoadDbSettingsFromEnv = (test = false): DbSettings => { return { databaseFile: test ? ":memory:" : EnvMustBeNonEmptyString("DATABASE_FILE"), migrate: process.env.MIGRATE_DB === 'true' || false, - doInitialMigration: process.env.DO_INITIAL_MIGRATION === 'true' || false } } -export default async (settings: DbSettings) => { - const migrations = settings.doInitialMigration ? [Initial1703170309875] : [] - migrations.push(LndMetrics1703170330183) - const s = await new DataSource({ +export default async (settings: DbSettings, migrations: Function[]): Promise<{ source: DataSource, executedMigrations: Migration[] }> => { + const source = await new DataSource({ type: "sqlite", database: settings.databaseFile, // logging: true, @@ -47,18 +43,11 @@ export default async (settings: DbSettings) => { migrations }).initialize() const log = getLogger({}) - - const pendingMigrations = await s.showMigrations() + const pendingMigrations = await source.showMigrations() if (pendingMigrations) { - if (!settings.migrate) { - throw new Error("pending migrations found, run with: MIGRATE_DB=true") - } else { - log("migrations found, migrating...") - const migrations = await s.runMigrations() - log(migrations) - } + log("migrations found, migrating...") + const executedMigrations = await source.runMigrations({ transaction: 'all' }) + return { source, executedMigrations } } - await s.getRepository(RoutingEvent).find() - await s.getRepository(Application).find() - return s + return { source, executedMigrations: [] } } \ No newline at end of file diff --git a/src/services/storage/index.ts b/src/services/storage/index.ts index c8c6af9c..3df3573b 100644 --- a/src/services/storage/index.ts +++ b/src/services/storage/index.ts @@ -26,13 +26,15 @@ export default class { constructor(settings: StorageSettings) { this.settings = settings } - async Connect() { - this.DB = await NewDB(this.settings.dbSettings) + async Connect(migrations: Function[]) { + const { source, executedMigrations } = await NewDB(this.settings.dbSettings, migrations) + this.DB = source this.userStorage = new UserStorage(this.DB) this.productStorage = new ProductStorage(this.DB) this.applicationStorage = new ApplicationStorage(this.DB, this.userStorage) this.paymentStorage = new PaymentStorage(this.DB, this.userStorage) this.metricsStorage = new MetricsStorage(this.DB) + return executedMigrations } StartTransaction(exec: TX) { diff --git a/src/services/storage/migrations/runner.ts b/src/services/storage/migrations/runner.ts new file mode 100644 index 00000000..54c6d79f --- /dev/null +++ b/src/services/storage/migrations/runner.ts @@ -0,0 +1,38 @@ +import { PubLogger } from '../../helpers/logger.js' +import { DbSettings } from '../db.js' +import Storage, { StorageSettings } from '../index.js' +import { Initial1703170309875 } from './1703170309875-initial.js' +import { LndMetrics1703170330183 } from './1703170330183-lnd_metrics.js' +const allMigrations = [Initial1703170309875, LndMetrics1703170330183] +export const TypeOrmMigrationRunner = async (log: PubLogger, storageManager: Storage, settings: DbSettings, arg: string | undefined): Promise => { + if (arg === 'initial_migration') { + await connectAndMigrate(log, storageManager, true, settings, [Initial1703170309875]) + return true + } else if (arg === 'lnd_metrics_migration') { + await connectAndMigrate(log, storageManager, true, settings, [LndMetrics1703170330183]) + return true + } else if (arg === 'all_migrations') { + await connectAndMigrate(log, storageManager, true, settings, allMigrations) + return true + } else if (settings.migrate) { + await connectAndMigrate(log, storageManager, false, settings, allMigrations) + return false + } + await connectAndMigrate(log, storageManager, false, settings, []) + return false +} + +const connectAndMigrate = async (log: PubLogger, storageManager: Storage, manual: boolean, settings: DbSettings, migrations: Function[]) => { + if (manual && settings.migrate) { + throw new Error("auto migration is enabled, no need to run manual migration") + } + if (migrations.length > 0) { + log("will add", migrations.length, "typeorm migrations...") + } + const executedMigrations = await storageManager.Connect(migrations) + if (migrations.length > 0) { + log(executedMigrations.length, "of", migrations.length, "migrations were executed correctly") + log(executedMigrations) + } + +} \ No newline at end of file