]>
Commit | Line | Data |
---|---|---|
0305db28 JB |
1 | import { Op, QueryTypes, Transaction } from 'sequelize' |
2 | import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript' | |
6b5f72be | 3 | import { AttributesOnly } from '@shared/typescript-utils' |
0305db28 JB |
4 | import { VideoModel } from './video' |
5 | ||
025d858e C |
6 | export 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 | ||
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 | ||
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 | ||
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 | } |