diff options
Diffstat (limited to 'server/models/account/account-video-rate.ts')
-rw-r--r-- | server/models/account/account-video-rate.ts | 60 |
1 files changed, 57 insertions, 3 deletions
diff --git a/server/models/account/account-video-rate.ts b/server/models/account/account-video-rate.ts index c99e32012..18762f0c5 100644 --- a/server/models/account/account-video-rate.ts +++ b/server/models/account/account-video-rate.ts | |||
@@ -1,12 +1,14 @@ | |||
1 | import { values } from 'lodash' | 1 | import { values } from 'lodash' |
2 | import { Transaction } from 'sequelize' | 2 | import { Transaction } from 'sequelize' |
3 | import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript' | 3 | import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' |
4 | import { IFindOptions } from 'sequelize-typescript/lib/interfaces/IFindOptions' | 4 | import { IFindOptions } from 'sequelize-typescript/lib/interfaces/IFindOptions' |
5 | import { VideoRateType } from '../../../shared/models/videos' | 5 | import { VideoRateType } from '../../../shared/models/videos' |
6 | import { VIDEO_RATE_TYPES } from '../../initializers' | 6 | import { CONSTRAINTS_FIELDS, VIDEO_RATE_TYPES } from '../../initializers' |
7 | import { VideoModel } from '../video/video' | 7 | import { VideoModel } from '../video/video' |
8 | import { AccountModel } from './account' | 8 | import { AccountModel } from './account' |
9 | import { ActorModel } from '../activitypub/actor' | 9 | import { ActorModel } from '../activitypub/actor' |
10 | import { throwIfNotValid } from '../utils' | ||
11 | import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' | ||
10 | 12 | ||
11 | /* | 13 | /* |
12 | Account rates per video. | 14 | Account rates per video. |
@@ -26,6 +28,10 @@ import { ActorModel } from '../activitypub/actor' | |||
26 | }, | 28 | }, |
27 | { | 29 | { |
28 | fields: [ 'videoId', 'type' ] | 30 | fields: [ 'videoId', 'type' ] |
31 | }, | ||
32 | { | ||
33 | fields: [ 'url' ], | ||
34 | unique: true | ||
29 | } | 35 | } |
30 | ] | 36 | ] |
31 | }) | 37 | }) |
@@ -35,6 +41,11 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> { | |||
35 | @Column(DataType.ENUM(values(VIDEO_RATE_TYPES))) | 41 | @Column(DataType.ENUM(values(VIDEO_RATE_TYPES))) |
36 | type: VideoRateType | 42 | type: VideoRateType |
37 | 43 | ||
44 | @AllowNull(false) | ||
45 | @Is('AccountVideoRateUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url')) | ||
46 | @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_RATES.URL.max)) | ||
47 | url: string | ||
48 | |||
38 | @CreatedAt | 49 | @CreatedAt |
39 | createdAt: Date | 50 | createdAt: Date |
40 | 51 | ||
@@ -65,7 +76,7 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> { | |||
65 | }) | 76 | }) |
66 | Account: AccountModel | 77 | Account: AccountModel |
67 | 78 | ||
68 | static load (accountId: number, videoId: number, transaction: Transaction) { | 79 | static load (accountId: number, videoId: number, transaction?: Transaction) { |
69 | const options: IFindOptions<AccountVideoRateModel> = { | 80 | const options: IFindOptions<AccountVideoRateModel> = { |
70 | where: { | 81 | where: { |
71 | accountId, | 82 | accountId, |
@@ -77,6 +88,49 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> { | |||
77 | return AccountVideoRateModel.findOne(options) | 88 | return AccountVideoRateModel.findOne(options) |
78 | } | 89 | } |
79 | 90 | ||
91 | static loadLocalAndPopulateVideo (rateType: VideoRateType, accountName: string, videoId: number, transaction?: Transaction) { | ||
92 | const options: IFindOptions<AccountVideoRateModel> = { | ||
93 | where: { | ||
94 | videoId, | ||
95 | type: rateType | ||
96 | }, | ||
97 | include: [ | ||
98 | { | ||
99 | model: AccountModel.unscoped(), | ||
100 | required: true, | ||
101 | include: [ | ||
102 | { | ||
103 | attributes: [ 'id', 'url', 'preferredUsername' ], | ||
104 | model: ActorModel.unscoped(), | ||
105 | required: true, | ||
106 | where: { | ||
107 | preferredUsername: accountName | ||
108 | } | ||
109 | } | ||
110 | ] | ||
111 | }, | ||
112 | { | ||
113 | model: VideoModel.unscoped(), | ||
114 | required: true | ||
115 | } | ||
116 | ] | ||
117 | } | ||
118 | if (transaction) options.transaction = transaction | ||
119 | |||
120 | return AccountVideoRateModel.findOne(options) | ||
121 | } | ||
122 | |||
123 | static loadByUrl (url: string, transaction: Transaction) { | ||
124 | const options: IFindOptions<AccountVideoRateModel> = { | ||
125 | where: { | ||
126 | url | ||
127 | } | ||
128 | } | ||
129 | if (transaction) options.transaction = transaction | ||
130 | |||
131 | return AccountVideoRateModel.findOne(options) | ||
132 | } | ||
133 | |||
80 | static listAndCountAccountUrlsByVideoId (rateType: VideoRateType, videoId: number, start: number, count: number, t?: Transaction) { | 134 | static listAndCountAccountUrlsByVideoId (rateType: VideoRateType, videoId: number, start: number, count: number, t?: Transaction) { |
81 | const query = { | 135 | const query = { |
82 | offset: start, | 136 | offset: start, |