| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | const _ = require('lodash')const path = require('path')const fs = require('fs-extra')const semver = require('semver')/* global WIKI */module.exports = {  async migrate (knex) {    const migrationsTableExists = await knex.schema.hasTable('migrations')    if (!migrationsTableExists) {      return    }    const dbCompat = {      charset: (WIKI.config.db.type === `mysql` || WIKI.config.db.type === `mariadb`)    }    const migrations = await knex('migrations')    if (_.some(migrations, m => m.name.indexOf('2.0.0-beta') >= 0)) {      // -> Pre-beta.241 locale field length fix      const localeColnInfo = await knex('pages').columnInfo('localeCode')      if (WIKI.config.db.type !== 'sqlite' && localeColnInfo.maxLength === 2) {        // -> Load locales        const locales = await knex('locales')        await knex.schema          // -> Remove constraints          .table('users', table => {            table.dropForeign('localeCode')          })          .table('pages', table => {            table.dropForeign('localeCode')          })          .table('pageHistory', table => {            table.dropForeign('localeCode')          })          .table('pageTree', table => {            table.dropForeign('localeCode')          })          // -> Recreate locales table          .dropTable('locales')          .createTable('locales', table => {            if (dbCompat.charset) { table.charset('utf8mb4') }            table.string('code', 5).notNullable().primary()            table.json('strings')            table.boolean('isRTL').notNullable().defaultTo(false)            table.string('name').notNullable()            table.string('nativeName').notNullable()            table.integer('availability').notNullable().defaultTo(0)            table.string('createdAt').notNullable()            table.string('updatedAt').notNullable()          })        await knex('locales').insert(locales)        // -> Alter columns length        await knex.schema          .table('users', table => {            table.string('localeCode', 5).notNullable().defaultTo('en').alter()          })          .table('pages', table => {            table.string('localeCode', 5).alter()          })          .table('pageHistory', table => {            table.string('localeCode', 5).alter()          })          .table('pageTree', table => {            table.string('localeCode', 5).alter()          })          // -> Restore restraints          .table('users', table => {            table.foreign('localeCode').references('code').inTable('locales')          })          .table('pages', table => {            table.foreign('localeCode').references('code').inTable('locales')          })          .table('pageHistory', table => {            table.foreign('localeCode').references('code').inTable('locales')          })          .table('pageTree', table => {            table.foreign('localeCode').references('code').inTable('locales')          })      }      // -> Advance to latest beta/rc migration state      const baseMigrationPath = path.join(WIKI.SERVERPATH, (WIKI.config.db.type !== 'sqlite') ? 'db/beta/migrations' : 'db/beta/migrations-sqlite')      await knex.migrate.latest({        tableName: 'migrations',        migrationSource: {          async getMigrations() {            const migrationFiles = await fs.readdir(baseMigrationPath)            return migrationFiles.sort(semver.compare).map(m => ({              file: m,              directory: baseMigrationPath            }))          },          getMigrationName(migration) {            return migration.file          },          getMigration(migration) {            return require(path.join(baseMigrationPath, migration.file))          }        }      })      // -> Cleanup migration table      await knex('migrations').truncate()      // -> Advance to stable 2.0 migration state      await knex('migrations').insert({        name: '2.0.0.js',        batch: 1,        migration_time: knex.fn.now()      })    }  }}
 |