diff options
Diffstat (limited to 'server/models/video/video-job-info.ts')
-rw-r--r-- | server/models/video/video-job-info.ts | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/server/models/video/video-job-info.ts b/server/models/video/video-job-info.ts new file mode 100644 index 000000000..7c1fe6734 --- /dev/null +++ b/server/models/video/video-job-info.ts | |||
@@ -0,0 +1,100 @@ | |||
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/core-utils' | ||
4 | import { VideoModel } from './video' | ||
5 | |||
6 | @Table({ | ||
7 | tableName: 'videoJobInfo', | ||
8 | indexes: [ | ||
9 | { | ||
10 | fields: [ 'videoId' ], | ||
11 | where: { | ||
12 | videoId: { | ||
13 | [Op.ne]: null | ||
14 | } | ||
15 | } | ||
16 | } | ||
17 | ] | ||
18 | }) | ||
19 | |||
20 | export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfoModel>>> { | ||
21 | @CreatedAt | ||
22 | createdAt: Date | ||
23 | |||
24 | @UpdatedAt | ||
25 | updatedAt: Date | ||
26 | |||
27 | @AllowNull(false) | ||
28 | @Default(0) | ||
29 | @IsInt | ||
30 | @Column | ||
31 | pendingMove: number | ||
32 | |||
33 | @AllowNull(false) | ||
34 | @Default(0) | ||
35 | @IsInt | ||
36 | @Column | ||
37 | pendingTranscode: number | ||
38 | |||
39 | @ForeignKey(() => VideoModel) | ||
40 | @Unique | ||
41 | @Column | ||
42 | videoId: number | ||
43 | |||
44 | @BelongsTo(() => VideoModel, { | ||
45 | foreignKey: { | ||
46 | allowNull: false | ||
47 | }, | ||
48 | onDelete: 'cascade' | ||
49 | }) | ||
50 | Video: VideoModel | ||
51 | |||
52 | static load (videoId: number, transaction: Transaction) { | ||
53 | const where = { | ||
54 | videoId | ||
55 | } | ||
56 | |||
57 | return VideoJobInfoModel.findOne({ where, transaction }) | ||
58 | } | ||
59 | |||
60 | static async increaseOrCreate (videoUUID: string, column: 'pendingMove' | 'pendingTranscode'): Promise<number> { | ||
61 | const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } | ||
62 | |||
63 | const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(` | ||
64 | INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt") | ||
65 | SELECT | ||
66 | "video"."id" AS "videoId", 1, NOW(), NOW() | ||
67 | FROM | ||
68 | "video" | ||
69 | WHERE | ||
70 | "video"."uuid" = $videoUUID | ||
71 | ON CONFLICT ("videoId") DO UPDATE | ||
72 | SET | ||
73 | "${column}" = "videoJobInfo"."${column}" + 1, | ||
74 | "updatedAt" = NOW() | ||
75 | RETURNING | ||
76 | "${column}" | ||
77 | `, options) | ||
78 | |||
79 | return pendingMove | ||
80 | } | ||
81 | |||
82 | static async decrease (videoUUID: string, column: 'pendingMove' | 'pendingTranscode'): Promise<number> { | ||
83 | const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } | ||
84 | |||
85 | const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(` | ||
86 | UPDATE | ||
87 | "videoJobInfo" | ||
88 | SET | ||
89 | "${column}" = "videoJobInfo"."${column}" - 1, | ||
90 | "updatedAt" = NOW() | ||
91 | FROM "video" | ||
92 | WHERE | ||
93 | "video"."id" = "videoJobInfo"."videoId" AND "video"."uuid" = $videoUUID | ||
94 | RETURNING | ||
95 | "${column}"; | ||
96 | `, options) | ||
97 | |||
98 | return pendingMove | ||
99 | } | ||
100 | } | ||