diff --git a/server/controllers/api/accounts.ts b/server/controllers/api/accounts.ts index 9eb29d330..e807b4f44 100644 --- a/server/controllers/api/accounts.ts +++ b/server/controllers/api/accounts.ts @@ -176,12 +176,12 @@ async function listAccountVideos (req: express.Request, res: express.Response) { accountId: account.id, user: res.locals.oauth ? res.locals.oauth.token.User : undefined, countVideos - }, 'filter:api.videos.list.params') + }, 'filter:api.accounts.videos.list.params') const resultList = await Hooks.wrapPromiseFun( VideoModel.listForApi, apiOptions, - 'filter:api.videos.list.result' + 'filter:api.accounts.videos.list.result' ) return res.json(getFormattedObjects(resultList.data, resultList.total)) diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 5c96950c5..c48e00232 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts @@ -1,4 +1,5 @@ import * as express from 'express' +import { Hooks } from '@server/lib/plugins/hooks' import { getServerActor } from '@server/models/application/application' import { MChannelAccountDefault } from '@server/types/models' import { VideoChannelCreate, VideoChannelUpdate } from '../../../shared' @@ -266,7 +267,7 @@ async function listVideoChannelVideos (req: express.Request, res: express.Respon const followerActorId = isUserAbleToSearchRemoteURI(res) ? null : undefined const countVideos = getCountVideos(req) - const resultList = await VideoModel.listForApi({ + const apiOptions = await Hooks.wrapObject({ followerActorId, start: req.query.start, count: req.query.count, @@ -283,7 +284,13 @@ async function listVideoChannelVideos (req: express.Request, res: express.Respon videoChannelId: videoChannelInstance.id, user: res.locals.oauth ? res.locals.oauth.token.User : undefined, countVideos - }) + }, 'filter:api.video-channels.videos.list.params') + + const resultList = await Hooks.wrapPromiseFun( + VideoModel.listForApi, + apiOptions, + 'filter:api.video-channels.videos.list.result' + ) return res.json(getFormattedObjects(resultList.data, resultList.total)) } diff --git a/server/tests/fixtures/peertube-plugin-test/main.js b/server/tests/fixtures/peertube-plugin-test/main.js index 322c0610c..e5a9f8df5 100644 --- a/server/tests/fixtures/peertube-plugin-test/main.js +++ b/server/tests/fixtures/peertube-plugin-test/main.js @@ -39,6 +39,26 @@ async function register ({ registerHook, registerSetting, settingsManager, stora handler: obj => addToTotal(obj) }) + registerHook({ + target: 'filter:api.accounts.videos.list.params', + handler: obj => addToCount(obj) + }) + + registerHook({ + target: 'filter:api.accounts.videos.list.result', + handler: obj => addToTotal(obj, 2) + }) + + registerHook({ + target: 'filter:api.video-channels.videos.list.params', + handler: obj => addToCount(obj, 3) + }) + + registerHook({ + target: 'filter:api.video-channels.videos.list.result', + handler: obj => addToTotal(obj, 3) + }) + registerHook({ target: 'filter:api.video.get.result', handler: video => { @@ -167,14 +187,14 @@ module.exports = { // ############################################################################ -function addToCount (obj) { - return Object.assign({}, obj, { count: obj.count + 1 }) +function addToCount (obj, amount = 1) { + return Object.assign({}, obj, { count: obj.count + amount }) } -function addToTotal (result) { +function addToTotal (result, amount = 1) { return { data: result.data, - total: result.total + 1 + total: result.total + amount } } diff --git a/server/tests/plugins/filter-hooks.ts b/server/tests/plugins/filter-hooks.ts index 9939b8e6e..3a5c7aa62 100644 --- a/server/tests/plugins/filter-hooks.ts +++ b/server/tests/plugins/filter-hooks.ts @@ -8,9 +8,11 @@ import { addVideoCommentThread, createLive, doubleFollow, + getAccountVideos, getConfig, getPluginTestPath, getVideo, + getVideoChannelVideos, getVideoCommentThreads, getVideosList, getVideosListPagination, @@ -90,6 +92,34 @@ describe('Test plugin filter hooks', function () { expect(res.body.total).to.equal(11) }) + it('Should run filter:api.accounts.videos.list.params', async function () { + const res = await getAccountVideos(servers[0].url, servers[0].accessToken, 'root', 0, 2) + + // 1 plugin do +1 to the count parameter + expect(res.body.data).to.have.lengthOf(3) + }) + + it('Should run filter:api.accounts.videos.list.result', async function () { + const res = await getAccountVideos(servers[0].url, servers[0].accessToken, 'root', 0, 2) + + // Plugin do +2 to the total result + expect(res.body.total).to.equal(12) + }) + + it('Should run filter:api.video-channels.videos.list.params', async function () { + const res = await getVideoChannelVideos(servers[0].url, servers[0].accessToken, 'root_channel', 0, 2) + + // 1 plugin do +3 to the count parameter + expect(res.body.data).to.have.lengthOf(5) + }) + + it('Should run filter:api.video-channels.videos.list.result', async function () { + const res = await getAccountVideos(servers[0].url, servers[0].accessToken, 'root_channel', 0, 2) + + // Plugin do +3 to the total result + expect(res.body.total).to.equal(13) + }) + it('Should run filter:api.video.get.result', async function () { const res = await getVideo(servers[0].url, videoUUID) diff --git a/shared/models/plugins/server-hook.model.ts b/shared/models/plugins/server-hook.model.ts index 6609bc893..64d63f8f5 100644 --- a/shared/models/plugins/server-hook.model.ts +++ b/shared/models/plugins/server-hook.model.ts @@ -5,6 +5,15 @@ export const serverFilterHookObject = { // (used by the trending page, recently-added page, local page etc) 'filter:api.videos.list.params': true, 'filter:api.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, + + // Filter params/result used to list account videos for the REST API + 'filter:api.video-channels.videos.list.params': true, + 'filter:api.video-channels.videos.list.result': true, + // Filter the result of the get function // Used to get detailed video information (video watch page for example) 'filter:api.video.get.result': true,