X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Fmigrator.ts;h=4fbe1cf5b9c0c3c7aa93dd0c1bd06a606257fe7b;hb=f5028693a896a3076dd286ac0030e3d8f78f5ebf;hp=d42cb3ccc5120f1f5bd8f8204c5c3e6752957964;hpb=e02643f32e4c97ca307f8fc5b69be79c40d70a3b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/migrator.ts b/server/initializers/migrator.ts index d42cb3ccc..4fbe1cf5b 100644 --- a/server/initializers/migrator.ts +++ b/server/initializers/migrator.ts @@ -1,71 +1,35 @@ -import { waterfall, eachSeries } from 'async' -import fs = require('fs') -import path = require('path') -import * as Sequelize from 'sequelize' +import * as path from 'path' import { database as db } from './database' import { LAST_MIGRATION_VERSION } from './constants' -import { logger } from '../helpers' -import { ApplicationInstance } from '../models' +import { logger, readdirPromise } from '../helpers' -function migrate (finalCallback) { - waterfall([ +async function migrate () { + const tables = await db.sequelize.getQueryInterface().showAllTables() - 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 - // No tables, we don't need to migrate anything - // The installer will do that - if (tables.length === 0) return finalCallback(null) + let actualVersion = await db.Application.loadMigrationVersion() + if (actualVersion === null) { + await db.Application.create({ migrationVersion: 0 }) + actualVersion = 0 + } - return callback(null) - }) - }, - - function loadMigrationVersion (callback) { - db.Application.loadMigrationVersion(callback) - }, - - function createMigrationRowIfNotExists (actualVersion, callback) { - if (actualVersion === null) { - db.Application.create({ - migrationVersion: 0 - }, function (err) { - return callback(err, 0) - }) - } - - return callback(null, actualVersion) - }, + // No need migrations, abort + if (actualVersion >= LAST_MIGRATION_VERSION) return - function abortMigrationIfNotNeeded (actualVersion, callback) { - // No need migrations - if (actualVersion >= LAST_MIGRATION_VERSION) return finalCallback(null) + // If there are a new migration scripts + logger.info('Begin migrations.') - return callback(null, actualVersion) - }, + const migrationScripts = await getMigrationScripts() - function getMigrations (actualVersion, callback) { - // If there are a new migration scripts - logger.info('Begin migrations.') + for (const migrationScript of migrationScripts) { + await executeMigration(actualVersion, migrationScript) + } - getMigrationScripts(function (err, migrationScripts) { - return callback(err, actualVersion, migrationScripts) - }) - }, - - function doMigrations (actualVersion, migrationScripts, callback) { - eachSeries(migrationScripts, function (entity, callbackEach) { - executeMigration(actualVersion, entity, callbackEach) - }, function (err) { - if (err) return callback(err) - - logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION) - return callback(null) - }) - } - ], finalCallback) + logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION) } // --------------------------------------------------------------------------- @@ -76,13 +40,16 @@ export { // --------------------------------------------------------------------------- -function getMigrationScripts (callback) { - fs.readdir(path.join(__dirname, 'migrations'), function (err, files) { - if (err) return callback(err) - - const filesToMigrate = [] +async function getMigrationScripts () { + const files = await readdirPromise(path.join(__dirname, 'migrations')) + const filesToMigrate: { + version: string, + script: string + }[] = [] - files.forEach(function (file) { + files + .filter(file => file.endsWith('.js.map') === false) + .forEach(file => { // Filename is something like 'version-blabla.js' const version = file.split('-')[0] filesToMigrate.push({ @@ -91,15 +58,14 @@ 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 @@ -107,30 +73,17 @@ function executeMigration (actualVersion, entity, callback) { const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) - db.sequelize.transaction().asCallback(function (err, t) { - if (err) return callback(err) - + await db.sequelize.transaction(async t => { const options = { transaction: t, queryInterface: db.sequelize.getQueryInterface(), sequelize: db.sequelize, - Sequelize: Sequelize + db } - 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 db.Application.updateMigrationVersion(versionScript, t) }) }