08cc4d0b4cc8a9fee4924442847a3d94d1dcbead
[oweals/peertube.git] / server / controllers / api / videos / abuse.ts
1 import * as express from 'express'
2 import {
3   logger,
4   getFormattedObjects,
5   retryTransactionWrapper
6 } from '../../../helpers'
7 import { sequelizeTypescript } from '../../../initializers'
8 import {
9   authenticate,
10   ensureUserHasRight,
11   paginationValidator,
12   videoAbuseReportValidator,
13   videoAbusesSortValidator,
14   setVideoAbusesSort,
15   setPagination,
16   asyncMiddleware
17 } from '../../../middlewares'
18 import { VideoAbuseCreate, UserRight } from '../../../../shared'
19 import { sendVideoAbuse } from '../../../lib/index'
20 import { AccountModel } from '../../../models/account/account'
21 import { VideoModel } from '../../../models/video/video'
22 import { VideoAbuseModel } from '../../../models/video/video-abuse'
23
24 const abuseVideoRouter = express.Router()
25
26 abuseVideoRouter.get('/abuse',
27   authenticate,
28   ensureUserHasRight(UserRight.MANAGE_VIDEO_ABUSES),
29   paginationValidator,
30   videoAbusesSortValidator,
31   setVideoAbusesSort,
32   setPagination,
33   asyncMiddleware(listVideoAbuses)
34 )
35 abuseVideoRouter.post('/:id/abuse',
36   authenticate,
37   asyncMiddleware(videoAbuseReportValidator),
38   asyncMiddleware(reportVideoAbuseRetryWrapper)
39 )
40
41 // ---------------------------------------------------------------------------
42
43 export {
44   abuseVideoRouter
45 }
46
47 // ---------------------------------------------------------------------------
48
49 async function listVideoAbuses (req: express.Request, res: express.Response, next: express.NextFunction) {
50   const resultList = await VideoAbuseModel.listForApi(req.query.start, req.query.count, req.query.sort)
51
52   return res.json(getFormattedObjects(resultList.data, resultList.total))
53 }
54
55 async function reportVideoAbuseRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
56   const options = {
57     arguments: [ req, res ],
58     errorMessage: 'Cannot report abuse to the video with many retries.'
59   }
60
61   await retryTransactionWrapper(reportVideoAbuse, options)
62
63   return res.type('json').status(204).end()
64 }
65
66 async function reportVideoAbuse (req: express.Request, res: express.Response) {
67   const videoInstance = res.locals.video as VideoModel
68   const reporterAccount = res.locals.oauth.token.User.Account as AccountModel
69   const body: VideoAbuseCreate = req.body
70
71   const abuseToCreate = {
72     reporterAccountId: reporterAccount.id,
73     reason: body.reason,
74     videoId: videoInstance.id
75   }
76
77   await sequelizeTypescript.transaction(async t => {
78     const videoAbuseInstance = await VideoAbuseModel.create(abuseToCreate, { transaction: t })
79     videoAbuseInstance.Video = videoInstance
80
81     // We send the video abuse to the origin server
82     if (videoInstance.isOwned() === false) {
83       await sendVideoAbuse(reporterAccount, videoAbuseInstance, videoInstance, t)
84     }
85   })
86
87   logger.info('Abuse report for video %s created.', videoInstance.name)
88 }