const videoPlaylistInstance = res.locals.videoPlaylist
const videoPlaylistFieldsSave = videoPlaylistInstance.toJSON()
const videoPlaylistInfoToUpdate = req.body as VideoPlaylistUpdate
+
const wasPrivatePlaylist = videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE
+ const wasNotPrivatePlaylist = videoPlaylistInstance.privacy !== VideoPlaylistPrivacy.PRIVATE
const thumbnailField = req.files['thumbnailfile']
const thumbnailModel = thumbnailField
if (videoPlaylistInfoToUpdate.privacy !== undefined) {
videoPlaylistInstance.privacy = parseInt(videoPlaylistInfoToUpdate.privacy.toString(), 10)
+
+ if (wasNotPrivatePlaylist === true && videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE) {
+ await sendDeleteVideoPlaylist(videoPlaylistInstance, t)
+ }
}
const playlistUpdated = await videoPlaylistInstance.save(sequelizeOptions)
import { VideoPlaylistType } from '../../../../shared/models/videos/playlist/video-playlist-type.model'
const videoPlaylistsAddValidator = getCommonPlaylistEditAttributes().concat([
+ body('displayName')
+ .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'),
+
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
logger.debug('Checking videoPlaylistsAddValidator parameters', { parameters: req.body })
param('playlistId')
.custom(isIdOrUUIDValid).withMessage('Should have a valid playlist id/uuid'),
+ body('displayName')
+ .optional()
+ .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'),
+
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
logger.debug('Checking videoPlaylistsUpdateValidator parameters', { parameters: req.body })
const body: VideoPlaylistUpdate = req.body
- if (videoPlaylist.privacy !== VideoPlaylistPrivacy.PRIVATE && body.privacy === VideoPlaylistPrivacy.PRIVATE) {
- cleanUpReqFiles(req)
- return res.status(400)
- .json({ error: 'Cannot set "private" a video playlist that was not private.' })
- }
-
const newPrivacy = body.privacy || videoPlaylist.privacy
if (newPrivacy === VideoPlaylistPrivacy.PUBLIC &&
(
+ CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS.IMAGE.EXTNAME.join(', ')
),
- body('displayName')
- .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'),
body('description')
.optional()
.customSanitizer(toValueOrNull)
const params = getBase({ displayName: undefined })
await createVideoPlaylist(params)
- await updateVideoPlaylist(getUpdate(params, playlistUUID))
})
it('Should fail with an incorrect display name', async function () {
))
})
- it('Should fail to update to private a public/unlisted playlist', async function () {
- const params = getBase({ privacy: VideoPlaylistPrivacy.PUBLIC }, { expectedStatus: 200 })
-
- const res = await createVideoPlaylist(params)
- const playlist = res.body.videoPlaylist
-
- const paramsUpdate = getBase({ privacy: VideoPlaylistPrivacy.PRIVATE }, { expectedStatus: 400 })
-
- await updateVideoPlaylist(getUpdate(paramsUpdate, playlist.id))
- })
-
it('Should fail to update the watch later playlist', async function () {
await updateVideoPlaylist(getUpdate(
getBase({}, { expectedStatus: 400 }),
}
})
+
+ it('Should be able to create a public playlist, and set it to private', async function () {
+ this.timeout(30000)
+
+ const res = await createVideoPlaylist({
+ url: servers[0].url,
+ token: servers[0].accessToken,
+ playlistAttrs: {
+ displayName: 'my super public playlist',
+ privacy: VideoPlaylistPrivacy.PUBLIC,
+ videoChannelId: servers[0].videoChannel.id
+ }
+ })
+ const videoPlaylistIds = res.body.videoPlaylist
+
+ await waitJobs(servers)
+
+ for (const server of servers) {
+ await getVideoPlaylist(server.url, videoPlaylistIds.uuid, 200)
+ }
+
+ const playlistAttrs = { privacy: VideoPlaylistPrivacy.PRIVATE }
+ await updateVideoPlaylist({ url: servers[0].url, token: servers[0].accessToken, playlistId: videoPlaylistIds.id, playlistAttrs })
+
+ await waitJobs(servers)
+
+ for (const server of [ servers[1], servers[2] ]) {
+ await getVideoPlaylist(server.url, videoPlaylistIds.uuid, 404)
+ }
+ await getVideoPlaylist(servers[0].url, videoPlaylistIds.uuid, 401)
+
+ await getVideoPlaylistWithToken(servers[0].url, servers[0].accessToken, videoPlaylistIds.uuid, 200)
+ })
+
it('Should delete the playlist on server 1 and delete on server 2 and 3', async function () {
this.timeout(30000)
import { VideoPlaylistPrivacy } from './video-playlist-privacy.model'
export interface VideoPlaylistUpdate {
- displayName: string
- privacy: VideoPlaylistPrivacy
+ displayName?: string
+ privacy?: VideoPlaylistPrivacy
description?: string
videoChannelId?: number