feat(database): show information about migration status

Co-authored-by: Philip Molares <philip.molares@udo.edu>
Signed-off-by: Philip Molares <philip.molares@udo.edu>
Signed-off-by: Erik Michelson <github@erik.michelson.eu>
This commit is contained in:
Erik Michelson 2025-05-28 19:49:06 +02:00
parent 6e39b445e5
commit 04d19ebfbc
No known key found for this signature in database
GPG key ID: DB99ADDDC5C0AF82
2 changed files with 58 additions and 3 deletions

View file

@ -15,6 +15,7 @@ import { AuthConfig } from './config/auth.config';
import { MediaConfig } from './config/media.config';
import { ErrorExceptionMapping } from './errors/error-mapping';
import { ConsoleLoggerService } from './logger/console-logger.service';
import { runMigrations } from './migrate';
import { SessionService } from './sessions/session.service';
import { setupSessionMiddleware } from './utils/session';
import { setupValidationPipe } from './utils/setup-pipes';
@ -44,11 +45,9 @@ export async function setupApp(
);
}
logger.log('Starting database migrations... ', 'AppBootstrap');
const knexConnectionToken = getConnectionToken();
const knex: Knex = app.get<Knex>(knexConnectionToken);
await knex.migrate.latest();
logger.log('Finished database migrations... ', 'AppBootstrap');
await runMigrations(knex, logger);
// Setup session handling
setupSessionMiddleware(

56
backend/src/migrate.ts Normal file
View file

@ -0,0 +1,56 @@
/*
* SPDX-FileCopyrightText: 2025 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Knex } from 'knex';
import { ConsoleLoggerService } from './logger/console-logger.service';
interface CompletedMigration {
name: string;
}
interface PendingMigration {
file: string;
directory: string;
}
/**
* Runs the database migrations and informs the user about already completed and still pending ones
*
* @param knex The configured Knex instance to use
* @param logger The console logger service to use
*/
export async function runMigrations(
knex: Knex,
logger: ConsoleLoggerService,
): Promise<void> {
logger.log('Checking for pending database migrations... ', 'runMigrations');
try {
const [completedMigrations, pendingMigrations] =
(await knex.migrate.list()) as [CompletedMigration[], PendingMigration[]];
logger.log(
`Found ${completedMigrations.length} already completed migrations and ${pendingMigrations.length} pending migrations.`,
'runMigrations',
);
for (const migration of completedMigrations) {
logger.log(
`Already applied migration ${migration.name}`,
'runMigrations',
);
}
for (const migration of pendingMigrations) {
logger.log(`Applying migration ${migration.file}`, 'runMigrations');
await knex.migrate.up();
logger.log('✅', 'runMigrations');
}
} catch (error: unknown) {
logger.error(
`Error while migrating database: ${String(error)}`,
'runMigrations',
);
}
logger.log('Finished database migrations... ', 'runMigrations');
}