import { VideoPlaylistType } from '../../../shared/models/videos/playlist/video-playlist-type.model'
import { ThumbnailModel } from './thumbnail'
import { ActivityIconObject } from '../../../shared/models/activitypub/objects'
-import { fn, literal, Op, Transaction } from 'sequelize'
+import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize'
enum ScopeNames {
AVAILABLE_FOR_LIST = 'AVAILABLE_FOR_LIST',
privateAndUnlisted?: boolean
}
-@Scopes({
+@Scopes(() => ({
[ ScopeNames.WITH_THUMBNAIL ]: {
include: [
{
- model: () => ThumbnailModel,
+ model: ThumbnailModel,
required: false
}
]
[ ScopeNames.WITH_VIDEOS_LENGTH ]: {
attributes: {
include: [
- [
- fn('COUNT', 'toto'),
- 'coucou'
- ],
[
literal('(SELECT COUNT("id") FROM "videoPlaylistElement" WHERE "videoPlaylistId" = "VideoPlaylistModel"."id")'),
'videosLength'
]
]
}
- },
+ } as FindOptions,
[ ScopeNames.WITH_ACCOUNT ]: {
include: [
{
- model: () => AccountModel,
+ model: AccountModel,
required: true
}
]
[ ScopeNames.WITH_ACCOUNT_AND_CHANNEL_SUMMARY ]: {
include: [
{
- model: () => AccountModel.scope(AccountScopeNames.SUMMARY),
+ model: AccountModel.scope(AccountScopeNames.SUMMARY),
required: true
},
{
- model: () => VideoChannelModel.scope(VideoChannelScopeNames.SUMMARY),
+ model: VideoChannelModel.scope(VideoChannelScopeNames.SUMMARY),
required: false
}
]
[ ScopeNames.WITH_ACCOUNT_AND_CHANNEL ]: {
include: [
{
- model: () => AccountModel,
+ model: AccountModel,
required: true
},
{
- model: () => VideoChannelModel,
+ model: VideoChannelModel,
required: false
}
]
]
}
- const whereAnd: any[] = []
+ const whereAnd: WhereOptions[] = []
if (options.privateAndUnlisted !== true) {
whereAnd.push({
required: false
}
]
- }
+ } as FindOptions
}
-})
+}))
@Table({
tableName: 'videoPlaylist',
VideoPlaylistElements: VideoPlaylistElementModel[]
@HasOne(() => ThumbnailModel, {
+
foreignKey: {
name: 'videoPlaylistId',
allowNull: true
order: getSort(options.sort)
}
- const scopes = [
+ const scopes: (string | ScopeOptions)[] = [
{
method: [
ScopeNames.AVAILABLE_FOR_LIST,
privateAndUnlisted: options.privateAndUnlisted
} as AvailableForListOptions
]
- } as any, // FIXME: typings
+ },
ScopeNames.WITH_VIDEOS_LENGTH,
ScopeNames.WITH_THUMBNAIL
]
model: VideoPlaylistElementModel.unscoped(),
where: {
videoId: {
- [Op.any]: videoIds
+ [Op.in]: videoIds // FIXME: sequelize ANY seems broken
}
},
required: true
return VideoPlaylistModel.update({ privacy: VideoPlaylistPrivacy.PRIVATE, videoChannelId: null }, query)
}
- setThumbnail (thumbnail: ThumbnailModel) {
- this.Thumbnail = thumbnail
- }
+ async setAndSaveThumbnail (thumbnail: ThumbnailModel, t: Transaction) {
+ thumbnail.videoPlaylistId = this.id
- getThumbnail () {
- return this.Thumbnail
+ this.Thumbnail = await thumbnail.save({ transaction: t })
}
hasThumbnail () {
getThumbnailUrl () {
if (!this.hasThumbnail()) return null
- return WEBSERVER.URL + STATIC_PATHS.THUMBNAILS + this.getThumbnail().filename
+ return WEBSERVER.URL + STATIC_PATHS.THUMBNAILS + this.Thumbnail.filename
}
getThumbnailStaticPath () {
if (!this.hasThumbnail()) return null
- return join(STATIC_PATHS.THUMBNAILS, this.getThumbnail().filename)
+ return join(STATIC_PATHS.THUMBNAILS, this.Thumbnail.filename)
}
setAsRefreshed () {