diff options
author | Chocobozzz <me@florianbigard.com> | 2019-06-06 17:29:15 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-06-06 17:29:15 +0200 |
commit | 1b319b7aa6d2f4252615b370aaca6a800be1b1f4 (patch) | |
tree | 1d7eed8c392423aa578c609fe269832c5ac99b17 | |
parent | 46a6db245f50249246325090eeaffd165453a396 (diff) | |
download | PeerTube-1b319b7aa6d2f4252615b370aaca6a800be1b1f4.tar.gz PeerTube-1b319b7aa6d2f4252615b370aaca6a800be1b1f4.tar.zst PeerTube-1b319b7aa6d2f4252615b370aaca6a800be1b1f4.zip |
Add ability to unpublish video/playlist
-rw-r--r-- | server/controllers/api/video-playlist.ts | 6 | ||||
-rw-r--r-- | server/middlewares/validators/videos/video-playlists.ts | 15 | ||||
-rw-r--r-- | server/tests/api/check-params/video-playlists.ts | 12 | ||||
-rw-r--r-- | server/tests/api/videos/video-playlists.ts | 34 | ||||
-rw-r--r-- | shared/models/videos/playlist/video-playlist-update.model.ts | 4 |
5 files changed, 49 insertions, 22 deletions
diff --git a/server/controllers/api/video-playlist.ts b/server/controllers/api/video-playlist.ts index a17136401..62490e63b 100644 --- a/server/controllers/api/video-playlist.ts +++ b/server/controllers/api/video-playlist.ts | |||
@@ -203,7 +203,9 @@ async function updateVideoPlaylist (req: express.Request, res: express.Response) | |||
203 | const videoPlaylistInstance = res.locals.videoPlaylist | 203 | const videoPlaylistInstance = res.locals.videoPlaylist |
204 | const videoPlaylistFieldsSave = videoPlaylistInstance.toJSON() | 204 | const videoPlaylistFieldsSave = videoPlaylistInstance.toJSON() |
205 | const videoPlaylistInfoToUpdate = req.body as VideoPlaylistUpdate | 205 | const videoPlaylistInfoToUpdate = req.body as VideoPlaylistUpdate |
206 | |||
206 | const wasPrivatePlaylist = videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE | 207 | const wasPrivatePlaylist = videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE |
208 | const wasNotPrivatePlaylist = videoPlaylistInstance.privacy !== VideoPlaylistPrivacy.PRIVATE | ||
207 | 209 | ||
208 | const thumbnailField = req.files['thumbnailfile'] | 210 | const thumbnailField = req.files['thumbnailfile'] |
209 | const thumbnailModel = thumbnailField | 211 | const thumbnailModel = thumbnailField |
@@ -232,6 +234,10 @@ async function updateVideoPlaylist (req: express.Request, res: express.Response) | |||
232 | 234 | ||
233 | if (videoPlaylistInfoToUpdate.privacy !== undefined) { | 235 | if (videoPlaylistInfoToUpdate.privacy !== undefined) { |
234 | videoPlaylistInstance.privacy = parseInt(videoPlaylistInfoToUpdate.privacy.toString(), 10) | 236 | videoPlaylistInstance.privacy = parseInt(videoPlaylistInfoToUpdate.privacy.toString(), 10) |
237 | |||
238 | if (wasNotPrivatePlaylist === true && videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE) { | ||
239 | await sendDeleteVideoPlaylist(videoPlaylistInstance, t) | ||
240 | } | ||
235 | } | 241 | } |
236 | 242 | ||
237 | const playlistUpdated = await videoPlaylistInstance.save(sequelizeOptions) | 243 | const playlistUpdated = await videoPlaylistInstance.save(sequelizeOptions) |
diff --git a/server/middlewares/validators/videos/video-playlists.ts b/server/middlewares/validators/videos/video-playlists.ts index f68eeeeb3..9c88dd291 100644 --- a/server/middlewares/validators/videos/video-playlists.ts +++ b/server/middlewares/validators/videos/video-playlists.ts | |||
@@ -24,6 +24,9 @@ import { VideoPlaylistPrivacy } from '../../../../shared/models/videos/playlist/ | |||
24 | import { VideoPlaylistType } from '../../../../shared/models/videos/playlist/video-playlist-type.model' | 24 | import { VideoPlaylistType } from '../../../../shared/models/videos/playlist/video-playlist-type.model' |
25 | 25 | ||
26 | const videoPlaylistsAddValidator = getCommonPlaylistEditAttributes().concat([ | 26 | const videoPlaylistsAddValidator = getCommonPlaylistEditAttributes().concat([ |
27 | body('displayName') | ||
28 | .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'), | ||
29 | |||
27 | async (req: express.Request, res: express.Response, next: express.NextFunction) => { | 30 | async (req: express.Request, res: express.Response, next: express.NextFunction) => { |
28 | logger.debug('Checking videoPlaylistsAddValidator parameters', { parameters: req.body }) | 31 | logger.debug('Checking videoPlaylistsAddValidator parameters', { parameters: req.body }) |
29 | 32 | ||
@@ -46,6 +49,10 @@ const videoPlaylistsUpdateValidator = getCommonPlaylistEditAttributes().concat([ | |||
46 | param('playlistId') | 49 | param('playlistId') |
47 | .custom(isIdOrUUIDValid).withMessage('Should have a valid playlist id/uuid'), | 50 | .custom(isIdOrUUIDValid).withMessage('Should have a valid playlist id/uuid'), |
48 | 51 | ||
52 | body('displayName') | ||
53 | .optional() | ||
54 | .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'), | ||
55 | |||
49 | async (req: express.Request, res: express.Response, next: express.NextFunction) => { | 56 | async (req: express.Request, res: express.Response, next: express.NextFunction) => { |
50 | logger.debug('Checking videoPlaylistsUpdateValidator parameters', { parameters: req.body }) | 57 | logger.debug('Checking videoPlaylistsUpdateValidator parameters', { parameters: req.body }) |
51 | 58 | ||
@@ -61,12 +68,6 @@ const videoPlaylistsUpdateValidator = getCommonPlaylistEditAttributes().concat([ | |||
61 | 68 | ||
62 | const body: VideoPlaylistUpdate = req.body | 69 | const body: VideoPlaylistUpdate = req.body |
63 | 70 | ||
64 | if (videoPlaylist.privacy !== VideoPlaylistPrivacy.PRIVATE && body.privacy === VideoPlaylistPrivacy.PRIVATE) { | ||
65 | cleanUpReqFiles(req) | ||
66 | return res.status(400) | ||
67 | .json({ error: 'Cannot set "private" a video playlist that was not private.' }) | ||
68 | } | ||
69 | |||
70 | const newPrivacy = body.privacy || videoPlaylist.privacy | 71 | const newPrivacy = body.privacy || videoPlaylist.privacy |
71 | if (newPrivacy === VideoPlaylistPrivacy.PUBLIC && | 72 | if (newPrivacy === VideoPlaylistPrivacy.PUBLIC && |
72 | ( | 73 | ( |
@@ -368,8 +369,6 @@ function getCommonPlaylistEditAttributes () { | |||
368 | + CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS.IMAGE.EXTNAME.join(', ') | 369 | + CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS.IMAGE.EXTNAME.join(', ') |
369 | ), | 370 | ), |
370 | 371 | ||
371 | body('displayName') | ||
372 | .custom(isVideoPlaylistNameValid).withMessage('Should have a valid display name'), | ||
373 | body('description') | 372 | body('description') |
374 | .optional() | 373 | .optional() |
375 | .customSanitizer(toValueOrNull) | 374 | .customSanitizer(toValueOrNull) |
diff --git a/server/tests/api/check-params/video-playlists.ts b/server/tests/api/check-params/video-playlists.ts index b7b94c035..8c5e44bdd 100644 --- a/server/tests/api/check-params/video-playlists.ts +++ b/server/tests/api/check-params/video-playlists.ts | |||
@@ -205,7 +205,6 @@ describe('Test video playlists API validator', function () { | |||
205 | const params = getBase({ displayName: undefined }) | 205 | const params = getBase({ displayName: undefined }) |
206 | 206 | ||
207 | await createVideoPlaylist(params) | 207 | await createVideoPlaylist(params) |
208 | await updateVideoPlaylist(getUpdate(params, playlistUUID)) | ||
209 | }) | 208 | }) |
210 | 209 | ||
211 | it('Should fail with an incorrect display name', async function () { | 210 | it('Should fail with an incorrect display name', async function () { |
@@ -269,17 +268,6 @@ describe('Test video playlists API validator', function () { | |||
269 | )) | 268 | )) |
270 | }) | 269 | }) |
271 | 270 | ||
272 | it('Should fail to update to private a public/unlisted playlist', async function () { | ||
273 | const params = getBase({ privacy: VideoPlaylistPrivacy.PUBLIC }, { expectedStatus: 200 }) | ||
274 | |||
275 | const res = await createVideoPlaylist(params) | ||
276 | const playlist = res.body.videoPlaylist | ||
277 | |||
278 | const paramsUpdate = getBase({ privacy: VideoPlaylistPrivacy.PRIVATE }, { expectedStatus: 400 }) | ||
279 | |||
280 | await updateVideoPlaylist(getUpdate(paramsUpdate, playlist.id)) | ||
281 | }) | ||
282 | |||
283 | it('Should fail to update the watch later playlist', async function () { | 271 | it('Should fail to update the watch later playlist', async function () { |
284 | await updateVideoPlaylist(getUpdate( | 272 | await updateVideoPlaylist(getUpdate( |
285 | getBase({}, { expectedStatus: 400 }), | 273 | getBase({}, { expectedStatus: 400 }), |
diff --git a/server/tests/api/videos/video-playlists.ts b/server/tests/api/videos/video-playlists.ts index 3ebb1df0b..8690327c4 100644 --- a/server/tests/api/videos/video-playlists.ts +++ b/server/tests/api/videos/video-playlists.ts | |||
@@ -754,6 +754,40 @@ describe('Test video playlists', function () { | |||
754 | } | 754 | } |
755 | }) | 755 | }) |
756 | 756 | ||
757 | |||
758 | it('Should be able to create a public playlist, and set it to private', async function () { | ||
759 | this.timeout(30000) | ||
760 | |||
761 | const res = await createVideoPlaylist({ | ||
762 | url: servers[0].url, | ||
763 | token: servers[0].accessToken, | ||
764 | playlistAttrs: { | ||
765 | displayName: 'my super public playlist', | ||
766 | privacy: VideoPlaylistPrivacy.PUBLIC, | ||
767 | videoChannelId: servers[0].videoChannel.id | ||
768 | } | ||
769 | }) | ||
770 | const videoPlaylistIds = res.body.videoPlaylist | ||
771 | |||
772 | await waitJobs(servers) | ||
773 | |||
774 | for (const server of servers) { | ||
775 | await getVideoPlaylist(server.url, videoPlaylistIds.uuid, 200) | ||
776 | } | ||
777 | |||
778 | const playlistAttrs = { privacy: VideoPlaylistPrivacy.PRIVATE } | ||
779 | await updateVideoPlaylist({ url: servers[0].url, token: servers[0].accessToken, playlistId: videoPlaylistIds.id, playlistAttrs }) | ||
780 | |||
781 | await waitJobs(servers) | ||
782 | |||
783 | for (const server of [ servers[1], servers[2] ]) { | ||
784 | await getVideoPlaylist(server.url, videoPlaylistIds.uuid, 404) | ||
785 | } | ||
786 | await getVideoPlaylist(servers[0].url, videoPlaylistIds.uuid, 401) | ||
787 | |||
788 | await getVideoPlaylistWithToken(servers[0].url, servers[0].accessToken, videoPlaylistIds.uuid, 200) | ||
789 | }) | ||
790 | |||
757 | it('Should delete the playlist on server 1 and delete on server 2 and 3', async function () { | 791 | it('Should delete the playlist on server 1 and delete on server 2 and 3', async function () { |
758 | this.timeout(30000) | 792 | this.timeout(30000) |
759 | 793 | ||
diff --git a/shared/models/videos/playlist/video-playlist-update.model.ts b/shared/models/videos/playlist/video-playlist-update.model.ts index 0ff5bcb0f..a6a3f74d9 100644 --- a/shared/models/videos/playlist/video-playlist-update.model.ts +++ b/shared/models/videos/playlist/video-playlist-update.model.ts | |||
@@ -1,8 +1,8 @@ | |||
1 | import { VideoPlaylistPrivacy } from './video-playlist-privacy.model' | 1 | import { VideoPlaylistPrivacy } from './video-playlist-privacy.model' |
2 | 2 | ||
3 | export interface VideoPlaylistUpdate { | 3 | export interface VideoPlaylistUpdate { |
4 | displayName: string | 4 | displayName?: string |
5 | privacy: VideoPlaylistPrivacy | 5 | privacy?: VideoPlaylistPrivacy |
6 | 6 | ||
7 | description?: string | 7 | description?: string |
8 | videoChannelId?: number | 8 | videoChannelId?: number |