import * as Sequelize from 'sequelize' async function up (utils: { transaction: Sequelize.Transaction queryInterface: Sequelize.QueryInterface sequelize: Sequelize.Sequelize }): Promise { { const query = ` CREATE TABLE IF NOT EXISTS "videoLiveReplaySetting" ( "id" SERIAL , "privacy" INTEGER NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id") ); ` await utils.sequelize.query(query, { transaction : utils.transaction }) } { await utils.queryInterface.addColumn('videoLive', 'replaySettingId', { type: Sequelize.INTEGER, defaultValue: null, allowNull: true, references: { model: 'videoLiveReplaySetting', key: 'id' }, onDelete: 'SET NULL' }, { transaction: utils.transaction }) } { await utils.queryInterface.addColumn('videoLiveSession', 'replaySettingId', { type: Sequelize.INTEGER, defaultValue: null, allowNull: true, references: { model: 'videoLiveReplaySetting', key: 'id' }, onDelete: 'SET NULL' }, { transaction: utils.transaction }) } { const query = ` SELECT live."id", v."privacy" FROM "videoLive" live INNER JOIN "video" v ON live."videoId" = v."id" WHERE live."saveReplay" = true ` const videoLives = await utils.sequelize.query<{ id: number, privacy: number }>( query, { type: Sequelize.QueryTypes.SELECT, transaction: utils.transaction } ) for (const videoLive of videoLives) { const query = ` WITH new_replay_setting AS ( INSERT INTO "videoLiveReplaySetting" ("privacy", "createdAt", "updatedAt") VALUES (:privacy, NOW(), NOW()) RETURNING id ) UPDATE "videoLive" SET "replaySettingId" = (SELECT id FROM new_replay_setting) WHERE "id" = :id ` const options = { replacements: { privacy: videoLive.privacy, id: videoLive.id }, type: Sequelize.QueryTypes.UPDATE, transaction: utils.transaction } await utils.sequelize.query(query, options) } } { const query = ` SELECT session."id", v."privacy" FROM "videoLiveSession" session INNER JOIN "video" v ON session."liveVideoId" = v."id" WHERE session."saveReplay" = true AND session."liveVideoId" IS NOT NULL; ` const videoLiveSessions = await utils.sequelize.query<{ id: number, privacy: number }>( query, { type: Sequelize.QueryTypes.SELECT, transaction: utils.transaction } ) for (const videoLive of videoLiveSessions) { const query = ` WITH new_replay_setting AS ( INSERT INTO "videoLiveReplaySetting" ("privacy", "createdAt", "updatedAt") VALUES (:privacy, NOW(), NOW()) RETURNING id ) UPDATE "videoLiveSession" SET "replaySettingId" = (SELECT id FROM new_replay_setting) WHERE "id" = :id ` const options = { replacements: { privacy: videoLive.privacy, id: videoLive.id }, type: Sequelize.QueryTypes.UPDATE, transaction: utils.transaction } await utils.sequelize.query(query, options) } } } function down (options) { throw new Error('Not implemented.') } export { up, down }