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 { forceNumber } from '@shared/core-utils'
4 import { AttributesOnly } from '@shared/typescript-utils'
5 import { VideoModel } from './video'
7 export type VideoJobInfoColumnType = 'pendingMove' | 'pendingTranscode'
10 tableName: 'videoJobInfo',
13 fields: [ 'videoId' ],
23 export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfoModel>>> {
40 pendingTranscode: number
42 @ForeignKey(() => VideoModel)
47 @BelongsTo(() => VideoModel, {
55 static load (videoId: number, transaction?: Transaction) {
60 return VideoJobInfoModel.findOne({ where, transaction })
63 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType, amountArg = 1): Promise<number> {
64 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
65 const amount = forceNumber(amountArg)
67 const [ result ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
68 INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt")
70 "video"."id" AS "videoId", ${amount}, NOW(), NOW()
74 "video"."uuid" = $videoUUID
75 ON CONFLICT ("videoId") DO UPDATE
77 "${column}" = "videoJobInfo"."${column}" + ${amount},
86 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
87 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
89 const result = await VideoJobInfoModel.sequelize.query(`
93 "${column}" = "videoJobInfo"."${column}" - 1,
97 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID
102 if (result.length === 0) return undefined
104 return result[0][column]
107 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> {
108 const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE, bind: { videoUUID } }
110 await VideoJobInfoModel.sequelize.query(`
118 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID