Add migration
authorChocobozzz <me@florianbigard.com>
Wed, 13 Dec 2017 16:46:23 +0000 (17:46 +0100)
committerChocobozzz <me@florianbigard.com>
Wed, 13 Dec 2017 16:46:23 +0000 (17:46 +0100)
scripts/danger/clean/cleaner.ts
scripts/reset-password.ts
scripts/update-host.ts
server.ts
server/initializers/constants.ts
server/initializers/database.ts
server/initializers/migrations/0125-table-lowercase.ts [new file with mode: 0644]
server/initializers/migrator.ts

index a22e2ed6aff475ccb8d54f735d2066a4edd052cb..009f8f7a0c95d93816fed572c887b3b3c079ec27 100644 (file)
@@ -1,8 +1,8 @@
 import * as Promise from 'bluebird'
 import * as rimraf from 'rimraf'
-import { CONFIG, initDatabase, sequelizeTypescript } from '../../../server/initializers'
+import { CONFIG, initDatabaseModels, sequelizeTypescript } from '../../../server/initializers'
 
-initDatabase(true)
+initDatabaseModels(true)
   .then(() => {
     return sequelizeTypescript.drop()
   })
index a6863f807fa6c7e6085a02ac250675d3d4c4ed24..6516edc287b776f5f3295f693fd9f559ea059e23 100755 (executable)
@@ -1,5 +1,5 @@
 import * as program from 'commander'
-import { initDatabase } from '../server/initializers'
+import { initDatabaseModels } from '../server/initializers'
 import { UserModel } from '../server/models/account/user'
 
 program
@@ -11,7 +11,7 @@ if (program['user'] === undefined) {
   process.exit(-1)
 }
 
-initDatabase(true)
+initDatabaseModels(true)
   .then(() => {
     return UserModel.loadByUsername(program['user'])
   })
index ba4656b75cb268192175fc5bdb98c8d8a0cb75a0..eccf203eae561f87f8a201d92fa715c110781ce6 100755 (executable)
@@ -1,9 +1,9 @@
 import { getServerAccount } from '../server/helpers'
-import { initDatabase } from '../server/initializers'
+import { initDatabaseModels } from '../server/initializers'
 import { AccountFollowModel } from '../server/models/account/account-follow'
 import { VideoModel } from '../server/models/video/video'
 
-initDatabase(true)
+initDatabaseModels(true)
   .then(() => {
     return getServerAccount()
   })
index 2e9ed31d2c1454a225133a278d7ef7f539409637..a89cdd69aad1621bfff5fe36096df567bb2f52c9 100644 (file)
--- a/server.ts
+++ b/server.ts
@@ -40,12 +40,16 @@ if (errorMessage !== null) {
 // ----------- Database -----------
 // Do not use barrels because we don't want to load all modules here (we need to initialize database first)
 import { logger } from './server/helpers/logger'
+
 // Initialize database and models
-import { initDatabase } from './server/initializers/database'
-initDatabase(false).then(() => onDatabaseInitDone())
+import { initDatabaseModels } from './server/initializers/database'
+import { migrate } from './server/initializers/migrator'
+migrate()
+  .then(() => initDatabaseModels(false))
+  .then(() => onDatabaseInitDone())
 
 // ----------- PeerTube modules -----------
-import { migrate, installApplication } from './server/initializers'
+import { installApplication } from './server/initializers'
 import { activitypubHttpJobScheduler, transcodingJobScheduler, VideosPreviewCache } from './server/lib'
 import { apiRouter, clientsRouter, staticRouter, servicesRouter, webfingerRouter, activityPubRouter } from './server/controllers'
 
@@ -154,9 +158,8 @@ app.use(function (err, req, res, next) {
 
 function onDatabaseInitDone () {
   const port = CONFIG.LISTEN.PORT
-    // Run the migration scripts if needed
-  migrate()
-    .then(() => installApplication())
+
+  installApplication()
     .then(() => {
       // ----------- Make the server listening -----------
       server.listen(port, () => {
index f539eb2eefe1d8e57521d5b5422079b5a38cce0f..341086bd6d6aa72247782d666fa3ebc52520c319 100644 (file)
@@ -8,7 +8,7 @@ import { isTestInstance, root } from '../helpers/core-utils'
 
 // ---------------------------------------------------------------------------
 
-const LAST_MIGRATION_VERSION = 120
+const LAST_MIGRATION_VERSION = 125
 
 // ---------------------------------------------------------------------------
 
index f9e24c6b8fad2b62e6413fc85aa43726b84981a4..2260938b1dcc9bceddf0edf8b7560decc2ed6230 100644 (file)
@@ -50,7 +50,7 @@ const sequelizeTypescript = new SequelizeTypescript({
   }
 })
 
-async function initDatabase (silent: boolean) {
+async function initDatabaseModels (silent: boolean) {
   sequelizeTypescript.addModels([
     ApplicationModel,
     AvatarModel,
@@ -81,6 +81,6 @@ async function initDatabase (silent: boolean) {
 // ---------------------------------------------------------------------------
 
 export {
-  initDatabase,
+  initDatabaseModels,
   sequelizeTypescript
 }
diff --git a/server/initializers/migrations/0125-table-lowercase.ts b/server/initializers/migrations/0125-table-lowercase.ts
new file mode 100644 (file)
index 0000000..78041cc
--- /dev/null
@@ -0,0 +1,36 @@
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+  transaction: Sequelize.Transaction,
+  queryInterface: Sequelize.QueryInterface,
+  sequelize: Sequelize.Sequelize
+}): Promise<void> {
+  await utils.queryInterface.renameTable('Applications', 'application')
+  await utils.queryInterface.renameTable('AccountFollows', 'accountFollow')
+  await utils.queryInterface.renameTable('AccountVideoRates', 'accountVideoRate')
+  await utils.queryInterface.renameTable('Accounts', 'account')
+  await utils.queryInterface.renameTable('Avatars', 'avatar')
+  await utils.queryInterface.renameTable('BlacklistedVideos', 'videoBlacklist')
+  await utils.queryInterface.renameTable('Jobs', 'job')
+  await utils.queryInterface.renameTable('OAuthClients', 'oAuthClient')
+  await utils.queryInterface.renameTable('OAuthTokens', 'oAuthToken')
+  await utils.queryInterface.renameTable('Servers', 'server')
+  await utils.queryInterface.renameTable('Tags', 'tag')
+  await utils.queryInterface.renameTable('Users', 'user')
+  await utils.queryInterface.renameTable('VideoAbuses', 'videoAbuse')
+  await utils.queryInterface.renameTable('VideoChannels', 'videoChannel')
+  await utils.queryInterface.renameTable('VideoChannelShares', 'videoChannelShare')
+  await utils.queryInterface.renameTable('VideoFiles', 'videoFile')
+  await utils.queryInterface.renameTable('VideoShares', 'videoShare')
+  await utils.queryInterface.renameTable('VideoTags', 'videoTag')
+  await utils.queryInterface.renameTable('Videos', 'video')
+}
+
+function down (options) {
+  throw new Error('Not implemented.')
+}
+
+export {
+  up,
+  down
+}
index f3a05cc8ce7cc0ef5e421070dc4d4460c92ddc70..bb2539fc88e3297b8f1af44df4b7acf027b05317 100644 (file)
@@ -1,6 +1,5 @@
 import * as path from 'path'
 import { logger, readdirPromise } from '../helpers'
-import { ApplicationModel } from '../models/application/application'
 import { LAST_MIGRATION_VERSION } from './constants'
 import { sequelizeTypescript } from './database'
 
@@ -11,9 +10,23 @@ async function migrate () {
   // The installer will do that
   if (tables.length === 0) return
 
-  let actualVersion = await ApplicationModel.loadMigrationVersion()
+  let actualVersion: number = null
+
+  // Search in "Applications" or "application" tables
+  try {
+    const [ rows ] = await sequelizeTypescript.query('SELECT "migrationVersion" FROM "Applications"')
+    if (rows && rows[ 0 ] && rows[ 0 ].migrationVersion) {
+      actualVersion = rows[ 0 ].migrationVersion
+    }
+  } catch {
+    const [ rows ] = await sequelizeTypescript.query('SELECT "migrationVersion" FROM "application"')
+    if (rows && rows[0] && rows[0].migrationVersion) {
+      actualVersion = rows[0].migrationVersion
+    }
+  }
+
   if (actualVersion === null) {
-    await ApplicationModel.create({ migrationVersion: 0 })
+    await sequelizeTypescript.query('INSERT INTO "application" ("migrationVersion") VALUES (0)')
     actualVersion = 0
   }
 
@@ -88,6 +101,6 @@ async function executeMigration (actualVersion: number, entity: { version: strin
     await migrationScript.up(options)
 
     // Update the new migration version
-    await ApplicationModel.updateMigrationVersion(versionScript, t)
+    await sequelizeTypescript.query('UPDATE "application" SET "migrationVersion" = ' + versionScript, { transaction: t })
   })
 }