Add ability to remove a video from a plugin

pull/2615/head
Chocobozzz 2020-04-09 11:35:29 +02:00
parent 1b05d82d86
commit ab3ead3a6f
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
5 changed files with 68 additions and 9 deletions

View File

@ -25,7 +25,7 @@ const Hooks = {
}, },
runAction: <T, U extends ServerActionHookName>(hookName: U, params?: T) => { 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 })) .catch(err => logger.error('Fatal hook error.', { err }))
} }
} }

View File

@ -1,15 +1,18 @@
import { PeerTubeHelpers } from '@server/typings/plugins' import { PeerTubeHelpers } from '@server/typings/plugins'
import { sequelizeTypescript } from '@server/initializers/database' import { sequelizeTypescript } from '@server/initializers/database'
import { buildLogger } from '@server/helpers/logger' import { buildLogger } from '@server/helpers/logger'
import { VideoModel } from '@server/models/video/video'
function buildPluginHelpers (npmName: string): PeerTubeHelpers { function buildPluginHelpers (npmName: string): PeerTubeHelpers {
const logger = buildPluginLogger(npmName) const logger = buildPluginLogger(npmName)
const database = buildDatabaseHelpers() const database = buildDatabaseHelpers()
const videos = buildVideosHelpers()
return { return {
logger, logger,
database database,
videos
} }
} }
@ -28,3 +31,15 @@ function buildDatabaseHelpers () {
query: sequelizeTypescript.query.bind(sequelizeTypescript) 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 })
})
}
}
}

View File

@ -1,7 +1,10 @@
async function register ({ 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 username = 'root'
const results = await peertubeHelpers.database.query( 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 () { async function unregister () {

View File

@ -1,11 +1,16 @@
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
import * as chai from 'chai'
import 'mocha' import 'mocha'
import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers' import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers'
import { getPluginTestPath, installPlugin, setAccessTokensToServers } from '../../../shared/extra-utils' import {
checkVideoFilesWereRemoved,
const expect = chai.expect getPluginTestPath,
getVideo,
installPlugin,
setAccessTokensToServers,
uploadVideoAndGetId,
viewVideo
} from '../../../shared/extra-utils'
describe('Test plugin helpers', function () { describe('Test plugin helpers', function () {
let server: ServerInfo let server: ServerInfo
@ -32,6 +37,29 @@ describe('Test plugin helpers', function () {
await waitUntilLog(server, `root email is admin${server.internalServerNumber}@example.com`, 1) 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 () { after(async function () {
await cleanupTests([ server ]) await cleanupTests([ server ])
}) })

View File

@ -13,6 +13,10 @@ export type PeerTubeHelpers = {
database: { database: {
query: Function query: Function
} }
videos: {
removeVideo: (videoId: number) => Promise<void>
}
} }
export type RegisterServerOptions = { export type RegisterServerOptions = {