X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Fmigrator.js;h=9a6415b1ad6b9207ffbc6e1028198accc9a994d0;hb=2d7653dc8726185615bab66353c4e3fb8fbb5a5f;hp=6b31d994f55fd7d25ebc6d25dbf2f01ae2c6cf57;hpb=a6375e69668ea42e19531c6bc68dcd37f3f7cbd7;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/migrator.js b/server/initializers/migrator.js index 6b31d994f..9a6415b1a 100644 --- a/server/initializers/migrator.js +++ b/server/initializers/migrator.js @@ -1,56 +1,139 @@ 'use strict' +const waterfall = require('async/waterfall') const eachSeries = require('async/eachSeries') -const mongoose = require('mongoose') +const fs = require('fs') const path = require('path') const constants = require('./constants') +const db = require('./database') const logger = require('../helpers/logger') -const Application = mongoose.model('Application') - const migrator = { migrate: migrate } -function migrate (callback) { - Application.loadMongoSchemaVersion(function (err, actualVersion) { - if (err) return callback(err) +function migrate (finalCallback) { + waterfall([ - // If there are a new mongo schemas - if (!actualVersion || actualVersion < constants.LAST_MONGO_SCHEMA_VERSION) { - logger.info('Begin migrations.') - - eachSeries(constants.MONGO_MIGRATION_SCRIPTS, function (entity, callbackEach) { - const versionScript = entity.version + function checkApplicationTableExists (callback) { + db.sequelize.getQueryInterface().showAllTables().asCallback(function (err, tables) { + if (err) return callback(err) - // Do not execute old migration scripts - if (versionScript <= actualVersion) return callbackEach(null) + // No tables, we don't need to migrate anything + // The installer will do that + if (tables.length === 0) return finalCallback(null) - // Load the migration module and run it - const migrationScriptName = entity.script - logger.info('Executing %s migration script.', migrationScriptName) + return callback(null) + }) + }, - const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) - migrationScript.up(function (err) { - if (err) return callbackEach(err) + function loadMigrationVersion (callback) { + db.Application.loadMigrationVersion(callback) + }, - // Update the new mongo version schema - Application.updateMongoSchemaVersion(versionScript, callbackEach) + function createMigrationRowIfNotExists (actualVersion, callback) { + if (actualVersion === null) { + db.Application.create({ + migrationVersion: 0 + }, function (err) { + return callback(err, 0) }) + } + + return callback(null, actualVersion) + }, + + function abortMigrationIfNotNeeded (actualVersion, callback) { + // No need migrations + if (actualVersion >= constants.LAST_MIGRATION_VERSION) return finalCallback(null) + + return callback(null, actualVersion) + }, + + function getMigrations (actualVersion, callback) { + // If there are a new migration scripts + logger.info('Begin migrations.') + + 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 mongo version schema: %s', constants.LAST_MONGO_SCHEMA_VERSION) + logger.info('Migrations finished. New migration version schema: %s', constants.LAST_MIGRATION_VERSION) return callback(null) }) - } else { - return callback(null) } - }) + ], finalCallback) } // --------------------------------------------------------------------------- module.exports = migrator +// --------------------------------------------------------------------------- + +function getMigrationScripts (callback) { + fs.readdir(path.join(__dirname, 'migrations'), function (err, files) { + if (err) return callback(err) + + const filesToMigrate = [] + + files.forEach(function (file) { + // Filename is something like 'version-blabla.js' + const version = file.split('-')[0] + filesToMigrate.push({ + version, + script: file + }) + }) + + return callback(err, filesToMigrate) + }) +} + +function executeMigration (actualVersion, entity, callback) { + const versionScript = parseInt(entity.version) + + // Do not execute old migration scripts + if (versionScript <= actualVersion) return callback(null) + + // 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 options = { + transaction: t, + queryInterface: db.sequelize.getQueryInterface(), + sequelize: db.sequelize, + Sequelize: db.Sequelize + } + 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) + }) + }) + }) +}