Add ability to remove a video from a plugin
authorChocobozzz <me@florianbigard.com>
Thu, 9 Apr 2020 09:35:29 +0000 (11:35 +0200)
committerChocobozzz <me@florianbigard.com>
Thu, 9 Apr 2020 09:37:44 +0000 (11:37 +0200)
server/lib/plugins/hooks.ts
server/lib/plugins/plugin-helpers.ts
server/tests/fixtures/peertube-plugin-test-four/main.js
server/tests/plugins/plugin-helpers.ts
server/typings/plugins/register-server-option.model.ts

index bcc8c674ec443b844894dcdcb47da1fa25c22909..aa92f03cc09ff0aa6fd23a85b8e7ccc3407d1064 100644 (file)
@@ -25,7 +25,7 @@ const Hooks = {
   },
 
   runAction: <T, U extends ServerActionHookName>(hookName: U, params?: T) => {
-    PluginManager.Instance.runHook(hookName, params)
+    PluginManager.Instance.runHook(hookName, undefined, params)
       .catch(err => logger.error('Fatal hook error.', { err }))
   }
 }
index a1493c7df7d2e4ff44a5671dd868effb5457a19e..e91beffbad0e6504d6b2928521a7720d576bc550 100644 (file)
@@ -1,15 +1,18 @@
 import { PeerTubeHelpers } from '@server/typings/plugins'
 import { sequelizeTypescript } from '@server/initializers/database'
 import { buildLogger } from '@server/helpers/logger'
+import { VideoModel } from '@server/models/video/video'
 
 function buildPluginHelpers (npmName: string): PeerTubeHelpers {
   const logger = buildPluginLogger(npmName)
 
   const database = buildDatabaseHelpers()
+  const videos = buildVideosHelpers()
 
   return {
     logger,
-    database
+    database,
+    videos
   }
 }
 
@@ -28,3 +31,15 @@ function buildDatabaseHelpers () {
     query: sequelizeTypescript.query.bind(sequelizeTypescript)
   }
 }
+
+function buildVideosHelpers () {
+  return {
+    removeVideo: (id: number) => {
+      return sequelizeTypescript.transaction(async t => {
+        const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(id, t)
+
+        await video.destroy({ transaction: t })
+      })
+    }
+  }
+}
index 9abb73646b048ac158884f22d37c2e3b9065336c..2e81550c1575e9633b7c7f1d11d2df345b94832e 100644 (file)
@@ -1,7 +1,10 @@
 async function register ({
-  peertubeHelpers
+  peertubeHelpers,
+  registerHook
 }) {
-  peertubeHelpers.logger.info('Hello world from plugin four')
+  const logger = peertubeHelpers.logger
+
+  logger.info('Hello world from plugin four')
 
   const username = 'root'
   const results = await peertubeHelpers.database.query(
@@ -12,7 +15,16 @@ async function register ({
     }
   )
 
-  peertubeHelpers.logger.info('root email is ' + results[0]['email'])
+  logger.info('root email is ' + results[0]['email'])
+
+  registerHook({
+    target: 'action:api.video.viewed',
+    handler: async ({ video }) => {
+      await peertubeHelpers.videos.removeVideo(video.id)
+
+      logger.info('Video deleted by plugin four.')
+    }
+  })
 }
 
 async function unregister () {
index 05928273f2b94722f08d5fdf5edbb7e82798cf6e..dfe8ebe555d11c6addf2e2b10ebb3db915c1206c 100644 (file)
@@ -1,11 +1,16 @@
 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 
-import * as chai from 'chai'
 import 'mocha'
 import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers'
-import { getPluginTestPath, installPlugin, setAccessTokensToServers } from '../../../shared/extra-utils'
-
-const expect = chai.expect
+import {
+  checkVideoFilesWereRemoved,
+  getPluginTestPath,
+  getVideo,
+  installPlugin,
+  setAccessTokensToServers,
+  uploadVideoAndGetId,
+  viewVideo
+} from '../../../shared/extra-utils'
 
 describe('Test plugin helpers', function () {
   let server: ServerInfo
@@ -32,6 +37,29 @@ describe('Test plugin helpers', function () {
     await waitUntilLog(server, `root email is admin${server.internalServerNumber}@example.com`, 1)
   })
 
+  it('Should remove a video after a view', async function () {
+    this.timeout(20000)
+
+    const videoUUID = (await uploadVideoAndGetId({ server: server, videoName: 'video1' })).uuid
+
+    // Should not throw -> video exists
+    await getVideo(server.url, videoUUID)
+    // Should delete the video
+    await viewVideo(server.url, videoUUID)
+
+    await waitUntilLog(server, 'Video deleted by plugin four.', 1)
+
+    try {
+      // Should throw because the video should have been deleted
+      await getVideo(server.url, videoUUID)
+      throw new Error('Video exists')
+    } catch (err) {
+      if (err.message.includes('exists')) throw err
+    }
+
+    await checkVideoFilesWereRemoved(videoUUID, server.internalServerNumber)
+  })
+
   after(async function () {
     await cleanupTests([ server ])
   })
index 6f2ba7cd699b241822b6b0771012df4a148ce65f..fda9afb11add0e50bbb0eb77db34c87a0c994ddb 100644 (file)
@@ -13,6 +13,10 @@ export type PeerTubeHelpers = {
   database: {
     query: Function
   }
+
+  videos: {
+    removeVideo: (videoId: number) => Promise<void>
+  }
 }
 
 export type RegisterServerOptions = {