From e2e0b645cdac3c705b1988fbb0eff723ad5e885d Mon Sep 17 00:00:00 2001 From: kontrollanten <6680299+kontrollanten@users.noreply.github.com> Date: Mon, 28 Jun 2021 09:22:15 +0200 Subject: [PATCH] Add video-playlist-element.created hook (#4196) * add playlists.videos.list.params/results hooks closes #4192 * Revert "add playlists.videos.list.params/results hooks" This reverts commit ebd822ca0b769d88dbc5ae0062b286238cbced92. * add video-playlist-element.created hook closes #4192 * test: add playlist-element.created * Fix tests Co-authored-by: Chocobozzz --- server/controllers/api/video-playlist.ts | 3 ++ .../fixtures/peertube-plugin-test/main.js | 4 +- server/tests/plugins/action-hooks.ts | 40 ++++++++++++++++++- .../plugins/server/server-hook.model.ts | 5 ++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/server/controllers/api/video-playlist.ts b/server/controllers/api/video-playlist.ts index c25aed20b..5c4aa50ac 100644 --- a/server/controllers/api/video-playlist.ts +++ b/server/controllers/api/video-playlist.ts @@ -43,6 +43,7 @@ import { import { AccountModel } from '../../models/account/account' import { VideoPlaylistModel } from '../../models/video/video-playlist' import { VideoPlaylistElementModel } from '../../models/video/video-playlist-element' +import { Hooks } from '@server/lib/plugins/hooks' const reqThumbnailFile = createReqFiles([ 'thumbnailfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { thumbnailfile: CONFIG.STORAGE.TMP_DIR }) @@ -330,6 +331,8 @@ async function addVideoInPlaylist (req: express.Request, res: express.Response) logger.info('Video added in playlist %s at position %d.', videoPlaylist.uuid, playlistElement.position) + Hooks.runAction('action:api.video-playlist-element.created', { playlistElement }) + return res.json({ videoPlaylistElement: { id: playlistElement.id diff --git a/server/tests/fixtures/peertube-plugin-test/main.js b/server/tests/fixtures/peertube-plugin-test/main.js index 5e922ad1f..f8e6f0b98 100644 --- a/server/tests/fixtures/peertube-plugin-test/main.js +++ b/server/tests/fixtures/peertube-plugin-test/main.js @@ -19,7 +19,9 @@ async function register ({ registerHook, registerSetting, settingsManager, stora 'action:api.user.created', 'action:api.user.deleted', 'action:api.user.updated', - 'action:api.user.oauth2-got-token' + 'action:api.user.oauth2-got-token', + + 'action:api.video-playlist-element.created' ] for (const h of actionHooks) { diff --git a/server/tests/plugins/action-hooks.ts b/server/tests/plugins/action-hooks.ts index ac9f2cea5..0f57ef7fe 100644 --- a/server/tests/plugins/action-hooks.ts +++ b/server/tests/plugins/action-hooks.ts @@ -1,13 +1,15 @@ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ import 'mocha' -import { ServerHookName, VideoPrivacy } from '@shared/models' +import { ServerHookName, VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models' import { addVideoCommentReply, addVideoCommentThread, + addVideoInPlaylist, blockUser, createLive, createUser, + createVideoPlaylist, deleteVideoComment, getPluginTestPath, installPlugin, @@ -69,6 +71,7 @@ describe('Test plugin action hooks', function () { }) describe('Videos hooks', function () { + it('Should run action:api.video.uploaded', async function () { const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' }) videoUUID = res.body.video.uuid @@ -177,6 +180,41 @@ describe('Test plugin action hooks', function () { }) }) + describe('Playlist hooks', function () { + let playlistId: number + let videoId: number + + before(async function () { + { + const res = await createVideoPlaylist({ + url: servers[0].url, + token: servers[0].accessToken, + playlistAttrs: { + displayName: 'My playlist', + privacy: VideoPlaylistPrivacy.PRIVATE + } + }) + playlistId = res.body.videoPlaylist.id + } + + { + const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'my super name' }) + videoId = res.body.video.id + } + }) + + it('Should run action:api.video-playlist-element.created', async function () { + await addVideoInPlaylist({ + url: servers[0].url, + token: servers[0].accessToken, + playlistId, + elementAttrs: { videoId } + }) + + await checkHook('action:api.video-playlist-element.created') + }) + }) + after(async function () { await cleanupTests(servers) }) diff --git a/shared/models/plugins/server/server-hook.model.ts b/shared/models/plugins/server/server-hook.model.ts index dae243dbf..5f29534b5 100644 --- a/shared/models/plugins/server/server-hook.model.ts +++ b/shared/models/plugins/server/server-hook.model.ts @@ -114,7 +114,10 @@ export const serverActionHookObject = { 'action:api.user.updated': true, // Fired when a user got a new oauth2 token - 'action:api.user.oauth2-got-token': true + 'action:api.user.oauth2-got-token': true, + + // Fired when a video is added to a playlist + 'action:api.video-playlist-element.created': true } export type ServerActionHookName = keyof typeof serverActionHookObject -- 2.41.0