158 lines
4.6 KiB
TypeScript
158 lines
4.6 KiB
TypeScript
import * as Sequelize from 'sequelize'
|
|
import { Migration } from '../../models/migrations'
|
|
|
|
function up (utils: {
|
|
transaction: Sequelize.Transaction
|
|
queryInterface: Sequelize.QueryInterface
|
|
sequelize: Sequelize.Sequelize
|
|
}): Promise<void> {
|
|
const q = utils.queryInterface
|
|
|
|
const dataUUID = {
|
|
type: Sequelize.UUID,
|
|
defaultValue: Sequelize.UUIDV4,
|
|
allowNull: true
|
|
} as Migration.UUID
|
|
|
|
return q.addColumn('Videos', 'uuid', dataUUID)
|
|
.then(() => {
|
|
const query = 'UPDATE "Videos" SET "uuid" = "id" WHERE "remoteId" IS NULL'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
const query = 'UPDATE "Videos" SET "uuid" = "remoteId" WHERE "remoteId" IS NOT NULL'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
dataUUID.defaultValue = null
|
|
|
|
return q.changeColumn('Videos', 'uuid', dataUUID)
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'RequestVideoQadus')
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'RequestVideoEvents')
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'BlacklistedVideos')
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'UserVideoRates')
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'VideoAbuses')
|
|
})
|
|
.then(() => {
|
|
return removeForeignKey(utils.sequelize, 'VideoTags')
|
|
})
|
|
.then(() => {
|
|
const query = 'ALTER TABLE "Videos" DROP CONSTRAINT "Videos_pkey"'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
const query = 'ALTER TABLE "Videos" ADD COLUMN "id2" SERIAL PRIMARY KEY'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
return q.renameColumn('Videos', 'id', 'oldId')
|
|
})
|
|
.then(() => {
|
|
return q.renameColumn('Videos', 'id2', 'id')
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'RequestVideoQadus', false)
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'RequestVideoEvents', false)
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'BlacklistedVideos', false)
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'UserVideoRates', false)
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'VideoAbuses', false)
|
|
})
|
|
.then(() => {
|
|
return changeForeignKey(q, utils.sequelize, 'VideoTags', true)
|
|
})
|
|
.then(() => {
|
|
return q.removeColumn('Videos', 'oldId')
|
|
})
|
|
.then(() => {
|
|
const dataRemote = {
|
|
type: Sequelize.BOOLEAN,
|
|
defaultValue: false,
|
|
allowNull: false
|
|
}
|
|
return q.addColumn('Videos', 'remote', dataRemote)
|
|
})
|
|
.then(() => {
|
|
const query = 'UPDATE "Videos" SET "remote" = false WHERE "remoteId" IS NULL'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
const query = 'UPDATE "Videos" SET "remote" = true WHERE "remoteId" IS NOT NULL'
|
|
return utils.sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
return q.removeColumn('Videos', 'remoteId')
|
|
})
|
|
}
|
|
|
|
function down (options) {
|
|
throw new Error('Not implemented.')
|
|
}
|
|
|
|
function removeForeignKey (sequelize: Sequelize.Sequelize, tableName: string) {
|
|
const query = 'ALTER TABLE "' + tableName + '" DROP CONSTRAINT "' + tableName + '_videoId_fkey' + '"'
|
|
return sequelize.query(query)
|
|
}
|
|
|
|
function changeForeignKey (q: Sequelize.QueryInterface, sequelize: Sequelize.Sequelize, tableName: string, allowNull: boolean) {
|
|
const data = {
|
|
type: Sequelize.INTEGER,
|
|
allowNull: true
|
|
}
|
|
|
|
return q.addColumn(tableName, 'videoId2', data)
|
|
.then(() => {
|
|
const query = 'UPDATE "' + tableName + '" SET "videoId2" = ' +
|
|
'(SELECT "id" FROM "Videos" WHERE "' + tableName + '"."videoId" = "Videos"."oldId")'
|
|
return sequelize.query(query)
|
|
})
|
|
.then(() => {
|
|
if (allowNull === false) {
|
|
data.allowNull = false
|
|
|
|
return q.changeColumn(tableName, 'videoId2', data)
|
|
}
|
|
|
|
return Promise.resolve()
|
|
})
|
|
.then(() => {
|
|
return q.removeColumn(tableName, 'videoId')
|
|
})
|
|
.then(() => {
|
|
return q.renameColumn(tableName, 'videoId2', 'videoId')
|
|
})
|
|
.then(() => {
|
|
return q.addIndex(tableName, [ 'videoId' ])
|
|
})
|
|
.then(() => {
|
|
const constraintName = tableName + '_videoId_fkey'
|
|
const query = 'ALTER TABLE "' + tableName + '" ' +
|
|
' ADD CONSTRAINT "' + constraintName + '"' +
|
|
' FOREIGN KEY ("videoId") REFERENCES "Videos" ON DELETE CASCADE'
|
|
|
|
return sequelize.query(query)
|
|
})
|
|
}
|
|
|
|
export {
|
|
up,
|
|
down
|
|
}
|