Verified Commit ab3ead3a authored by Chocobozzz's avatar Chocobozzz
Browse files

Add ability to remove a video from a plugin

parent 1b05d82d
Pipeline #259323 passed with stages
in 73 minutes and 13 seconds
......@@ -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 }))
}
}
......
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 })
})
}
}
}
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 () {
......
/* 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 ])
})
......
......@@ -13,6 +13,10 @@ export type PeerTubeHelpers = {
database: {
query: Function
}
videos: {
removeVideo: (videoId: number) => Promise<void>
}
}
export type RegisterServerOptions = {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment