]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/models/video/video-job-info.ts
Fix video job error when video has been deleted
[github/Chocobozzz/PeerTube.git] / server / models / video / video-job-info.ts
CommitLineData
0305db28
JB
1import { Op, QueryTypes, Transaction } from 'sequelize'
2import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript'
6b5f72be 3import { AttributesOnly } from '@shared/typescript-utils'
0305db28
JB
4import { VideoModel } from './video'
5
025d858e
C
6export type VideoJobInfoColumnType = 'pendingMove' | 'pendingTranscode'
7
0305db28
JB
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
22export 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
ad5db104 54 static load (videoId: number, transaction?: Transaction) {
0305db28
JB
55 const where = {
56 videoId
57 }
58
59 return VideoJobInfoModel.findOne({ where, transaction })
60 }
61
025d858e 62 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
0305db28
JB
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
025d858e 84 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
0305db28
JB
85 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
86
52d6c2e0 87 const result = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
0305db28
JB
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
52d6c2e0
C
100 if (result.length === 0) return undefined
101
102 return result[0].pendingMove
0305db28 103 }
dbd9fb44
C
104
105 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> {
106 const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE, bind: { videoUUID } }
107
108 await VideoJobInfoModel.sequelize.query(`
109 UPDATE
110 "videoJobInfo"
111 SET
112 "${column}" = 0,
113 "updatedAt" = NOW()
114 FROM "video"
115 WHERE
116 "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID
117 `, options)
118 }
0305db28 119}