From c5ca7e1e0c735d1e658f9ef524a61d19f6a50fea Mon Sep 17 00:00:00 2001 From: kontrollanten <6680299+kontrollanten@users.noreply.github.com> Date: Tue, 15 Feb 2022 08:24:22 +0100 Subject: [PATCH] add filter:api.video-playlist.videos.list.* hooks closes #4775 --- server/controllers/api/video-playlist.ts | 10 ++++-- .../fixtures/peertube-plugin-test/main.js | 10 ++++++ server/tests/plugins/filter-hooks.ts | 34 ++++++++++++++++++- .../plugins/server/server-hook.model.ts | 5 +++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/server/controllers/api/video-playlist.ts b/server/controllers/api/video-playlist.ts index 795e14e73..ee6c73855 100644 --- a/server/controllers/api/video-playlist.ts +++ b/server/controllers/api/video-playlist.ts @@ -453,13 +453,19 @@ async function getVideoPlaylistVideos (req: express.Request, res: express.Respon const user = res.locals.oauth ? res.locals.oauth.token.User : undefined const server = await getServerActor() - const resultList = await VideoPlaylistElementModel.listForApi({ + const apiOptions = await Hooks.wrapObject({ start: req.query.start, count: req.query.count, videoPlaylistId: videoPlaylistInstance.id, serverAccount: server.Account, user - }) + }, 'filter:api.video-playlist.videos.list.params') + + const resultList = await Hooks.wrapPromiseFun( + VideoPlaylistElementModel.listForApi, + apiOptions, + 'filter:api.video-playlist.videos.list.result' + ) const options = { displayNSFW: buildNSFWFilter(res, req.query.nsfw), diff --git a/server/tests/fixtures/peertube-plugin-test/main.js b/server/tests/fixtures/peertube-plugin-test/main.js index 90951d611..7715ab6e8 100644 --- a/server/tests/fixtures/peertube-plugin-test/main.js +++ b/server/tests/fixtures/peertube-plugin-test/main.js @@ -44,6 +44,16 @@ async function register ({ registerHook, registerSetting, settingsManager, stora handler: obj => addToTotal(obj) }) + registerHook({ + target: 'filter:api.video-playlist.videos.list.params', + handler: obj => addToCount(obj) + }) + + registerHook({ + target: 'filter:api.video-playlist.videos.list.result', + handler: obj => addToTotal(obj) + }) + registerHook({ target: 'filter:api.accounts.videos.list.params', handler: obj => addToCount(obj) diff --git a/server/tests/plugins/filter-hooks.ts b/server/tests/plugins/filter-hooks.ts index 7adfc1277..e0f25ca26 100644 --- a/server/tests/plugins/filter-hooks.ts +++ b/server/tests/plugins/filter-hooks.ts @@ -22,6 +22,7 @@ describe('Test plugin filter hooks', function () { let servers: PeerTubeServer[] let videoUUID: string let threadId: number + let videoPlaylistUUID: string before(async function () { this.timeout(60000) @@ -33,9 +34,20 @@ describe('Test plugin filter hooks', function () { await servers[0].plugins.install({ path: PluginsCommand.getPluginTestPath() }) await servers[0].plugins.install({ path: PluginsCommand.getPluginTestPath('-filter-translations') }) + { + ({ uuid: videoPlaylistUUID } = await servers[0].playlists.create({ + attributes: { + displayName: 'my super playlist', + privacy: VideoPlaylistPrivacy.PUBLIC, + description: 'my super description', + videoChannelId: servers[0].store.channel.id + } + })) + } for (let i = 0; i < 10; i++) { - await servers[0].videos.upload({ attributes: { name: 'default video ' + i } }) + const video = await servers[0].videos.upload({ attributes: { name: 'default video ' + i } }) + await servers[0].playlists.addElement({ playlistId: videoPlaylistUUID, attributes: { videoId: video.id } }) } const { data } = await servers[0].videos.list() @@ -69,6 +81,26 @@ describe('Test plugin filter hooks', function () { expect(total).to.equal(11) }) + it('Should run filter:api.video-playlist.videos.list.params', async function () { + const { data } = await servers[0].playlists.listVideos({ + count: 2, + playlistId: videoPlaylistUUID + }) + + // 1 plugin do +1 to the count parameter + expect(data).to.have.lengthOf(3) + }) + + it('Should run filter:api.video-playlist.videos.list.result', async function () { + const { total } = await servers[0].playlists.listVideos({ + count: 0, + playlistId: videoPlaylistUUID + }) + + // Plugin do +1 to the total result + expect(total).to.equal(11) + }) + it('Should run filter:api.accounts.videos.list.params', async function () { const { data } = await servers[0].videos.listByAccount({ handle: 'root', start: 0, count: 2 }) diff --git a/shared/models/plugins/server/server-hook.model.ts b/shared/models/plugins/server/server-hook.model.ts index bd2b27da5..e64c3bbbc 100644 --- a/shared/models/plugins/server/server-hook.model.ts +++ b/shared/models/plugins/server/server-hook.model.ts @@ -6,6 +6,11 @@ export const serverFilterHookObject = { 'filter:api.videos.list.params': true, 'filter:api.videos.list.result': true, + // Filter params/result used to list a video playlists videos + // for the REST API + 'filter:api.video-playlist.videos.list.params': true, + 'filter:api.video-playlist.videos.list.result': true, + // Filter params/result used to list account videos for the REST API 'filter:api.accounts.videos.list.params': true, 'filter:api.accounts.videos.list.result': true,