X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-playlist-element.ts;h=e6906cb19202c6b70b59c8386a86ae8d8e39adc5;hb=16c016e8b1d5ca46343d3363f9a49e24c5d7c944;hp=ba92e129ac5b8c8efe88b33be5ac4a7749784f20;hpb=26d6bf6533023326fa017812cf31bbe20c752d36;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-playlist-element.ts b/server/models/video/video-playlist-element.ts index ba92e129a..e6906cb19 100644 --- a/server/models/video/video-playlist-element.ts +++ b/server/models/video/video-playlist-element.ts @@ -1,3 +1,4 @@ +import { AggregateOptions, Op, ScopeOptions, Sequelize, Transaction } from 'sequelize' import { AllowNull, BelongsTo, @@ -13,18 +14,8 @@ import { Table, UpdatedAt } from 'sequelize-typescript' -import { ForAPIOptions, ScopeNames as VideoScopeNames, VideoModel } from './video' -import { VideoPlaylistModel } from './video-playlist' -import { getSort, throwIfNotValid } from '../utils' -import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' -import { CONSTRAINTS_FIELDS } from '../../initializers/constants' -import { PlaylistElementObject } from '../../../shared/models/activitypub/objects/playlist-element-object' import validator from 'validator' -import { AggregateOptions, Op, ScopeOptions, Sequelize, Transaction } from 'sequelize' -import { VideoPlaylistElement, VideoPlaylistElementType } from '../../../shared/models/videos/playlist/video-playlist-element.model' -import { AccountModel } from '../account/account' -import { VideoPrivacy } from '../../../shared/models/videos' -import * as Bluebird from 'bluebird' +import { MUserAccountId } from '@server/types/models' import { MVideoPlaylistElement, MVideoPlaylistElementAP, @@ -32,7 +23,16 @@ import { MVideoPlaylistElementVideoUrlPlaylistPrivacy, MVideoPlaylistVideoThumbnail } from '@server/types/models/video/video-playlist-element' -import { MUserAccountId } from '@server/types/models' +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 { ForAPIOptions, ScopeNames as VideoScopeNames, VideoModel } from './video' +import { VideoPlaylistModel } from './video-playlist' +import { AttributesOnly } from '@shared/core-utils' @Table({ tableName: 'videoPlaylistElement', @@ -43,25 +43,21 @@ import { MUserAccountId } from '@server/types/models' { fields: [ 'videoId' ] }, - { - fields: [ 'videoPlaylistId', 'videoId' ], - unique: true - }, { fields: [ 'url' ], unique: true } ] }) -export class VideoPlaylistElementModel extends Model { +export class VideoPlaylistElementModel extends Model>> { @CreatedAt createdAt: Date @UpdatedAt updatedAt: Date - @AllowNull(false) - @Is('VideoPlaylistUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url')) + @AllowNull(true) + @Is('VideoPlaylistUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url', true)) @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS.URL.max)) url: string @@ -170,7 +166,7 @@ export class VideoPlaylistElementModel extends Model ]).then(([ total, data ]) => ({ total, data })) } - static loadByPlaylistAndVideo (videoPlaylistId: number, videoId: number): Bluebird { + static loadByPlaylistAndVideo (videoPlaylistId: number, videoId: number): Promise { const query = { where: { videoPlaylistId, @@ -181,16 +177,15 @@ export class VideoPlaylistElementModel extends Model return VideoPlaylistElementModel.findOne(query) } - static loadById (playlistElementId: number | string): Bluebird { + static loadById (playlistElementId: number | string): Promise { return VideoPlaylistElementModel.findByPk(playlistElementId) } - static loadByPlaylistAndVideoForAP ( + static loadByPlaylistAndElementIdForAP ( playlistId: number | string, - videoId: number | string - ): Bluebird { + playlistElementId: number + ): Promise { const playlistWhere = validator.isUUID('' + playlistId) ? { uuid: playlistId } : { id: playlistId } - const videoWhere = validator.isUUID('' + videoId) ? { uuid: videoId } : { id: videoId } const query = { include: [ @@ -201,10 +196,12 @@ export class VideoPlaylistElementModel extends Model }, { attributes: [ 'url' ], - model: VideoModel.unscoped(), - where: videoWhere + model: VideoModel.unscoped() } - ] + ], + where: { + id: playlistElementId + } } return VideoPlaylistElementModel.findOne(query) @@ -229,7 +226,7 @@ export class VideoPlaylistElementModel extends Model }) } - static loadFirstElementWithVideoThumbnail (videoPlaylistId: number): Bluebird { + static loadFirstElementWithVideoThumbnail (videoPlaylistId: number): Promise { const query = { order: getSort('position'), where: { @@ -278,7 +275,8 @@ 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(`${newPosition} + "position" - ${firstPosition}`) + return VideoPlaylistElementModel.update({ position: positionQuery as any }, query) } static increasePositionOf (