Răsfoiți Sursa

Add migration

Chocobozzz 6 ani în urmă
părinte
comite
91fea9fc48

+ 2 - 2
scripts/danger/clean/cleaner.ts

@@ -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()
   })

+ 2 - 2
scripts/reset-password.ts

@@ -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'])
   })

+ 2 - 2
scripts/update-host.ts

@@ -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()
   })

+ 9 - 6
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, () => {

+ 1 - 1
server/initializers/constants.ts

@@ -8,7 +8,7 @@ import { isTestInstance, root } from '../helpers/core-utils'
 
 // ---------------------------------------------------------------------------
 
-const LAST_MIGRATION_VERSION = 120
+const LAST_MIGRATION_VERSION = 125
 
 // ---------------------------------------------------------------------------
 

+ 2 - 2
server/initializers/database.ts

@@ -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
 }

+ 36 - 0
server/initializers/migrations/0125-table-lowercase.ts

@@ -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
+}

+ 17 - 4
server/initializers/migrator.ts

@@ -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 })
   })
 }