X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-playlist-element.ts;h=b832f9768c04a66c0160ac03c47cafc3f8a59e37;hb=0c9668f77901e7540e2c7045eb0f2974a4842a69;hp=d2d7e2740eeffe03e09f9faa6c8ec2c8ab294494;hpb=b49f22d8f9a52ab75fd38db2d377249eb58fa678;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-playlist-element.ts b/server/models/video/video-playlist-element.ts index d2d7e2740..b832f9768 100644 --- a/server/models/video/video-playlist-element.ts +++ b/server/models/video/video-playlist-element.ts @@ -23,13 +23,15 @@ import { MVideoPlaylistElementVideoUrlPlaylistPrivacy, MVideoPlaylistVideoThumbnail } from '@server/types/models/video/video-playlist-element' +import { forceNumber } from '@shared/core-utils' +import { AttributesOnly } from '@shared/typescript-utils' import { PlaylistElementObject } from '../../../shared/models/activitypub/objects/playlist-element-object' import { VideoPrivacy } from '../../../shared/models/videos' import { VideoPlaylistElement, VideoPlaylistElementType } from '../../../shared/models/videos/playlist/video-playlist-element.model' import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' import { CONSTRAINTS_FIELDS } from '../../initializers/constants' import { AccountModel } from '../account/account' -import { getSort, throwIfNotValid } from '../utils' +import { getSort, throwIfNotValid } from '../shared' import { ForAPIOptions, ScopeNames as VideoScopeNames, VideoModel } from './video' import { VideoPlaylistModel } from './video-playlist' @@ -48,7 +50,7 @@ import { VideoPlaylistModel } from './video-playlist' } ] }) -export class VideoPlaylistElementModel extends Model { +export class VideoPlaylistElementModel extends Model>> { @CreatedAt createdAt: Date @@ -184,7 +186,9 @@ export class VideoPlaylistElementModel extends Model { playlistId: number | string, playlistElementId: number ): Promise { - const playlistWhere = validator.isUUID('' + playlistId) ? { uuid: playlistId } : { id: playlistId } + const playlistWhere = validator.isUUID('' + playlistId) + ? { uuid: playlistId } + : { id: playlistId } const query = { include: [ @@ -207,22 +211,28 @@ export class VideoPlaylistElementModel extends Model { } static listUrlsOfForAP (videoPlaylistId: number, start: number, count: number, t?: Transaction) { - const query = { - attributes: [ 'url' ], - offset: start, - limit: count, - order: getSort('position'), - where: { - videoPlaylistId - }, - transaction: t + const getQuery = (forCount: boolean) => { + return { + attributes: forCount + ? [] + : [ 'url' ], + offset: start, + limit: count, + order: getSort('position'), + where: { + videoPlaylistId + }, + transaction: t + } } - return VideoPlaylistElementModel - .findAndCountAll(query) - .then(({ rows, count }) => { - return { total: count, data: rows.map(e => e.url) } - }) + return Promise.all([ + VideoPlaylistElementModel.count(getQuery(true)), + VideoPlaylistElementModel.findAll(getQuery(false)) + ]).then(([ total, rows ]) => ({ + total, + data: rows.map(e => e.url) + })) } static loadFirstElementWithVideoThumbnail (videoPlaylistId: number): Promise { @@ -255,13 +265,15 @@ export class VideoPlaylistElementModel extends Model { .then(position => position ? position + 1 : 1) } - static reassignPositionOf ( - videoPlaylistId: number, - firstPosition: number, - endPosition: number, - newPosition: number, + static reassignPositionOf (options: { + videoPlaylistId: number + firstPosition: number + endPosition: number + newPosition: number transaction?: Transaction - ) { + }) { + const { videoPlaylistId, firstPosition, endPosition, newPosition, transaction } = options + const query = { where: { videoPlaylistId, @@ -274,13 +286,13 @@ export class VideoPlaylistElementModel extends Model { validate: false // We use a literal to update the position } - return VideoPlaylistElementModel.update({ position: Sequelize.literal(`${newPosition} + "position" - ${firstPosition}`) }, query) + const positionQuery = Sequelize.literal(`${forceNumber(newPosition)} + "position" - ${forceNumber(firstPosition)}`) + return VideoPlaylistElementModel.update({ position: positionQuery }, query) } static increasePositionOf ( videoPlaylistId: number, fromPosition: number, - toPosition?: number, by = 1, transaction?: Transaction ) { @@ -297,7 +309,23 @@ export class VideoPlaylistElementModel extends Model { return VideoPlaylistElementModel.increment({ position: by }, query) } - getType (this: MVideoPlaylistElementFormattable, displayNSFW?: boolean, accountId?: number) { + toFormattedJSON ( + this: MVideoPlaylistElementFormattable, + options: { accountId?: number } = {} + ): VideoPlaylistElement { + return { + id: this.id, + position: this.position, + startTimestamp: this.startTimestamp, + stopTimestamp: this.stopTimestamp, + + type: this.getType(options.accountId), + + video: this.getVideoElement(options.accountId) + } + } + + getType (this: MVideoPlaylistElementFormattable, accountId?: number) { const video = this.Video if (!video) return VideoPlaylistElementType.DELETED @@ -311,40 +339,23 @@ export class VideoPlaylistElementModel extends Model { if (video.privacy === VideoPrivacy.PRIVATE || video.privacy === VideoPrivacy.INTERNAL) return VideoPlaylistElementType.PRIVATE if (video.isBlacklisted() || video.isBlocked()) return VideoPlaylistElementType.UNAVAILABLE - if (video.nsfw === true && displayNSFW === false) return VideoPlaylistElementType.UNAVAILABLE return VideoPlaylistElementType.REGULAR } - getVideoElement (this: MVideoPlaylistElementFormattable, displayNSFW?: boolean, accountId?: number) { + getVideoElement (this: MVideoPlaylistElementFormattable, accountId?: number) { if (!this.Video) return null - if (this.getType(displayNSFW, accountId) !== VideoPlaylistElementType.REGULAR) return null + if (this.getType(accountId) !== VideoPlaylistElementType.REGULAR) return null return this.Video.toFormattedJSON() } - toFormattedJSON ( - this: MVideoPlaylistElementFormattable, - options: { displayNSFW?: boolean, accountId?: number } = {} - ): VideoPlaylistElement { - return { - id: this.id, - position: this.position, - startTimestamp: this.startTimestamp, - stopTimestamp: this.stopTimestamp, - - type: this.getType(options.displayNSFW, options.accountId), - - video: this.getVideoElement(options.displayNSFW, options.accountId) - } - } - toActivityPubObject (this: MVideoPlaylistElementAP): PlaylistElementObject { const base: PlaylistElementObject = { id: this.url, type: 'PlaylistElement', - url: this.Video.url, + url: this.Video?.url || null, position: this.position }