Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
2.6 kB · 71 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071import type {DbConcrete} from "./drizzle/drizzleUtils.ts";import { loggerNoop } from "../MaybeLogger.ts";import * as path from 'path';import { childLogger, type Logger } from "@foxxmd/logging";import { Migrator } from 'sqlite-up';import type {MigrationStatus} from "../infrastructure/Atomic.ts";import { projectRootDir } from "../infrastructure/Atomic.ts";
export interface MigrateBaseContext { db: DbConcrete logger: Logger}
const migrationsTable = '__app_migrations';
export const getAppMigrationStatus = async (db: DbConcrete, opts: {logger?: Logger, migrationsAppFolder?: string} = {}): Promise<MigrationStatus> => { const { logger: parentLogger = loggerNoop, migrationsAppFolder = path.resolve(projectRootDir, 'src/backend/common/database/appMigrations') } = opts; const logger = childLogger(parentLogger, 'App Migrations');
const migrator = new Migrator({ db: db.$client, migrationsDir: migrationsAppFolder, migrationsTable: migrationsTable });
const status = await migrator.status();
if(status.pending === 0) { return {backupRequired: false, pending: [], log: 'No pending app migrations.'}; }
const plan = await migrator.plan(); return {backupRequired: true, pending: plan.pendingMigrations, log: `${plan.pendingMigrations.length} pending app migrations:\n${plan.pendingMigrations.join('\n')}`};}
export const migrateApp = async (db: DbConcrete, opts: {logger?: Logger, migrationsAppFolder?: string} = {}): Promise<string[]> => { const { logger: parentLogger = loggerNoop, migrationsAppFolder = path.resolve(projectRootDir, 'src/backend/common/database/appMigrations') } = opts; const logger = childLogger(parentLogger, ['App', 'Migrations']);
const migrator = new Migrator<MigrateBaseContext>({ db: db.$client, migrationsDir: migrationsAppFolder, migrationsTable: migrationsTable });
migrator.on('migration:applied', function (name: string, batch: number): void { logger.verbose(`Migration Applied: "${name}" in batch ${batch}`); });
logger.info('Applying any app migrations...'); const result = await migrator.apply({db, logger});
if (!result.success) { throw new Error('App migration failed', {cause: result.error}); } else { if(result.appliedMigrations.length === 0) { logger.info('No app migrations required.'); } else { logger.info('App migrations applied!'); } }
return result.appliedMigrations;}