]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/initializers/migrator.js
Update README
[github/Chocobozzz/PeerTube.git] / server / initializers / migrator.js
CommitLineData
00d6b0dd
C
1'use strict'
2
5804c0db 3const waterfall = require('async/waterfall')
00d6b0dd 4const eachSeries = require('async/eachSeries')
b769007f 5const fs = require('fs')
00d6b0dd
C
6const path = require('path')
7
8const constants = require('./constants')
feb4bdfd 9const db = require('./database')
00d6b0dd
C
10const logger = require('../helpers/logger')
11
00d6b0dd
C
12const migrator = {
13 migrate: migrate
14}
15
5804c0db
C
16function migrate (finalCallback) {
17 waterfall([
18
19 function checkApplicationTableExists (callback) {
20 db.sequelize.getQueryInterface().showAllTables().asCallback(function (err, tables) {
21 if (err) return callback(err)
22
23 // No tables, we don't need to migrate anything
24 // The installer will do that
25 if (tables.length === 0) return finalCallback(null)
26
27 return callback(null)
28 })
29 },
30
31 function loadMigrationVersion (callback) {
32 db.Application.loadMigrationVersion(callback)
33 },
00d6b0dd 34
ed708d62
C
35 function createMigrationRowIfNotExists (actualVersion, callback) {
36 if (actualVersion === null) {
37 db.Application.create({
38 migrationVersion: 0
39 }, function (err) {
1f5bf9ef 40 return callback(err, 0)
ed708d62
C
41 })
42 }
43
44 return callback(null, actualVersion)
45 },
46
5804c0db
C
47 function abortMigrationIfNotNeeded (actualVersion, callback) {
48 // No need migrations
49 if (actualVersion >= constants.LAST_MIGRATION_VERSION) return finalCallback(null)
50
51 return callback(null, actualVersion)
52 },
53
54 function getMigrations (actualVersion, callback) {
55 // If there are a new migration scripts
00d6b0dd
C
56 logger.info('Begin migrations.')
57
b769007f 58 getMigrationScripts(function (err, migrationScripts) {
5804c0db
C
59 return callback(err, actualVersion, migrationScripts)
60 })
61 },
00d6b0dd 62
5804c0db
C
63 function doMigrations (actualVersion, migrationScripts, callback) {
64 eachSeries(migrationScripts, function (entity, callbackEach) {
65 executeMigration(actualVersion, entity, callbackEach)
66 }, function (err) {
67 if (err) return callback(err)
00d6b0dd 68
5804c0db
C
69 logger.info('Migrations finished. New migration version schema: %s', constants.LAST_MIGRATION_VERSION)
70 return callback(null)
00d6b0dd 71 })
00d6b0dd 72 }
5804c0db 73 ], finalCallback)
00d6b0dd
C
74}
75
76// ---------------------------------------------------------------------------
77
78module.exports = migrator
79
b769007f
C
80// ---------------------------------------------------------------------------
81
82function getMigrationScripts (callback) {
83 fs.readdir(path.join(__dirname, 'migrations'), function (err, files) {
84 if (err) return callback(err)
85
86 const filesToMigrate = []
87
88 files.forEach(function (file) {
89 // Filename is something like 'version-blabla.js'
90 const version = file.split('-')[0]
91 filesToMigrate.push({
92 version,
93 script: file
94 })
95 })
96
97 return callback(err, filesToMigrate)
98 })
99}
100
101function executeMigration (actualVersion, entity, callback) {
4793c343 102 const versionScript = parseInt(entity.version)
b769007f
C
103
104 // Do not execute old migration scripts
105 if (versionScript <= actualVersion) return callback(null)
106
107 // Load the migration module and run it
108 const migrationScriptName = entity.script
109 logger.info('Executing %s migration script.', migrationScriptName)
110
111 const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName))
112
113 db.sequelize.transaction().asCallback(function (err, t) {
114 if (err) return callback(err)
115
4793c343
C
116 const options = {
117 transaction: t,
118 queryInterface: db.sequelize.getQueryInterface(),
5804c0db 119 sequelize: db.sequelize,
4793c343
C
120 Sequelize: db.Sequelize
121 }
122 migrationScript.up(options, function (err) {
b769007f
C
123 if (err) {
124 t.rollback()
125 return callback(err)
126 }
127
128 // Update the new migration version
129 db.Application.updateMigrationVersion(versionScript, t, function (err) {
130 if (err) {
131 t.rollback()
132 return callback(err)
133 }
134
dea32aac 135 t.commit().asCallback(callback)
b769007f
C
136 })
137 })
138 })
139}