]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/models/video/video-job-info.ts
Update client dependencies
[github/Chocobozzz/PeerTube.git] / server / models / video / video-job-info.ts
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'
5
6 export type VideoJobInfoColumnType = 'pendingMove' | 'pendingTranscode'
7
8 @Table({
9 tableName: 'videoJobInfo',
10 indexes: [
11 {
12 fields: [ 'videoId' ],
13 where: {
14 videoId: {
15 [Op.ne]: null
16 }
17 }
18 }
19 ]
20 })
21
22 export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfoModel>>> {
23 @CreatedAt
24 createdAt: Date
25
26 @UpdatedAt
27 updatedAt: Date
28
29 @AllowNull(false)
30 @Default(0)
31 @IsInt
32 @Column
33 pendingMove: number
34
35 @AllowNull(false)
36 @Default(0)
37 @IsInt
38 @Column
39 pendingTranscode: number
40
41 @ForeignKey(() => VideoModel)
42 @Unique
43 @Column
44 videoId: number
45
46 @BelongsTo(() => VideoModel, {
47 foreignKey: {
48 allowNull: false
49 },
50 onDelete: 'cascade'
51 })
52 Video: VideoModel
53
54 static load (videoId: number, transaction?: Transaction) {
55 const where = {
56 videoId
57 }
58
59 return VideoJobInfoModel.findOne({ where, transaction })
60 }
61
62 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
63 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
64
65 const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
66 INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt")
67 SELECT
68 "video"."id" AS "videoId", 1, NOW(), NOW()
69 FROM
70 "video"
71 WHERE
72 "video"."uuid" = $videoUUID
73 ON CONFLICT ("videoId") DO UPDATE
74 SET
75 "${column}" = "videoJobInfo"."${column}" + 1,
76 "updatedAt" = NOW()
77 RETURNING
78 "${column}"
79 `, options)
80
81 return pendingMove
82 }
83
84 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
85 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
86
87 const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
88 UPDATE
89 "videoJobInfo"
90 SET
91 "${column}" = "videoJobInfo"."${column}" - 1,
92 "updatedAt" = NOW()
93 FROM "video"
94 WHERE
95 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID
96 RETURNING
97 "${column}";
98 `, options)
99
100 return pendingMove
101 }
102
103 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> {
104 const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE, bind: { videoUUID } }
105
106 await VideoJobInfoModel.sequelize.query(`
107 UPDATE
108 "videoJobInfo"
109 SET
110 "${column}" = 0,
111 "updatedAt" = NOW()
112 FROM "video"
113 WHERE
114 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID
115 `, options)
116 }
117 }