1 import { waterfall, eachSeries } from 'async'
2 import fs = require('fs')
3 import path = require('path')
5 const db = require('./database')
6 import { LAST_MIGRATION_VERSION } from './constants'
7 import { logger } from '../helpers'
9 function migrate (finalCallback) {
12 function checkApplicationTableExists (callback) {
13 db.sequelize.getQueryInterface().showAllTables().asCallback(function (err, tables) {
14 if (err) return callback(err)
16 // No tables, we don't need to migrate anything
17 // The installer will do that
18 if (tables.length === 0) return finalCallback(null)
24 function loadMigrationVersion (callback) {
25 db.Application.loadMigrationVersion(callback)
28 function createMigrationRowIfNotExists (actualVersion, callback) {
29 if (actualVersion === null) {
30 db.Application.create({
33 return callback(err, 0)
37 return callback(null, actualVersion)
40 function abortMigrationIfNotNeeded (actualVersion, callback) {
42 if (actualVersion >= LAST_MIGRATION_VERSION) return finalCallback(null)
44 return callback(null, actualVersion)
47 function getMigrations (actualVersion, callback) {
48 // If there are a new migration scripts
49 logger.info('Begin migrations.')
51 getMigrationScripts(function (err, migrationScripts) {
52 return callback(err, actualVersion, migrationScripts)
56 function doMigrations (actualVersion, migrationScripts, callback) {
57 eachSeries(migrationScripts, function (entity, callbackEach) {
58 executeMigration(actualVersion, entity, callbackEach)
60 if (err) return callback(err)
62 logger.info('Migrations finished. New migration version schema: %s', LAST_MIGRATION_VERSION)
69 // ---------------------------------------------------------------------------
75 // ---------------------------------------------------------------------------
77 function getMigrationScripts (callback) {
78 fs.readdir(path.join(__dirname, 'migrations'), function (err, files) {
79 if (err) return callback(err)
81 const filesToMigrate = []
83 files.forEach(function (file) {
84 // Filename is something like 'version-blabla.js'
85 const version = file.split('-')[0]
92 return callback(err, filesToMigrate)
96 function executeMigration (actualVersion, entity, callback) {
97 const versionScript = parseInt(entity.version)
99 // Do not execute old migration scripts
100 if (versionScript <= actualVersion) return callback(null)
102 // Load the migration module and run it
103 const migrationScriptName = entity.script
104 logger.info('Executing %s migration script.', migrationScriptName)
106 const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName))
108 db.sequelize.transaction().asCallback(function (err, t) {
109 if (err) return callback(err)
113 queryInterface: db.sequelize.getQueryInterface(),
114 sequelize: db.sequelize,
115 Sequelize: db.Sequelize
117 migrationScript.up(options, function (err) {
123 // Update the new migration version
124 db.Application.updateMigrationVersion(versionScript, t, function (err) {
130 t.commit().asCallback(callback)