1 import { Op, QueryTypes, Transaction } from 'sequelize'
2 import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript'
3 import { AttributesOnly } from '@shared/typescript-utils'
4 import { VideoModel } from './video'
6 export type VideoJobInfoColumnType = 'pendingMove' | 'pendingTranscode'
9 tableName: 'videoJobInfo',
12 fields: [ 'videoId' ],
22 export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfoModel>>> {
39 pendingTranscode: number
41 @ForeignKey(() => VideoModel)
46 @BelongsTo(() => VideoModel, {
54 static load (videoId: number, transaction?: Transaction) {
59 return VideoJobInfoModel.findOne({ where, transaction })
62 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
63 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
65 const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
66 INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt")
68 "video"."id" AS "videoId", 1, NOW(), NOW()
72 "video"."uuid" = $videoUUID
73 ON CONFLICT ("videoId") DO UPDATE
75 "${column}" = "videoJobInfo"."${column}" + 1,
84 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
85 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
87 const result = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
91 "${column}" = "videoJobInfo"."${column}" - 1,
95 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID
100 if (result.length === 0) return undefined
102 return result[0].pendingMove
105 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> {
106 const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE, bind: { videoUUID } }
108 await VideoJobInfoModel.sequelize.query(`
116 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID