Fix standard lint
[oweals/peertube.git] / server / initializers / migrator.js
1 'use strict'
2
3 const eachSeries = require('async/eachSeries')
4 const fs = require('fs')
5 const path = require('path')
6
7 const constants = require('./constants')
8 const db = require('./database')
9 const logger = require('../helpers/logger')
10
11 const migrator = {
12   migrate: migrate
13 }
14
15 function migrate (callback) {
16   db.Application.loadMigrationVersion(function (err, actualVersion) {
17     if (err) return callback(err)
18
19     // If there are a new migration scripts
20     if (actualVersion < constants.LAST_MIGRATION_VERSION) {
21       logger.info('Begin migrations.')
22
23       getMigrationScripts(function (err, migrationScripts) {
24         if (err) return callback(err)
25
26         eachSeries(migrationScripts, function (entity, callbackEach) {
27           executeMigration(actualVersion, entity, callbackEach)
28         }, function (err) {
29           if (err) return callback(err)
30
31           logger.info('Migrations finished. New migration version schema: %s', constants.LAST_MIGRATION_VERSION)
32           return callback(null)
33         })
34       })
35     } else {
36       return callback(null)
37     }
38   })
39 }
40
41 // ---------------------------------------------------------------------------
42
43 module.exports = migrator
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 }