},
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 }))
}
}
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
}
}
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 })
+ })
+ }
+ }
+}
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(
}
)
- 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 () {
/* 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
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 ])
})