diff options
Diffstat (limited to 'server/initializers/migrator.js')
-rw-r--r-- | server/initializers/migrator.js | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/server/initializers/migrator.js b/server/initializers/migrator.js index 9e5350e60..eaecb4936 100644 --- a/server/initializers/migrator.js +++ b/server/initializers/migrator.js | |||
@@ -1,6 +1,7 @@ | |||
1 | 'use strict' | 1 | 'use strict' |
2 | 2 | ||
3 | const eachSeries = require('async/eachSeries') | 3 | const eachSeries = require('async/eachSeries') |
4 | const fs = require('fs') | ||
4 | const path = require('path') | 5 | const path = require('path') |
5 | 6 | ||
6 | const constants = require('./constants') | 7 | const constants = require('./constants') |
@@ -12,35 +13,24 @@ const migrator = { | |||
12 | } | 13 | } |
13 | 14 | ||
14 | function migrate (callback) { | 15 | function migrate (callback) { |
15 | db.Application.loadSqlSchemaVersion(function (err, actualVersion) { | 16 | db.Application.loadMigrationVersion(function (err, actualVersion) { |
16 | if (err) return callback(err) | 17 | if (err) return callback(err) |
17 | 18 | ||
18 | // If there are a new mongo schemas | 19 | // If there are a new migration scripts |
19 | if (!actualVersion || actualVersion < constants.LAST_SQL_SCHEMA_VERSION) { | 20 | if (actualVersion < constants.LAST_MIGRATION_VERSION) { |
20 | logger.info('Begin migrations.') | 21 | logger.info('Begin migrations.') |
21 | 22 | ||
22 | eachSeries(constants.MONGO_MIGRATION_SCRIPTS, function (entity, callbackEach) { | 23 | getMigrationScripts(function (err, migrationScripts) { |
23 | const versionScript = entity.version | 24 | if (err) return callback(err) |
24 | |||
25 | // Do not execute old migration scripts | ||
26 | if (versionScript <= actualVersion) return callbackEach(null) | ||
27 | |||
28 | // Load the migration module and run it | ||
29 | const migrationScriptName = entity.script | ||
30 | logger.info('Executing %s migration script.', migrationScriptName) | ||
31 | 25 | ||
32 | const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) | 26 | eachSeries(migrationScripts, function (entity, callbackEach) { |
33 | migrationScript.up(function (err) { | 27 | executeMigration(actualVersion, entity, callbackEach) |
34 | if (err) return callbackEach(err) | 28 | }, function (err) { |
29 | if (err) return callback(err) | ||
35 | 30 | ||
36 | // Update the new mongo version schema | 31 | logger.info('Migrations finished. New migration version schema: %s', constants.LAST_MIGRATION_VERSION) |
37 | db.Application.updateSqlSchemaVersion(versionScript, callbackEach) | 32 | return callback(null) |
38 | }) | 33 | }) |
39 | }, function (err) { | ||
40 | if (err) return callback(err) | ||
41 | |||
42 | logger.info('Migrations finished. New SQL version schema: %s', constants.LAST_SQL_SCHEMA_VERSION) | ||
43 | return callback(null) | ||
44 | }) | 34 | }) |
45 | } else { | 35 | } else { |
46 | return callback(null) | 36 | return callback(null) |
@@ -52,3 +42,57 @@ function migrate (callback) { | |||
52 | 42 | ||
53 | module.exports = migrator | 43 | module.exports = migrator |
54 | 44 | ||
45 | // --------------------------------------------------------------------------- | ||
46 | |||
47 | function getMigrationScripts (callback) { | ||
48 | fs.readdir(path.join(__dirname, 'migrations'), function (err, files) { | ||
49 | if (err) return callback(err) | ||
50 | |||
51 | const filesToMigrate = [] | ||
52 | |||
53 | files.forEach(function (file) { | ||
54 | // Filename is something like 'version-blabla.js' | ||
55 | const version = file.split('-')[0] | ||
56 | filesToMigrate.push({ | ||
57 | version, | ||
58 | script: file | ||
59 | }) | ||
60 | }) | ||
61 | |||
62 | return callback(err, filesToMigrate) | ||
63 | }) | ||
64 | } | ||
65 | |||
66 | function executeMigration (actualVersion, entity, callback) { | ||
67 | const versionScript = entity.version | ||
68 | |||
69 | // Do not execute old migration scripts | ||
70 | if (versionScript <= actualVersion) return callback(null) | ||
71 | |||
72 | // Load the migration module and run it | ||
73 | const migrationScriptName = entity.script | ||
74 | logger.info('Executing %s migration script.', migrationScriptName) | ||
75 | |||
76 | const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) | ||
77 | |||
78 | db.sequelize.transaction().asCallback(function (err, t) { | ||
79 | if (err) return callback(err) | ||
80 | |||
81 | migrationScript.up({ transaction: t }, function (err) { | ||
82 | if (err) { | ||
83 | t.rollback() | ||
84 | return callback(err) | ||
85 | } | ||
86 | |||
87 | // Update the new migration version | ||
88 | db.Application.updateMigrationVersion(versionScript, t, function (err) { | ||
89 | if (err) { | ||
90 | t.rollback() | ||
91 | return callback(err) | ||
92 | } | ||
93 | |||
94 | t.commit() | ||
95 | }) | ||
96 | }) | ||
97 | }) | ||
98 | } | ||