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