aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/video
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/video')
-rw-r--r--server/models/video/schedule-video-update.ts2
-rw-r--r--server/models/video/tag.ts13
-rw-r--r--server/models/video/thumbnail.ts2
-rw-r--r--server/models/video/video-blacklist.ts17
-rw-r--r--server/models/video/video-caption.ts23
-rw-r--r--server/models/video/video-change-ownership.ts11
-rw-r--r--server/models/video/video-channel.ts78
-rw-r--r--server/models/video/video-comment.ts13
-rw-r--r--server/models/video/video-file.ts2
-rw-r--r--server/models/video/video-import.ts15
-rw-r--r--server/models/video/video-live.ts2
-rw-r--r--server/models/video/video-playlist-element.ts33
-rw-r--r--server/models/video/video-playlist.ts22
-rw-r--r--server/models/video/video-share.ts19
-rw-r--r--server/models/video/video-streaming-playlist.ts2
-rw-r--r--server/models/video/video-tag.ts2
-rw-r--r--server/models/video/video-view.ts2
-rw-r--r--server/models/video/video.ts85
18 files changed, 167 insertions, 176 deletions
diff --git a/server/models/video/schedule-video-update.ts b/server/models/video/schedule-video-update.ts
index 1ce6bbfe5..22b08e91a 100644
--- a/server/models/video/schedule-video-update.ts
+++ b/server/models/video/schedule-video-update.ts
@@ -16,7 +16,7 @@ import { MScheduleVideoUpdateFormattable, MScheduleVideoUpdateVideoAll } from '@
16 } 16 }
17 ] 17 ]
18}) 18})
19export class ScheduleVideoUpdateModel extends Model<ScheduleVideoUpdateModel> { 19export class ScheduleVideoUpdateModel extends Model {
20 20
21 @AllowNull(false) 21 @AllowNull(false)
22 @Default(null) 22 @Default(null)
diff --git a/server/models/video/tag.ts b/server/models/video/tag.ts
index adbc4fb7d..d04205703 100644
--- a/server/models/video/tag.ts
+++ b/server/models/video/tag.ts
@@ -1,12 +1,11 @@
1import * as Bluebird from 'bluebird' 1import { col, fn, QueryTypes, Transaction } from 'sequelize'
2import { fn, QueryTypes, Transaction, col } from 'sequelize'
3import { AllowNull, BelongsToMany, Column, CreatedAt, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' 2import { AllowNull, BelongsToMany, Column, CreatedAt, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
3import { MTag } from '@server/types/models'
4import { VideoPrivacy, VideoState } from '../../../shared/models/videos'
4import { isVideoTagValid } from '../../helpers/custom-validators/videos' 5import { isVideoTagValid } from '../../helpers/custom-validators/videos'
5import { throwIfNotValid } from '../utils' 6import { throwIfNotValid } from '../utils'
6import { VideoModel } from './video' 7import { VideoModel } from './video'
7import { VideoTagModel } from './video-tag' 8import { VideoTagModel } from './video-tag'
8import { VideoPrivacy, VideoState } from '../../../shared/models/videos'
9import { MTag } from '@server/types/models'
10 9
11@Table({ 10@Table({
12 tableName: 'tag', 11 tableName: 'tag',
@@ -22,7 +21,7 @@ import { MTag } from '@server/types/models'
22 } 21 }
23 ] 22 ]
24}) 23})
25export class TagModel extends Model<TagModel> { 24export class TagModel extends Model {
26 25
27 @AllowNull(false) 26 @AllowNull(false)
28 @Is('VideoTag', value => throwIfNotValid(value, isVideoTagValid, 'tag')) 27 @Is('VideoTag', value => throwIfNotValid(value, isVideoTagValid, 'tag'))
@@ -45,7 +44,7 @@ export class TagModel extends Model<TagModel> {
45 static findOrCreateTags (tags: string[], transaction: Transaction): Promise<MTag[]> { 44 static findOrCreateTags (tags: string[], transaction: Transaction): Promise<MTag[]> {
46 if (tags === null) return Promise.resolve([]) 45 if (tags === null) return Promise.resolve([])
47 46
48 const tasks: Bluebird<MTag>[] = [] 47 const tasks: Promise<MTag>[] = []
49 tags.forEach(tag => { 48 tags.forEach(tag => {
50 const query = { 49 const query = {
51 where: { 50 where: {
@@ -66,7 +65,7 @@ export class TagModel extends Model<TagModel> {
66 } 65 }
67 66
68 // threshold corresponds to how many video the field should have to be returned 67 // threshold corresponds to how many video the field should have to be returned
69 static getRandomSamples (threshold: number, count: number): Bluebird<string[]> { 68 static getRandomSamples (threshold: number, count: number): Promise<string[]> {
70 const query = 'SELECT tag.name FROM tag ' + 69 const query = 'SELECT tag.name FROM tag ' +
71 'INNER JOIN "videoTag" ON "videoTag"."tagId" = tag.id ' + 70 'INNER JOIN "videoTag" ON "videoTag"."tagId" = tag.id ' +
72 'INNER JOIN video ON video.id = "videoTag"."videoId" ' + 71 'INNER JOIN video ON video.id = "videoTag"."videoId" ' +
diff --git a/server/models/video/thumbnail.ts b/server/models/video/thumbnail.ts
index 20c1e5858..6878a3155 100644
--- a/server/models/video/thumbnail.ts
+++ b/server/models/video/thumbnail.ts
@@ -34,7 +34,7 @@ import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub'
34 } 34 }
35 ] 35 ]
36}) 36})
37export class ThumbnailModel extends Model<ThumbnailModel> { 37export class ThumbnailModel extends Model {
38 38
39 @AllowNull(false) 39 @AllowNull(false)
40 @Column 40 @Column
diff --git a/server/models/video/video-blacklist.ts b/server/models/video/video-blacklist.ts
index 36d2a30fa..aa18896da 100644
--- a/server/models/video/video-blacklist.ts
+++ b/server/models/video/video-blacklist.ts
@@ -1,14 +1,13 @@
1import { FindOptions } from 'sequelize'
1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' 2import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2import { getBlacklistSort, SortType, throwIfNotValid, searchAttribute } from '../utils' 3import { MVideoBlacklist, MVideoBlacklistFormattable } from '@server/types/models'
3import { VideoModel } from './video'
4import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel'
5import { isVideoBlacklistReasonValid, isVideoBlacklistTypeValid } from '../../helpers/custom-validators/video-blacklist'
6import { VideoBlacklist, VideoBlacklistType } from '../../../shared/models/videos' 4import { VideoBlacklist, VideoBlacklistType } from '../../../shared/models/videos'
5import { isVideoBlacklistReasonValid, isVideoBlacklistTypeValid } from '../../helpers/custom-validators/video-blacklist'
7import { CONSTRAINTS_FIELDS } from '../../initializers/constants' 6import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
8import { FindOptions } from 'sequelize' 7import { getBlacklistSort, searchAttribute, SortType, throwIfNotValid } from '../utils'
9import { ThumbnailModel } from './thumbnail' 8import { ThumbnailModel } from './thumbnail'
10import * as Bluebird from 'bluebird' 9import { VideoModel } from './video'
11import { MVideoBlacklist, MVideoBlacklistFormattable } from '@server/types/models' 10import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel'
12 11
13@Table({ 12@Table({
14 tableName: 'videoBlacklist', 13 tableName: 'videoBlacklist',
@@ -19,7 +18,7 @@ import { MVideoBlacklist, MVideoBlacklistFormattable } from '@server/types/model
19 } 18 }
20 ] 19 ]
21}) 20})
22export class VideoBlacklistModel extends Model<VideoBlacklistModel> { 21export class VideoBlacklistModel extends Model {
23 22
24 @AllowNull(true) 23 @AllowNull(true)
25 @Is('VideoBlacklistReason', value => throwIfNotValid(value, isVideoBlacklistReasonValid, 'reason', true)) 24 @Is('VideoBlacklistReason', value => throwIfNotValid(value, isVideoBlacklistReasonValid, 'reason', true))
@@ -109,7 +108,7 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
109 }) 108 })
110 } 109 }
111 110
112 static loadByVideoId (id: number): Bluebird<MVideoBlacklist> { 111 static loadByVideoId (id: number): Promise<MVideoBlacklist> {
113 const query = { 112 const query = {
114 where: { 113 where: {
115 videoId: id 114 videoId: id
diff --git a/server/models/video/video-caption.ts b/server/models/video/video-caption.ts
index b68a6e99f..e8e883dd0 100644
--- a/server/models/video/video-caption.ts
+++ b/server/models/video/video-caption.ts
@@ -1,3 +1,5 @@
1import { remove } from 'fs-extra'
2import { join } from 'path'
1import { OrderItem, Transaction } from 'sequelize' 3import { OrderItem, Transaction } from 'sequelize'
2import { 4import {
3 AllowNull, 5 AllowNull,
@@ -13,18 +15,15 @@ import {
13 Table, 15 Table,
14 UpdatedAt 16 UpdatedAt
15} from 'sequelize-typescript' 17} from 'sequelize-typescript'
16import { buildWhereIdOrUUID, throwIfNotValid } from '../utils' 18import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub'
17import { VideoModel } from './video' 19import { MVideoAccountLight, MVideoCaptionFormattable, MVideoCaptionVideo } from '@server/types/models'
18import { isVideoCaptionLanguageValid } from '../../helpers/custom-validators/video-captions'
19import { VideoCaption } from '../../../shared/models/videos/caption/video-caption.model' 20import { VideoCaption } from '../../../shared/models/videos/caption/video-caption.model'
20import { CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, VIDEO_LANGUAGES, WEBSERVER } from '../../initializers/constants' 21import { isVideoCaptionLanguageValid } from '../../helpers/custom-validators/video-captions'
21import { join } from 'path'
22import { logger } from '../../helpers/logger' 22import { logger } from '../../helpers/logger'
23import { remove } from 'fs-extra'
24import { CONFIG } from '../../initializers/config' 23import { CONFIG } from '../../initializers/config'
25import * as Bluebird from 'bluebird' 24import { CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, VIDEO_LANGUAGES, WEBSERVER } from '../../initializers/constants'
26import { MVideoAccountLight, MVideoCaptionFormattable, MVideoCaptionVideo } from '@server/types/models' 25import { buildWhereIdOrUUID, throwIfNotValid } from '../utils'
27import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub' 26import { VideoModel } from './video'
28 27
29export enum ScopeNames { 28export enum ScopeNames {
30 WITH_VIDEO_UUID_AND_REMOTE = 'WITH_VIDEO_UUID_AND_REMOTE' 29 WITH_VIDEO_UUID_AND_REMOTE = 'WITH_VIDEO_UUID_AND_REMOTE'
@@ -54,7 +53,7 @@ export enum ScopeNames {
54 } 53 }
55 ] 54 ]
56}) 55})
57export class VideoCaptionModel extends Model<VideoCaptionModel> { 56export class VideoCaptionModel extends Model {
58 @CreatedAt 57 @CreatedAt
59 createdAt: Date 58 createdAt: Date
60 59
@@ -101,7 +100,7 @@ export class VideoCaptionModel extends Model<VideoCaptionModel> {
101 return undefined 100 return undefined
102 } 101 }
103 102
104 static loadByVideoIdAndLanguage (videoId: string | number, language: string): Bluebird<MVideoCaptionVideo> { 103 static loadByVideoIdAndLanguage (videoId: string | number, language: string): Promise<MVideoCaptionVideo> {
105 const videoInclude = { 104 const videoInclude = {
106 model: VideoModel.unscoped(), 105 model: VideoModel.unscoped(),
107 attributes: [ 'id', 'remote', 'uuid' ], 106 attributes: [ 'id', 'remote', 'uuid' ],
@@ -131,7 +130,7 @@ export class VideoCaptionModel extends Model<VideoCaptionModel> {
131 .then(([ caption ]) => caption) 130 .then(([ caption ]) => caption)
132 } 131 }
133 132
134 static listVideoCaptions (videoId: number): Bluebird<MVideoCaptionVideo[]> { 133 static listVideoCaptions (videoId: number): Promise<MVideoCaptionVideo[]> {
135 const query = { 134 const query = {
136 order: [ [ 'language', 'ASC' ] ] as OrderItem[], 135 order: [ [ 'language', 'ASC' ] ] as OrderItem[],
137 where: { 136 where: {
diff --git a/server/models/video/video-change-ownership.ts b/server/models/video/video-change-ownership.ts
index ac0ab7e8b..298e8bfe2 100644
--- a/server/models/video/video-change-ownership.ts
+++ b/server/models/video/video-change-ownership.ts
@@ -1,10 +1,9 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' 1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2import { AccountModel } from '../account/account' 2import { MVideoChangeOwnershipFormattable, MVideoChangeOwnershipFull } from '@server/types/models/video/video-change-ownership'
3import { ScopeNames as VideoScopeNames, VideoModel } from './video'
4import { VideoChangeOwnership, VideoChangeOwnershipStatus } from '../../../shared/models/videos' 3import { VideoChangeOwnership, VideoChangeOwnershipStatus } from '../../../shared/models/videos'
4import { AccountModel } from '../account/account'
5import { getSort } from '../utils' 5import { getSort } from '../utils'
6import { MVideoChangeOwnershipFormattable, MVideoChangeOwnershipFull } from '@server/types/models/video/video-change-ownership' 6import { ScopeNames as VideoScopeNames, VideoModel } from './video'
7import * as Bluebird from 'bluebird'
8 7
9enum ScopeNames { 8enum ScopeNames {
10 WITH_ACCOUNTS = 'WITH_ACCOUNTS', 9 WITH_ACCOUNTS = 'WITH_ACCOUNTS',
@@ -54,7 +53,7 @@ enum ScopeNames {
54 ] 53 ]
55 } 54 }
56})) 55}))
57export class VideoChangeOwnershipModel extends Model<VideoChangeOwnershipModel> { 56export class VideoChangeOwnershipModel extends Model {
58 @CreatedAt 57 @CreatedAt
59 createdAt: Date 58 createdAt: Date
60 59
@@ -119,7 +118,7 @@ export class VideoChangeOwnershipModel extends Model<VideoChangeOwnershipModel>
119 ]).then(([ count, rows ]) => ({ total: count, data: rows })) 118 ]).then(([ count, rows ]) => ({ total: count, data: rows }))
120 } 119 }
121 120
122 static load (id: number): Bluebird<MVideoChangeOwnershipFull> { 121 static load (id: number): Promise<MVideoChangeOwnershipFull> {
123 return VideoChangeOwnershipModel.scope([ ScopeNames.WITH_ACCOUNTS, ScopeNames.WITH_VIDEO ]) 122 return VideoChangeOwnershipModel.scope([ ScopeNames.WITH_ACCOUNTS, ScopeNames.WITH_VIDEO ])
124 .findByPk(id) 123 .findByPk(id)
125 } 124 }
diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts
index 0c8aef18f..178878c55 100644
--- a/server/models/video/video-channel.ts
+++ b/server/models/video/video-channel.ts
@@ -1,5 +1,4 @@
1import * as Bluebird from 'bluebird' 1import { FindOptions, Includeable, literal, Op, ScopeOptions } from 'sequelize'
2import { FindOptions, literal, Op, ScopeOptions } from 'sequelize'
3import { 2import {
4 AllowNull, 3 AllowNull,
5 BeforeDestroy, 4 BeforeDestroy,
@@ -119,30 +118,31 @@ export type SummaryOptions = {
119 } 118 }
120 }, 119 },
121 [ScopeNames.SUMMARY]: (options: SummaryOptions = {}) => { 120 [ScopeNames.SUMMARY]: (options: SummaryOptions = {}) => {
121 const include: Includeable[] = [
122 {
123 attributes: [ 'id', 'preferredUsername', 'url', 'serverId', 'avatarId' ],
124 model: ActorModel.unscoped(),
125 required: options.actorRequired ?? true,
126 include: [
127 {
128 attributes: [ 'host' ],
129 model: ServerModel.unscoped(),
130 required: false
131 },
132 {
133 model: AvatarModel.unscoped(),
134 required: false
135 }
136 ]
137 }
138 ]
139
122 const base: FindOptions = { 140 const base: FindOptions = {
123 attributes: [ 'id', 'name', 'description', 'actorId' ], 141 attributes: [ 'id', 'name', 'description', 'actorId' ]
124 include: [
125 {
126 attributes: [ 'id', 'preferredUsername', 'url', 'serverId', 'avatarId' ],
127 model: ActorModel.unscoped(),
128 required: options.actorRequired ?? true,
129 include: [
130 {
131 attributes: [ 'host' ],
132 model: ServerModel.unscoped(),
133 required: false
134 },
135 {
136 model: AvatarModel.unscoped(),
137 required: false
138 }
139 ]
140 }
141 ]
142 } 142 }
143 143
144 if (options.withAccount === true) { 144 if (options.withAccount === true) {
145 base.include.push({ 145 include.push({
146 model: AccountModel.scope({ 146 model: AccountModel.scope({
147 method: [ AccountModelScopeNames.SUMMARY, { withAccountBlockerIds: options.withAccountBlockerIds } as AccountSummaryOptions ] 147 method: [ AccountModelScopeNames.SUMMARY, { withAccountBlockerIds: options.withAccountBlockerIds } as AccountSummaryOptions ]
148 }), 148 }),
@@ -150,6 +150,8 @@ export type SummaryOptions = {
150 }) 150 })
151 } 151 }
152 152
153 base.include = include
154
153 return base 155 return base
154 }, 156 },
155 [ScopeNames.WITH_ACCOUNT]: { 157 [ScopeNames.WITH_ACCOUNT]: {
@@ -221,7 +223,7 @@ export type SummaryOptions = {
221 } 223 }
222 ] 224 ]
223}) 225})
224export class VideoChannelModel extends Model<VideoChannelModel> { 226export class VideoChannelModel extends Model {
225 227
226 @AllowNull(false) 228 @AllowNull(false)
227 @Is('VideoChannelName', value => throwIfNotValid(value, isVideoChannelNameValid, 'name')) 229 @Is('VideoChannelName', value => throwIfNotValid(value, isVideoChannelNameValid, 'name'))
@@ -328,18 +330,17 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
328 order: getSort(parameters.sort) 330 order: getSort(parameters.sort)
329 } 331 }
330 332
331 const scopes = {
332 method: [ ScopeNames.FOR_API, { actorId } as AvailableForListOptions ]
333 }
334 return VideoChannelModel 333 return VideoChannelModel
335 .scope(scopes) 334 .scope({
335 method: [ ScopeNames.FOR_API, { actorId } as AvailableForListOptions ]
336 })
336 .findAndCountAll(query) 337 .findAndCountAll(query)
337 .then(({ rows, count }) => { 338 .then(({ rows, count }) => {
338 return { total: count, data: rows } 339 return { total: count, data: rows }
339 }) 340 })
340 } 341 }
341 342
342 static listLocalsForSitemap (sort: string): Bluebird<MChannelActor[]> { 343 static listLocalsForSitemap (sort: string): Promise<MChannelActor[]> {
343 const query = { 344 const query = {
344 attributes: [ ], 345 attributes: [ ],
345 offset: 0, 346 offset: 0,
@@ -391,11 +392,10 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
391 } 392 }
392 } 393 }
393 394
394 const scopes = {
395 method: [ ScopeNames.FOR_API, { actorId: options.actorId } as AvailableForListOptions ]
396 }
397 return VideoChannelModel 395 return VideoChannelModel
398 .scope(scopes) 396 .scope({
397 method: [ ScopeNames.FOR_API, { actorId: options.actorId } as AvailableForListOptions ]
398 })
399 .findAndCountAll(query) 399 .findAndCountAll(query)
400 .then(({ rows, count }) => { 400 .then(({ rows, count }) => {
401 return { total: count, data: rows } 401 return { total: count, data: rows }
@@ -457,13 +457,13 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
457 }) 457 })
458 } 458 }
459 459
460 static loadByIdAndPopulateAccount (id: number): Bluebird<MChannelAccountDefault> { 460 static loadByIdAndPopulateAccount (id: number): Promise<MChannelAccountDefault> {
461 return VideoChannelModel.unscoped() 461 return VideoChannelModel.unscoped()
462 .scope([ ScopeNames.WITH_ACTOR, ScopeNames.WITH_ACCOUNT ]) 462 .scope([ ScopeNames.WITH_ACTOR, ScopeNames.WITH_ACCOUNT ])
463 .findByPk(id) 463 .findByPk(id)
464 } 464 }
465 465
466 static loadByIdAndAccount (id: number, accountId: number): Bluebird<MChannelAccountDefault> { 466 static loadByIdAndAccount (id: number, accountId: number): Promise<MChannelAccountDefault> {
467 const query = { 467 const query = {
468 where: { 468 where: {
469 id, 469 id,
@@ -476,13 +476,13 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
476 .findOne(query) 476 .findOne(query)
477 } 477 }
478 478
479 static loadAndPopulateAccount (id: number): Bluebird<MChannelAccountDefault> { 479 static loadAndPopulateAccount (id: number): Promise<MChannelAccountDefault> {
480 return VideoChannelModel.unscoped() 480 return VideoChannelModel.unscoped()
481 .scope([ ScopeNames.WITH_ACTOR, ScopeNames.WITH_ACCOUNT ]) 481 .scope([ ScopeNames.WITH_ACTOR, ScopeNames.WITH_ACCOUNT ])
482 .findByPk(id) 482 .findByPk(id)
483 } 483 }
484 484
485 static loadByUrlAndPopulateAccount (url: string): Bluebird<MChannelAccountDefault> { 485 static loadByUrlAndPopulateAccount (url: string): Promise<MChannelAccountDefault> {
486 const query = { 486 const query = {
487 include: [ 487 include: [
488 { 488 {
@@ -508,7 +508,7 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
508 return VideoChannelModel.loadByNameAndHostAndPopulateAccount(name, host) 508 return VideoChannelModel.loadByNameAndHostAndPopulateAccount(name, host)
509 } 509 }
510 510
511 static loadLocalByNameAndPopulateAccount (name: string): Bluebird<MChannelAccountDefault> { 511 static loadLocalByNameAndPopulateAccount (name: string): Promise<MChannelAccountDefault> {
512 const query = { 512 const query = {
513 include: [ 513 include: [
514 { 514 {
@@ -527,7 +527,7 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
527 .findOne(query) 527 .findOne(query)
528 } 528 }
529 529
530 static loadByNameAndHostAndPopulateAccount (name: string, host: string): Bluebird<MChannelAccountDefault> { 530 static loadByNameAndHostAndPopulateAccount (name: string, host: string): Promise<MChannelAccountDefault> {
531 const query = { 531 const query = {
532 include: [ 532 include: [
533 { 533 {
@@ -552,7 +552,7 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
552 .findOne(query) 552 .findOne(query)
553 } 553 }
554 554
555 static loadAndPopulateAccountAndVideos (id: number): Bluebird<MChannelActorAccountDefaultVideos> { 555 static loadAndPopulateAccountAndVideos (id: number): Promise<MChannelActorAccountDefaultVideos> {
556 const options = { 556 const options = {
557 include: [ 557 include: [
558 VideoModel 558 VideoModel
diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts
index ed4a345eb..8d1c38826 100644
--- a/server/models/video/video-comment.ts
+++ b/server/models/video/video-comment.ts
@@ -1,4 +1,3 @@
1import * as Bluebird from 'bluebird'
2import { uniq } from 'lodash' 1import { uniq } from 'lodash'
3import { FindAndCountOptions, FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize' 2import { FindAndCountOptions, FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize'
4import { 3import {
@@ -174,7 +173,7 @@ export enum ScopeNames {
174 } 173 }
175 ] 174 ]
176}) 175})
177export class VideoCommentModel extends Model<VideoCommentModel> { 176export class VideoCommentModel extends Model {
178 @CreatedAt 177 @CreatedAt
179 createdAt: Date 178 createdAt: Date
180 179
@@ -255,7 +254,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
255 }) 254 })
256 CommentAbuses: VideoCommentAbuseModel[] 255 CommentAbuses: VideoCommentAbuseModel[]
257 256
258 static loadById (id: number, t?: Transaction): Bluebird<MComment> { 257 static loadById (id: number, t?: Transaction): Promise<MComment> {
259 const query: FindOptions = { 258 const query: FindOptions = {
260 where: { 259 where: {
261 id 260 id
@@ -267,7 +266,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
267 return VideoCommentModel.findOne(query) 266 return VideoCommentModel.findOne(query)
268 } 267 }
269 268
270 static loadByIdAndPopulateVideoAndAccountAndReply (id: number, t?: Transaction): Bluebird<MCommentOwnerVideoReply> { 269 static loadByIdAndPopulateVideoAndAccountAndReply (id: number, t?: Transaction): Promise<MCommentOwnerVideoReply> {
271 const query: FindOptions = { 270 const query: FindOptions = {
272 where: { 271 where: {
273 id 272 id
@@ -281,7 +280,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
281 .findOne(query) 280 .findOne(query)
282 } 281 }
283 282
284 static loadByUrlAndPopulateAccountAndVideo (url: string, t?: Transaction): Bluebird<MCommentOwnerVideo> { 283 static loadByUrlAndPopulateAccountAndVideo (url: string, t?: Transaction): Promise<MCommentOwnerVideo> {
285 const query: FindOptions = { 284 const query: FindOptions = {
286 where: { 285 where: {
287 url 286 url
@@ -293,7 +292,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
293 return VideoCommentModel.scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_VIDEO ]).findOne(query) 292 return VideoCommentModel.scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_VIDEO ]).findOne(query)
294 } 293 }
295 294
296 static loadByUrlAndPopulateReplyAndVideoUrlAndAccount (url: string, t?: Transaction): Bluebird<MCommentOwnerReplyVideoLight> { 295 static loadByUrlAndPopulateReplyAndVideoUrlAndAccount (url: string, t?: Transaction): Promise<MCommentOwnerReplyVideoLight> {
297 const query: FindOptions = { 296 const query: FindOptions = {
298 where: { 297 where: {
299 url 298 url
@@ -501,7 +500,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
501 }) 500 })
502 } 501 }
503 502
504 static listThreadParentComments (comment: MCommentId, t: Transaction, order: 'ASC' | 'DESC' = 'ASC'): Bluebird<MCommentOwner[]> { 503 static listThreadParentComments (comment: MCommentId, t: Transaction, order: 'ASC' | 'DESC' = 'ASC'): Promise<MCommentOwner[]> {
505 const query = { 504 const query = {
506 order: [ [ 'createdAt', order ] ] as Order, 505 order: [ [ 'createdAt', order ] ] as Order,
507 where: { 506 where: {
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts
index d48c9f5d4..48b337c68 100644
--- a/server/models/video/video-file.ts
+++ b/server/models/video/video-file.ts
@@ -101,7 +101,7 @@ export enum ScopeNames {
101 } 101 }
102 ] 102 ]
103}) 103})
104export class VideoFileModel extends Model<VideoFileModel> { 104export class VideoFileModel extends Model {
105 @CreatedAt 105 @CreatedAt
106 createdAt: Date 106 createdAt: Date
107 107
diff --git a/server/models/video/video-import.ts b/server/models/video/video-import.ts
index ea1e085af..f3ed651b2 100644
--- a/server/models/video/video-import.ts
+++ b/server/models/video/video-import.ts
@@ -13,15 +13,14 @@ import {
13 Table, 13 Table,
14 UpdatedAt 14 UpdatedAt
15} from 'sequelize-typescript' 15} from 'sequelize-typescript'
16import { CONSTRAINTS_FIELDS, VIDEO_IMPORT_STATES } from '../../initializers/constants' 16import { MVideoImportDefault, MVideoImportFormattable } from '@server/types/models/video/video-import'
17import { getSort, throwIfNotValid } from '../utils'
18import { ScopeNames as VideoModelScopeNames, VideoModel } from './video'
19import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports'
20import { VideoImport, VideoImportState } from '../../../shared' 17import { VideoImport, VideoImportState } from '../../../shared'
18import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports'
21import { isVideoMagnetUriValid } from '../../helpers/custom-validators/videos' 19import { isVideoMagnetUriValid } from '../../helpers/custom-validators/videos'
20import { CONSTRAINTS_FIELDS, VIDEO_IMPORT_STATES } from '../../initializers/constants'
22import { UserModel } from '../account/user' 21import { UserModel } from '../account/user'
23import * as Bluebird from 'bluebird' 22import { getSort, throwIfNotValid } from '../utils'
24import { MVideoImportDefault, MVideoImportFormattable } from '@server/types/models/video/video-import' 23import { ScopeNames as VideoModelScopeNames, VideoModel } from './video'
25 24
26@DefaultScope(() => ({ 25@DefaultScope(() => ({
27 include: [ 26 include: [
@@ -52,7 +51,7 @@ import { MVideoImportDefault, MVideoImportFormattable } from '@server/types/mode
52 } 51 }
53 ] 52 ]
54}) 53})
55export class VideoImportModel extends Model<VideoImportModel> { 54export class VideoImportModel extends Model {
56 @CreatedAt 55 @CreatedAt
57 createdAt: Date 56 createdAt: Date
58 57
@@ -120,7 +119,7 @@ export class VideoImportModel extends Model<VideoImportModel> {
120 return undefined 119 return undefined
121 } 120 }
122 121
123 static loadAndPopulateVideo (id: number): Bluebird<MVideoImportDefault> { 122 static loadAndPopulateVideo (id: number): Promise<MVideoImportDefault> {
124 return VideoImportModel.findByPk(id) 123 return VideoImportModel.findByPk(id)
125 } 124 }
126 125
diff --git a/server/models/video/video-live.ts b/server/models/video/video-live.ts
index 875ba9b31..cb4a9b896 100644
--- a/server/models/video/video-live.ts
+++ b/server/models/video/video-live.ts
@@ -28,7 +28,7 @@ import { VideoBlacklistModel } from './video-blacklist'
28 } 28 }
29 ] 29 ]
30}) 30})
31export class VideoLiveModel extends Model<VideoLiveModel> { 31export class VideoLiveModel extends Model {
32 32
33 @AllowNull(true) 33 @AllowNull(true)
34 @Column(DataType.STRING) 34 @Column(DataType.STRING)
diff --git a/server/models/video/video-playlist-element.ts b/server/models/video/video-playlist-element.ts
index d357766e9..d2d7e2740 100644
--- a/server/models/video/video-playlist-element.ts
+++ b/server/models/video/video-playlist-element.ts
@@ -1,3 +1,4 @@
1import { AggregateOptions, Op, ScopeOptions, Sequelize, Transaction } from 'sequelize'
1import { 2import {
2 AllowNull, 3 AllowNull,
3 BelongsTo, 4 BelongsTo,
@@ -13,18 +14,8 @@ import {
13 Table, 14 Table,
14 UpdatedAt 15 UpdatedAt
15} from 'sequelize-typescript' 16} from 'sequelize-typescript'
16import { ForAPIOptions, ScopeNames as VideoScopeNames, VideoModel } from './video'
17import { VideoPlaylistModel } from './video-playlist'
18import { getSort, throwIfNotValid } from '../utils'
19import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
20import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
21import { PlaylistElementObject } from '../../../shared/models/activitypub/objects/playlist-element-object'
22import validator from 'validator' 17import validator from 'validator'
23import { AggregateOptions, Op, ScopeOptions, Sequelize, Transaction } from 'sequelize' 18import { MUserAccountId } from '@server/types/models'
24import { VideoPlaylistElement, VideoPlaylistElementType } from '../../../shared/models/videos/playlist/video-playlist-element.model'
25import { AccountModel } from '../account/account'
26import { VideoPrivacy } from '../../../shared/models/videos'
27import * as Bluebird from 'bluebird'
28import { 19import {
29 MVideoPlaylistElement, 20 MVideoPlaylistElement,
30 MVideoPlaylistElementAP, 21 MVideoPlaylistElementAP,
@@ -32,7 +23,15 @@ import {
32 MVideoPlaylistElementVideoUrlPlaylistPrivacy, 23 MVideoPlaylistElementVideoUrlPlaylistPrivacy,
33 MVideoPlaylistVideoThumbnail 24 MVideoPlaylistVideoThumbnail
34} from '@server/types/models/video/video-playlist-element' 25} from '@server/types/models/video/video-playlist-element'
35import { MUserAccountId } from '@server/types/models' 26import { PlaylistElementObject } from '../../../shared/models/activitypub/objects/playlist-element-object'
27import { VideoPrivacy } from '../../../shared/models/videos'
28import { VideoPlaylistElement, VideoPlaylistElementType } from '../../../shared/models/videos/playlist/video-playlist-element.model'
29import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
30import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
31import { AccountModel } from '../account/account'
32import { getSort, throwIfNotValid } from '../utils'
33import { ForAPIOptions, ScopeNames as VideoScopeNames, VideoModel } from './video'
34import { VideoPlaylistModel } from './video-playlist'
36 35
37@Table({ 36@Table({
38 tableName: 'videoPlaylistElement', 37 tableName: 'videoPlaylistElement',
@@ -49,7 +48,7 @@ import { MUserAccountId } from '@server/types/models'
49 } 48 }
50 ] 49 ]
51}) 50})
52export class VideoPlaylistElementModel extends Model<VideoPlaylistElementModel> { 51export class VideoPlaylistElementModel extends Model {
53 @CreatedAt 52 @CreatedAt
54 createdAt: Date 53 createdAt: Date
55 54
@@ -166,7 +165,7 @@ export class VideoPlaylistElementModel extends Model<VideoPlaylistElementModel>
166 ]).then(([ total, data ]) => ({ total, data })) 165 ]).then(([ total, data ]) => ({ total, data }))
167 } 166 }
168 167
169 static loadByPlaylistAndVideo (videoPlaylistId: number, videoId: number): Bluebird<MVideoPlaylistElement> { 168 static loadByPlaylistAndVideo (videoPlaylistId: number, videoId: number): Promise<MVideoPlaylistElement> {
170 const query = { 169 const query = {
171 where: { 170 where: {
172 videoPlaylistId, 171 videoPlaylistId,
@@ -177,14 +176,14 @@ export class VideoPlaylistElementModel extends Model<VideoPlaylistElementModel>
177 return VideoPlaylistElementModel.findOne(query) 176 return VideoPlaylistElementModel.findOne(query)
178 } 177 }
179 178
180 static loadById (playlistElementId: number | string): Bluebird<MVideoPlaylistElement> { 179 static loadById (playlistElementId: number | string): Promise<MVideoPlaylistElement> {
181 return VideoPlaylistElementModel.findByPk(playlistElementId) 180 return VideoPlaylistElementModel.findByPk(playlistElementId)
182 } 181 }
183 182
184 static loadByPlaylistAndElementIdForAP ( 183 static loadByPlaylistAndElementIdForAP (
185 playlistId: number | string, 184 playlistId: number | string,
186 playlistElementId: number 185 playlistElementId: number
187 ): Bluebird<MVideoPlaylistElementVideoUrlPlaylistPrivacy> { 186 ): Promise<MVideoPlaylistElementVideoUrlPlaylistPrivacy> {
188 const playlistWhere = validator.isUUID('' + playlistId) ? { uuid: playlistId } : { id: playlistId } 187 const playlistWhere = validator.isUUID('' + playlistId) ? { uuid: playlistId } : { id: playlistId }
189 188
190 const query = { 189 const query = {
@@ -226,7 +225,7 @@ export class VideoPlaylistElementModel extends Model<VideoPlaylistElementModel>
226 }) 225 })
227 } 226 }
228 227
229 static loadFirstElementWithVideoThumbnail (videoPlaylistId: number): Bluebird<MVideoPlaylistVideoThumbnail> { 228 static loadFirstElementWithVideoThumbnail (videoPlaylistId: number): Promise<MVideoPlaylistVideoThumbnail> {
230 const query = { 229 const query = {
231 order: getSort('position'), 230 order: getSort('position'),
232 where: { 231 where: {
diff --git a/server/models/video/video-playlist.ts b/server/models/video/video-playlist.ts
index 9f9e0b069..93ecf8cea 100644
--- a/server/models/video/video-playlist.ts
+++ b/server/models/video/video-playlist.ts
@@ -1,4 +1,3 @@
1import * as Bluebird from 'bluebird'
2import { join } from 'path' 1import { join } from 'path'
3import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize' 2import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize'
4import { 3import {
@@ -125,7 +124,6 @@ type AvailableForListOptions = {
125 ] 124 ]
126 }, 125 },
127 [ScopeNames.AVAILABLE_FOR_LIST]: (options: AvailableForListOptions) => { 126 [ScopeNames.AVAILABLE_FOR_LIST]: (options: AvailableForListOptions) => {
128
129 let whereActor: WhereOptions = {} 127 let whereActor: WhereOptions = {}
130 128
131 const whereAnd: WhereOptions[] = [] 129 const whereAnd: WhereOptions[] = []
@@ -182,15 +180,13 @@ type AvailableForListOptions = {
182 [Op.and]: whereAnd 180 [Op.and]: whereAnd
183 } 181 }
184 182
185 const accountScope = {
186 method: [ AccountScopeNames.SUMMARY, { whereActor } as SummaryOptions ]
187 }
188
189 return { 183 return {
190 where, 184 where,
191 include: [ 185 include: [
192 { 186 {
193 model: AccountModel.scope(accountScope), 187 model: AccountModel.scope({
188 method: [ AccountScopeNames.SUMMARY, { whereActor } as SummaryOptions ]
189 }),
194 required: true 190 required: true
195 }, 191 },
196 { 192 {
@@ -217,7 +213,7 @@ type AvailableForListOptions = {
217 } 213 }
218 ] 214 ]
219}) 215})
220export class VideoPlaylistModel extends Model<VideoPlaylistModel> { 216export class VideoPlaylistModel extends Model {
221 @CreatedAt 217 @CreatedAt
222 createdAt: Date 218 createdAt: Date
223 219
@@ -367,7 +363,7 @@ export class VideoPlaylistModel extends Model<VideoPlaylistModel> {
367 }) 363 })
368 } 364 }
369 365
370 static listPlaylistIdsOf (accountId: number, videoIds: number[]): Bluebird<MVideoPlaylistIdWithElements[]> { 366 static listPlaylistIdsOf (accountId: number, videoIds: number[]): Promise<MVideoPlaylistIdWithElements[]> {
371 const query = { 367 const query = {
372 attributes: [ 'id' ], 368 attributes: [ 'id' ],
373 where: { 369 where: {
@@ -392,7 +388,7 @@ export class VideoPlaylistModel extends Model<VideoPlaylistModel> {
392 388
393 static doesPlaylistExist (url: string) { 389 static doesPlaylistExist (url: string) {
394 const query = { 390 const query = {
395 attributes: [], 391 attributes: [ 'id' ],
396 where: { 392 where: {
397 url 393 url
398 } 394 }
@@ -403,7 +399,7 @@ export class VideoPlaylistModel extends Model<VideoPlaylistModel> {
403 .then(e => !!e) 399 .then(e => !!e)
404 } 400 }
405 401
406 static loadWithAccountAndChannelSummary (id: number | string, transaction: Transaction): Bluebird<MVideoPlaylistFullSummary> { 402 static loadWithAccountAndChannelSummary (id: number | string, transaction: Transaction): Promise<MVideoPlaylistFullSummary> {
407 const where = buildWhereIdOrUUID(id) 403 const where = buildWhereIdOrUUID(id)
408 404
409 const query = { 405 const query = {
@@ -416,7 +412,7 @@ export class VideoPlaylistModel extends Model<VideoPlaylistModel> {
416 .findOne(query) 412 .findOne(query)
417 } 413 }
418 414
419 static loadWithAccountAndChannel (id: number | string, transaction: Transaction): Bluebird<MVideoPlaylistFull> { 415 static loadWithAccountAndChannel (id: number | string, transaction: Transaction): Promise<MVideoPlaylistFull> {
420 const where = buildWhereIdOrUUID(id) 416 const where = buildWhereIdOrUUID(id)
421 417
422 const query = { 418 const query = {
@@ -429,7 +425,7 @@ export class VideoPlaylistModel extends Model<VideoPlaylistModel> {
429 .findOne(query) 425 .findOne(query)
430 } 426 }
431 427
432 static loadByUrlAndPopulateAccount (url: string): Bluebird<MVideoPlaylistAccountThumbnail> { 428 static loadByUrlAndPopulateAccount (url: string): Promise<MVideoPlaylistAccountThumbnail> {
433 const query = { 429 const query = {
434 where: { 430 where: {
435 url 431 url
diff --git a/server/models/video/video-share.ts b/server/models/video/video-share.ts
index f9ee94589..b7f5f3fa3 100644
--- a/server/models/video/video-share.ts
+++ b/server/models/video/video-share.ts
@@ -1,13 +1,12 @@
1import * as Bluebird from 'bluebird' 1import { literal, Op, Transaction } from 'sequelize'
2import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' 2import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
3import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' 3import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
4import { CONSTRAINTS_FIELDS } from '../../initializers/constants' 4import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
5import { MActorDefault } from '../../types/models'
6import { MVideoShareActor, MVideoShareFull } from '../../types/models/video'
5import { ActorModel } from '../activitypub/actor' 7import { ActorModel } from '../activitypub/actor'
6import { buildLocalActorIdsIn, throwIfNotValid } from '../utils' 8import { buildLocalActorIdsIn, throwIfNotValid } from '../utils'
7import { VideoModel } from './video' 9import { VideoModel } from './video'
8import { literal, Op, Transaction } from 'sequelize'
9import { MVideoShareActor, MVideoShareFull } from '../../types/models/video'
10import { MActorDefault } from '../../types/models'
11 10
12enum ScopeNames { 11enum ScopeNames {
13 FULL = 'FULL', 12 FULL = 'FULL',
@@ -51,7 +50,7 @@ enum ScopeNames {
51 } 50 }
52 ] 51 ]
53}) 52})
54export class VideoShareModel extends Model<VideoShareModel> { 53export class VideoShareModel extends Model {
55 54
56 @AllowNull(false) 55 @AllowNull(false)
57 @Is('VideoShareUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url')) 56 @Is('VideoShareUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url'))
@@ -88,7 +87,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
88 }) 87 })
89 Video: VideoModel 88 Video: VideoModel
90 89
91 static load (actorId: number | string, videoId: number | string, t?: Transaction): Bluebird<MVideoShareActor> { 90 static load (actorId: number | string, videoId: number | string, t?: Transaction): Promise<MVideoShareActor> {
92 return VideoShareModel.scope(ScopeNames.WITH_ACTOR).findOne({ 91 return VideoShareModel.scope(ScopeNames.WITH_ACTOR).findOne({
93 where: { 92 where: {
94 actorId, 93 actorId,
@@ -98,7 +97,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
98 }) 97 })
99 } 98 }
100 99
101 static loadByUrl (url: string, t: Transaction): Bluebird<MVideoShareFull> { 100 static loadByUrl (url: string, t: Transaction): Promise<MVideoShareFull> {
102 return VideoShareModel.scope(ScopeNames.FULL).findOne({ 101 return VideoShareModel.scope(ScopeNames.FULL).findOne({
103 where: { 102 where: {
104 url 103 url
@@ -107,7 +106,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
107 }) 106 })
108 } 107 }
109 108
110 static loadActorsByShare (videoId: number, t: Transaction): Bluebird<MActorDefault[]> { 109 static loadActorsByShare (videoId: number, t: Transaction): Promise<MActorDefault[]> {
111 const query = { 110 const query = {
112 where: { 111 where: {
113 videoId 112 videoId
@@ -125,7 +124,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
125 .then((res: MVideoShareFull[]) => res.map(r => r.Actor)) 124 .then((res: MVideoShareFull[]) => res.map(r => r.Actor))
126 } 125 }
127 126
128 static loadActorsWhoSharedVideosOf (actorOwnerId: number, t: Transaction): Bluebird<MActorDefault[]> { 127 static loadActorsWhoSharedVideosOf (actorOwnerId: number, t: Transaction): Promise<MActorDefault[]> {
129 const safeOwnerId = parseInt(actorOwnerId + '', 10) 128 const safeOwnerId = parseInt(actorOwnerId + '', 10)
130 129
131 // /!\ On actor model 130 // /!\ On actor model
@@ -150,7 +149,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
150 return ActorModel.findAll(query) 149 return ActorModel.findAll(query)
151 } 150 }
152 151
153 static loadActorsByVideoChannel (videoChannelId: number, t: Transaction): Bluebird<MActorDefault[]> { 152 static loadActorsByVideoChannel (videoChannelId: number, t: Transaction): Promise<MActorDefault[]> {
154 const safeChannelId = parseInt(videoChannelId + '', 10) 153 const safeChannelId = parseInt(videoChannelId + '', 10)
155 154
156 // /!\ On actor model 155 // /!\ On actor model
diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts
index 73bd89844..148768c21 100644
--- a/server/models/video/video-streaming-playlist.ts
+++ b/server/models/video/video-streaming-playlist.ts
@@ -40,7 +40,7 @@ import { logger } from '@server/helpers/logger'
40 } 40 }
41 ] 41 ]
42}) 42})
43export class VideoStreamingPlaylistModel extends Model<VideoStreamingPlaylistModel> { 43export class VideoStreamingPlaylistModel extends Model {
44 @CreatedAt 44 @CreatedAt
45 createdAt: Date 45 createdAt: Date
46 46
diff --git a/server/models/video/video-tag.ts b/server/models/video/video-tag.ts
index ca15e3426..5052b8c4d 100644
--- a/server/models/video/video-tag.ts
+++ b/server/models/video/video-tag.ts
@@ -13,7 +13,7 @@ import { VideoModel } from './video'
13 } 13 }
14 ] 14 ]
15}) 15})
16export class VideoTagModel extends Model<VideoTagModel> { 16export class VideoTagModel extends Model {
17 @CreatedAt 17 @CreatedAt
18 createdAt: Date 18 createdAt: Date
19 19
diff --git a/server/models/video/video-view.ts b/server/models/video/video-view.ts
index 40db5effd..992cf258a 100644
--- a/server/models/video/video-view.ts
+++ b/server/models/video/video-view.ts
@@ -14,7 +14,7 @@ import * as Sequelize from 'sequelize'
14 } 14 }
15 ] 15 ]
16}) 16})
17export class VideoViewModel extends Model<VideoViewModel> { 17export class VideoViewModel extends Model {
18 @CreatedAt 18 @CreatedAt
19 createdAt: Date 19 createdAt: Date
20 20
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index a43abbc09..d3fed338a 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -2,7 +2,7 @@ import * as Bluebird from 'bluebird'
2import { remove } from 'fs-extra' 2import { remove } from 'fs-extra'
3import { maxBy, minBy, pick } from 'lodash' 3import { maxBy, minBy, pick } from 'lodash'
4import { join } from 'path' 4import { join } from 'path'
5import { FindOptions, IncludeOptions, Op, QueryTypes, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize' 5import { FindOptions, Includeable, IncludeOptions, Op, QueryTypes, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize'
6import { 6import {
7 AllowNull, 7 AllowNull,
8 BeforeDestroy, 8 BeforeDestroy,
@@ -190,26 +190,26 @@ export type AvailableForListIDsOptions = {
190 attributes: [ 'id', 'url', 'uuid', 'remote' ] 190 attributes: [ 'id', 'url', 'uuid', 'remote' ]
191 }, 191 },
192 [ScopeNames.FOR_API]: (options: ForAPIOptions) => { 192 [ScopeNames.FOR_API]: (options: ForAPIOptions) => {
193 const query: FindOptions = { 193 const include: Includeable[] = [
194 include: [ 194 {
195 { 195 model: VideoChannelModel.scope({
196 model: VideoChannelModel.scope({ 196 method: [
197 method: [ 197 VideoChannelScopeNames.SUMMARY, {
198 VideoChannelScopeNames.SUMMARY, { 198 withAccount: true,
199 withAccount: true, 199 withAccountBlockerIds: options.withAccountBlockerIds
200 withAccountBlockerIds: options.withAccountBlockerIds 200 } as SummaryOptions
201 } as SummaryOptions 201 ]
202 ] 202 }),
203 }), 203 required: true
204 required: true 204 },
205 }, 205 {
206 { 206 attributes: [ 'type', 'filename' ],
207 attributes: [ 'type', 'filename' ], 207 model: ThumbnailModel,
208 model: ThumbnailModel, 208 required: false
209 required: false 209 }
210 } 210 ]
211 ] 211
212 } 212 const query: FindOptions = {}
213 213
214 if (options.ids) { 214 if (options.ids) {
215 query.where = { 215 query.where = {
@@ -220,14 +220,14 @@ export type AvailableForListIDsOptions = {
220 } 220 }
221 221
222 if (options.withFiles === true) { 222 if (options.withFiles === true) {
223 query.include.push({ 223 include.push({
224 model: VideoFileModel, 224 model: VideoFileModel,
225 required: true 225 required: true
226 }) 226 })
227 } 227 }
228 228
229 if (options.videoPlaylistId) { 229 if (options.videoPlaylistId) {
230 query.include.push({ 230 include.push({
231 model: VideoPlaylistElementModel.unscoped(), 231 model: VideoPlaylistElementModel.unscoped(),
232 required: true, 232 required: true,
233 where: { 233 where: {
@@ -236,6 +236,8 @@ export type AvailableForListIDsOptions = {
236 }) 236 })
237 } 237 }
238 238
239 query.include = include
240
239 return query 241 return query
240 }, 242 },
241 [ScopeNames.WITH_THUMBNAILS]: { 243 [ScopeNames.WITH_THUMBNAILS]: {
@@ -477,7 +479,7 @@ export type AvailableForListIDsOptions = {
477 } 479 }
478 ] 480 ]
479}) 481})
480export class VideoModel extends Model<VideoModel> { 482export class VideoModel extends Model {
481 483
482 @AllowNull(false) 484 @AllowNull(false)
483 @Default(DataType.UUIDV4) 485 @Default(DataType.UUIDV4)
@@ -860,7 +862,7 @@ export class VideoModel extends Model<VideoModel> {
860 return undefined 862 return undefined
861 } 863 }
862 864
863 static listLocal (): Bluebird<MVideoWithAllFiles[]> { 865 static listLocal (): Promise<MVideoWithAllFiles[]> {
864 const query = { 866 const query = {
865 where: { 867 where: {
866 remote: false 868 remote: false
@@ -988,7 +990,7 @@ export class VideoModel extends Model<VideoModel> {
988 }) 990 })
989 } 991 }
990 992
991 static listPublishedLiveIds () { 993 static async listPublishedLiveIds () {
992 const options = { 994 const options = {
993 attributes: [ 'id' ], 995 attributes: [ 'id' ],
994 where: { 996 where: {
@@ -997,8 +999,9 @@ export class VideoModel extends Model<VideoModel> {
997 } 999 }
998 } 1000 }
999 1001
1000 return VideoModel.findAll(options) 1002 const result = await VideoModel.findAll(options)
1001 .map(v => v.id) 1003
1004 return result.map(v => v.id)
1002 } 1005 }
1003 1006
1004 static listUserVideosForApi ( 1007 static listUserVideosForApi (
@@ -1214,7 +1217,7 @@ export class VideoModel extends Model<VideoModel> {
1214 return VideoModel.count(options) 1217 return VideoModel.count(options)
1215 } 1218 }
1216 1219
1217 static load (id: number | string, t?: Transaction): Bluebird<MVideoThumbnail> { 1220 static load (id: number | string, t?: Transaction): Promise<MVideoThumbnail> {
1218 const where = buildWhereIdOrUUID(id) 1221 const where = buildWhereIdOrUUID(id)
1219 const options = { 1222 const options = {
1220 where, 1223 where,
@@ -1224,7 +1227,7 @@ export class VideoModel extends Model<VideoModel> {
1224 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options) 1227 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options)
1225 } 1228 }
1226 1229
1227 static loadWithBlacklist (id: number | string, t?: Transaction): Bluebird<MVideoThumbnailBlacklist> { 1230 static loadWithBlacklist (id: number | string, t?: Transaction): Promise<MVideoThumbnailBlacklist> {
1228 const where = buildWhereIdOrUUID(id) 1231 const where = buildWhereIdOrUUID(id)
1229 const options = { 1232 const options = {
1230 where, 1233 where,
@@ -1237,7 +1240,7 @@ export class VideoModel extends Model<VideoModel> {
1237 ]).findOne(options) 1240 ]).findOne(options)
1238 } 1241 }
1239 1242
1240 static loadImmutableAttributes (id: number | string, t?: Transaction): Bluebird<MVideoImmutable> { 1243 static loadImmutableAttributes (id: number | string, t?: Transaction): Promise<MVideoImmutable> {
1241 const fun = () => { 1244 const fun = () => {
1242 const query = { 1245 const query = {
1243 where: buildWhereIdOrUUID(id), 1246 where: buildWhereIdOrUUID(id),
@@ -1255,7 +1258,7 @@ export class VideoModel extends Model<VideoModel> {
1255 }) 1258 })
1256 } 1259 }
1257 1260
1258 static loadWithRights (id: number | string, t?: Transaction): Bluebird<MVideoWithRights> { 1261 static loadWithRights (id: number | string, t?: Transaction): Promise<MVideoWithRights> {
1259 const where = buildWhereIdOrUUID(id) 1262 const where = buildWhereIdOrUUID(id)
1260 const options = { 1263 const options = {
1261 where, 1264 where,
@@ -1269,7 +1272,7 @@ export class VideoModel extends Model<VideoModel> {
1269 ]).findOne(options) 1272 ]).findOne(options)
1270 } 1273 }
1271 1274
1272 static loadOnlyId (id: number | string, t?: Transaction): Bluebird<MVideoIdThumbnail> { 1275 static loadOnlyId (id: number | string, t?: Transaction): Promise<MVideoIdThumbnail> {
1273 const where = buildWhereIdOrUUID(id) 1276 const where = buildWhereIdOrUUID(id)
1274 1277
1275 const options = { 1278 const options = {
@@ -1281,7 +1284,7 @@ export class VideoModel extends Model<VideoModel> {
1281 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options) 1284 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options)
1282 } 1285 }
1283 1286
1284 static loadWithFiles (id: number | string, t?: Transaction, logging?: boolean): Bluebird<MVideoWithAllFiles> { 1287 static loadWithFiles (id: number | string, t?: Transaction, logging?: boolean): Promise<MVideoWithAllFiles> {
1285 const where = buildWhereIdOrUUID(id) 1288 const where = buildWhereIdOrUUID(id)
1286 1289
1287 const query = { 1290 const query = {
@@ -1297,7 +1300,7 @@ export class VideoModel extends Model<VideoModel> {
1297 ]).findOne(query) 1300 ]).findOne(query)
1298 } 1301 }
1299 1302
1300 static loadByUUID (uuid: string): Bluebird<MVideoThumbnail> { 1303 static loadByUUID (uuid: string): Promise<MVideoThumbnail> {
1301 const options = { 1304 const options = {
1302 where: { 1305 where: {
1303 uuid 1306 uuid
@@ -1307,7 +1310,7 @@ export class VideoModel extends Model<VideoModel> {
1307 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options) 1310 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(options)
1308 } 1311 }
1309 1312
1310 static loadByUrl (url: string, transaction?: Transaction): Bluebird<MVideoThumbnail> { 1313 static loadByUrl (url: string, transaction?: Transaction): Promise<MVideoThumbnail> {
1311 const query: FindOptions = { 1314 const query: FindOptions = {
1312 where: { 1315 where: {
1313 url 1316 url
@@ -1318,7 +1321,7 @@ export class VideoModel extends Model<VideoModel> {
1318 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(query) 1321 return VideoModel.scope(ScopeNames.WITH_THUMBNAILS).findOne(query)
1319 } 1322 }
1320 1323
1321 static loadByUrlImmutableAttributes (url: string, transaction?: Transaction): Bluebird<MVideoImmutable> { 1324 static loadByUrlImmutableAttributes (url: string, transaction?: Transaction): Promise<MVideoImmutable> {
1322 const fun = () => { 1325 const fun = () => {
1323 const query: FindOptions = { 1326 const query: FindOptions = {
1324 where: { 1327 where: {
@@ -1338,7 +1341,7 @@ export class VideoModel extends Model<VideoModel> {
1338 }) 1341 })
1339 } 1342 }
1340 1343
1341 static loadByUrlAndPopulateAccount (url: string, transaction?: Transaction): Bluebird<MVideoAccountLightBlacklistAllFiles> { 1344 static loadByUrlAndPopulateAccount (url: string, transaction?: Transaction): Promise<MVideoAccountLightBlacklistAllFiles> {
1342 const query: FindOptions = { 1345 const query: FindOptions = {
1343 where: { 1346 where: {
1344 url 1347 url
@@ -1355,7 +1358,7 @@ export class VideoModel extends Model<VideoModel> {
1355 ]).findOne(query) 1358 ]).findOne(query)
1356 } 1359 }
1357 1360
1358 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Transaction, userId?: number): Bluebird<MVideoFullLight> { 1361 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Transaction, userId?: number): Promise<MVideoFullLight> {
1359 const where = buildWhereIdOrUUID(id) 1362 const where = buildWhereIdOrUUID(id)
1360 1363
1361 const options = { 1364 const options = {
@@ -1388,7 +1391,7 @@ export class VideoModel extends Model<VideoModel> {
1388 id: number | string 1391 id: number | string
1389 t?: Transaction 1392 t?: Transaction
1390 userId?: number 1393 userId?: number
1391 }): Bluebird<MVideoDetails> { 1394 }): Promise<MVideoDetails> {
1392 const { id, t, userId } = parameters 1395 const { id, t, userId } = parameters
1393 const where = buildWhereIdOrUUID(id) 1396 const where = buildWhereIdOrUUID(id)
1394 1397
@@ -1487,7 +1490,7 @@ export class VideoModel extends Model<VideoModel> {
1487 return VideoModel.update({ support: videoChannel.support }, options) 1490 return VideoModel.update({ support: videoChannel.support }, options)
1488 } 1491 }
1489 1492
1490 static getAllIdsFromChannel (videoChannel: MChannelId): Bluebird<number[]> { 1493 static getAllIdsFromChannel (videoChannel: MChannelId): Promise<number[]> {
1491 const query = { 1494 const query = {
1492 attributes: [ 'id' ], 1495 attributes: [ 'id' ],
1493 where: { 1496 where: {