]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Add user video list hooks
authorChocobozzz <me@florianbigard.com>
Wed, 20 Jan 2021 14:28:34 +0000 (15:28 +0100)
committerChocobozzz <me@florianbigard.com>
Wed, 20 Jan 2021 14:28:34 +0000 (15:28 +0100)
server/controllers/api/users/me.ts
server/models/video/video.ts
server/tests/fixtures/peertube-plugin-test/main.js
server/tests/plugins/filter-hooks.ts
shared/models/plugins/server-hook.model.ts

index 009cf42b7ca11a88c64cbdd72394e20975c1f2ce..c4e8d8130456b81c2d9e51bd52488cedff210c1d 100644 (file)
@@ -1,7 +1,8 @@
 import 'multer'
 import * as express from 'express'
 import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '@server/helpers/audit-logger'
-import { UserUpdateMe, UserVideoRate as FormattedUserVideoRate, VideoSortField } from '../../../../shared'
+import { Hooks } from '@server/lib/plugins/hooks'
+import { UserUpdateMe, UserVideoRate as FormattedUserVideoRate } from '../../../../shared'
 import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
 import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model'
 import { createReqFiles } from '../../../helpers/express-utils'
@@ -104,12 +105,19 @@ export {
 
 async function getUserVideos (req: express.Request, res: express.Response) {
   const user = res.locals.oauth.token.User
-  const resultList = await VideoModel.listUserVideosForApi(
-    user.Account.id,
-    req.query.start as number,
-    req.query.count as number,
-    req.query.sort as VideoSortField,
-    req.query.search as string
+
+  const apiOptions = await Hooks.wrapObject({
+    accountId: user.Account.id,
+    start: req.query.start,
+    count: req.query.count,
+    sort: req.query.sort,
+    search: req.query.search
+  }, 'filter:api.user.me.videos.list.params')
+
+  const resultList = await Hooks.wrapPromiseFun(
+    VideoModel.listUserVideosForApi,
+    apiOptions,
+    'filter:api.user.me.videos.list.result'
   )
 
   const additionalAttributes = {
index 5027e980d94fde0fcd2d823b0712d349e7fb56f0..3db6549ae58c857eeb496525502547010c4f461f 100644 (file)
@@ -1004,13 +1004,15 @@ export class VideoModel extends Model {
     return result.map(v => v.id)
   }
 
-  static listUserVideosForApi (
-    accountId: number,
-    start: number,
-    count: number,
-    sort: string,
+  static listUserVideosForApi (options: {
+    accountId: number
+    start: number
+    count: number
+    sort: string
     search?: string
-  ) {
+  }) {
+    const { accountId, start, count, sort, search } = options
+
     function buildBaseQuery (): FindOptions {
       let baseQuery = {
         offset: start,
index e5a9f8df5eb021e5c9949e5127627a22014b8b52..305d9200218686ef2e3f652d613f23e67cfdfa95 100644 (file)
@@ -59,6 +59,16 @@ async function register ({ registerHook, registerSetting, settingsManager, stora
     handler: obj => addToTotal(obj, 3)
   })
 
+  registerHook({
+    target: 'filter:api.user.me.videos.list.params',
+    handler: obj => addToCount(obj, 4)
+  })
+
+  registerHook({
+    target: 'filter:api.user.me.videos.list.result',
+    handler: obj => addToTotal(obj, 4)
+  })
+
   registerHook({
     target: 'filter:api.video.get.result',
     handler: video => {
index cdde6cd30aeda589eeec4c00c4a11925311750c7..d88170201d7df69f55fb4c86b0f239f02ecbe052 100644 (file)
@@ -10,6 +10,7 @@ import {
   doubleFollow,
   getAccountVideos,
   getConfig,
+  getMyVideos,
   getPluginTestPath,
   getVideo,
   getVideoChannelVideos,
@@ -121,6 +122,20 @@ describe('Test plugin filter hooks', function () {
     expect(res.body.total).to.equal(13)
   })
 
+  it('Should run filter:api.user.me.videos.list.params', async function () {
+    const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 2)
+
+    // 1 plugin do +4 to the count parameter
+    expect(res.body.data).to.have.lengthOf(6)
+  })
+
+  it('Should run filter:api.user.me.videos.list.result', async function () {
+    const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 2)
+
+    // Plugin do +4 to the total result
+    expect(res.body.total).to.equal(14)
+  })
+
   it('Should run filter:api.video.get.result', async function () {
     const res = await getVideo(servers[0].url, videoUUID)
 
index c82abadd708e6d562f0c025a5035466257cc7c7c..082b4b59184fa620c3a6a6edbe3bb8c992bcc8a7 100644 (file)
@@ -14,6 +14,10 @@ export const serverFilterHookObject = {
   'filter:api.video-channels.videos.list.params': true,
   'filter:api.video-channels.videos.list.result': true,
 
+  // Filter params/result used to list my user videos for the REST API
+  'filter:api.user.me.videos.list.params': true,
+  'filter:api.user.me.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,