X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Fmigrator.ts;h=7ac20127e866a0deee77d6179b0ea8c1706fb5e5;hb=5752683ea518abfeaeb33adead3cb5541616e835;hp=379d43af528f0e16456dd9e8c7a635870620dadf;hpb=4d4e5cd4dca78480ec7f40e747f424cd107376a4;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/migrator.ts b/server/initializers/migrator.ts index 379d43af5..7ac20127e 100644 --- a/server/initializers/migrator.ts +++ b/server/initializers/migrator.ts @@ -1,71 +1,52 @@ -import { waterfall, eachSeries } from 'async' -import * as fs from 'fs' -import * as path from 'path' -import * as Sequelize from 'sequelize' - -import { database as db } from './database' +import { readdir } from 'fs-extra' +import { join } from 'path' +import { QueryTypes } from 'sequelize' +import { logger } from '../helpers/logger' import { LAST_MIGRATION_VERSION } from './constants' -import { logger } from '../helpers' -import { ApplicationInstance } from '../models' - -function migrate (finalCallback) { - waterfall([ - - function checkApplicationTableExists (callback) { - db.sequelize.getQueryInterface().showAllTables().asCallback(function (err, tables) { - if (err) return callback(err) - - // No tables, we don't need to migrate anything - // The installer will do that - if (tables.length === 0) return finalCallback(null) +import { sequelizeTypescript } from './database' - return callback(null) - }) - }, +async function migrate () { + const tables = await sequelizeTypescript.getQueryInterface().showAllTables() - function loadMigrationVersion (callback) { - db.Application.loadMigrationVersion(callback) - }, + // No tables, we don't need to migrate anything + // The installer will do that + if (tables.length === 0) return - function createMigrationRowIfNotExists (actualVersion, callback) { - if (actualVersion === null) { - db.Application.create({ - migrationVersion: 0 - }, function (err) { - return callback(err, 0) - }) - } + let actualVersion: number | null = null - return callback(null, actualVersion) - }, + const query = 'SELECT "migrationVersion" FROM "application"' + const options = { + type: QueryTypes.SELECT as QueryTypes.SELECT + } - function abortMigrationIfNotNeeded (actualVersion, callback) { - // No need migrations - if (actualVersion >= LAST_MIGRATION_VERSION) return finalCallback(null) + const rows = await sequelizeTypescript.query<{ migrationVersion: number }>(query, options) + if (rows?.[0]?.migrationVersion) { + actualVersion = rows[0].migrationVersion + } - return callback(null, actualVersion) - }, + if (actualVersion === null) { + await sequelizeTypescript.query('INSERT INTO "application" ("migrationVersion") VALUES (0)') + actualVersion = 0 + } - function getMigrations (actualVersion, callback) { - // If there are a new migration scripts - logger.info('Begin migrations.') + // No need migrations, abort + if (actualVersion >= LAST_MIGRATION_VERSION) return - getMigrationScripts(function (err, migrationScripts) { - return callback(err, actualVersion, migrationScripts) - }) - }, + // If there are a new migration scripts + logger.info('Begin migrations.') - function doMigrations (actualVersion, migrationScripts, callback) { - eachSeries(migrationScripts, function (entity, callbackEach) { - executeMigration(actualVersion, entity, callbackEach) - }, function (err) { - if (err) return callback(err) + const migrationScripts = await getMigrationScripts() - logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION) - return callback(null) - }) + for (const migrationScript of migrationScripts) { + try { + await executeMigration(actualVersion, migrationScript) + } catch (err) { + logger.error('Cannot execute migration %s.', migrationScript.version, { err }) + process.exit(-1) } - ], finalCallback) + } + + logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION) } // --------------------------------------------------------------------------- @@ -76,13 +57,16 @@ export { // --------------------------------------------------------------------------- -function getMigrationScripts (callback) { - fs.readdir(path.join(__dirname, 'migrations'), function (err, files) { - if (err) return callback(err) +async function getMigrationScripts () { + const files = await readdir(join(__dirname, 'migrations')) + const filesToMigrate: { + version: string + script: string + }[] = [] - const filesToMigrate = [] - - files.forEach(function (file) { + files + .filter(file => file.endsWith('.js')) + .forEach(file => { // Filename is something like 'version-blabla.js' const version = file.split('-')[0] filesToMigrate.push({ @@ -91,46 +75,31 @@ function getMigrationScripts (callback) { }) }) - return callback(err, filesToMigrate) - }) + return filesToMigrate } -function executeMigration (actualVersion, entity, callback) { +async function executeMigration (actualVersion: number, entity: { version: string, script: string }) { const versionScript = parseInt(entity.version, 10) // Do not execute old migration scripts - if (versionScript <= actualVersion) return callback(null) + if (versionScript <= actualVersion) return undefined // Load the migration module and run it const migrationScriptName = entity.script logger.info('Executing %s migration script.', migrationScriptName) - const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) - - db.sequelize.transaction().asCallback(function (err, t) { - if (err) return callback(err) + const migrationScript = require(join(__dirname, 'migrations', migrationScriptName)) + return sequelizeTypescript.transaction(async t => { const options = { transaction: t, - queryInterface: db.sequelize.getQueryInterface(), - sequelize: db.sequelize, - Sequelize: Sequelize + queryInterface: sequelizeTypescript.getQueryInterface(), + sequelize: sequelizeTypescript } - migrationScript.up(options, function (err) { - if (err) { - t.rollback() - return callback(err) - } - - // Update the new migration version - db.Application.updateMigrationVersion(versionScript, t, function (err) { - if (err) { - t.rollback() - return callback(err) - } - - t.commit().asCallback(callback) - }) - }) + + await migrationScript.up(options) + + // Update the new migration version + await sequelizeTypescript.query('UPDATE "application" SET "migrationVersion" = ' + versionScript, { transaction: t }) }) }