X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fcontrollers%2Fapi%2Fvideos%2Fblacklist.ts;h=43b0516e79a8eed2af326e0294bb700509f710bb;hb=5abb9fbbd12e7097e348d6a38622d364b1fa47ed;hp=d8f2068ec547c4469f31561f0e3bfd20ebd1a8a0;hpb=ad0997adfb9e1e3b1ff54338d7558cf7b18440ea;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/blacklist.ts b/server/controllers/api/videos/blacklist.ts index d8f2068ec..43b0516e7 100644 --- a/server/controllers/api/videos/blacklist.ts +++ b/server/controllers/api/videos/blacklist.ts @@ -1,20 +1,57 @@ import * as express from 'express' - -import { database as db } from '../../../initializers/database' -import { logger } from '../../../helpers' +import { VideoBlacklist, UserRight, VideoBlacklistCreate } from '../../../../shared' +import { logger } from '../../../helpers/logger' +import { getFormattedObjects } from '../../../helpers/utils' import { + asyncMiddleware, authenticate, - ensureIsAdmin, - videosBlacklistValidator + blacklistSortValidator, + ensureUserHasRight, + paginationValidator, + setBlacklistSort, + setDefaultPagination, + videosBlacklistAddValidator, + videosBlacklistRemoveValidator, + videosBlacklistUpdateValidator } from '../../../middlewares' +import { VideoBlacklistModel } from '../../../models/video/video-blacklist' +import { sequelizeTypescript } from '../../../initializers' +import { Notifier } from '../../../lib/notifier' +import { VideoModel } from '../../../models/video/video' +import { sendCreateVideo, sendDeleteVideo, sendUpdateVideo } from '../../../lib/activitypub/send' +import { federateVideoIfNeeded } from '../../../lib/activitypub' const blacklistRouter = express.Router() -blacklistRouter.post('/:id/blacklist', +blacklistRouter.post('/:videoId/blacklist', + authenticate, + ensureUserHasRight(UserRight.MANAGE_VIDEO_BLACKLIST), + asyncMiddleware(videosBlacklistAddValidator), + asyncMiddleware(addVideoToBlacklist) +) + +blacklistRouter.get('/blacklist', authenticate, - ensureIsAdmin, - videosBlacklistValidator, - addVideoToBlacklist + ensureUserHasRight(UserRight.MANAGE_VIDEO_BLACKLIST), + paginationValidator, + blacklistSortValidator, + setBlacklistSort, + setDefaultPagination, + asyncMiddleware(listBlacklist) +) + +blacklistRouter.put('/:videoId/blacklist', + authenticate, + ensureUserHasRight(UserRight.MANAGE_VIDEO_BLACKLIST), + asyncMiddleware(videosBlacklistUpdateValidator), + asyncMiddleware(updateVideoBlacklistController) +) + +blacklistRouter.delete('/:videoId/blacklist', + authenticate, + ensureUserHasRight(UserRight.MANAGE_VIDEO_BLACKLIST), + asyncMiddleware(videosBlacklistRemoveValidator), + asyncMiddleware(removeVideoFromBlacklistController) ) // --------------------------------------------------------------------------- @@ -25,17 +62,65 @@ export { // --------------------------------------------------------------------------- -function addVideoToBlacklist (req: express.Request, res: express.Response, next: express.NextFunction) { +async function addVideoToBlacklist (req: express.Request, res: express.Response) { const videoInstance = res.locals.video + const body: VideoBlacklistCreate = req.body const toCreate = { - videoId: videoInstance.id + videoId: videoInstance.id, + unfederated: body.unfederate === true, + reason: body.reason } - db.BlacklistedVideo.create(toCreate) - .then(() => res.type('json').status(204).end()) - .catch(err => { - logger.error('Errors when blacklisting video ', err) - return next(err) - }) + const blacklist = await VideoBlacklistModel.create(toCreate) + blacklist.Video = videoInstance + + if (body.unfederate === true) { + await sendDeleteVideo(videoInstance, undefined) + } + + Notifier.Instance.notifyOnVideoBlacklist(blacklist) + + logger.info('Video %s blacklisted.', res.locals.video.uuid) + + return res.type('json').status(204).end() +} + +async function updateVideoBlacklistController (req: express.Request, res: express.Response) { + const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel + + if (req.body.reason !== undefined) videoBlacklist.reason = req.body.reason + + await sequelizeTypescript.transaction(t => { + return videoBlacklist.save({ transaction: t }) + }) + + return res.type('json').status(204).end() +} + +async function listBlacklist (req: express.Request, res: express.Response, next: express.NextFunction) { + const resultList = await VideoBlacklistModel.listForApi(req.query.start, req.query.count, req.query.sort) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) +} + +async function removeVideoFromBlacklistController (req: express.Request, res: express.Response, next: express.NextFunction) { + const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel + const video: VideoModel = res.locals.video + + await sequelizeTypescript.transaction(async t => { + const unfederated = videoBlacklist.unfederated + await videoBlacklist.destroy({ transaction: t }) + + // Re federate the video + if (unfederated === true) { + await federateVideoIfNeeded(video, true, t) + } + }) + + Notifier.Instance.notifyOnVideoUnblacklist(video) + + logger.info('Video %s removed from blacklist.', res.locals.video.uuid) + + return res.type('json').status(204).end() }