3 const express
= require('express')
4 const waterfall
= require('async/waterfall')
6 const db
= require('../../../initializers/database')
7 const logger
= require('../../../helpers/logger')
8 const friends
= require('../../../lib/friends')
9 const middlewares
= require('../../../middlewares')
10 const admin
= middlewares
.admin
11 const oAuth
= middlewares
.oauth
12 const pagination
= middlewares
.pagination
13 const validators
= middlewares
.validators
14 const validatorsPagination
= validators
.pagination
15 const validatorsSort
= validators
.sort
16 const validatorsVideos
= validators
.videos
17 const sort
= middlewares
.sort
18 const databaseUtils
= require('../../../helpers/database-utils')
19 const utils
= require('../../../helpers/utils')
21 const router
= express
.Router()
26 validatorsPagination
.pagination
,
27 validatorsSort
.videoAbusesSort
,
28 sort
.setVideoAbusesSort
,
29 pagination
.setPagination
,
32 router
.post('/:id/abuse',
34 validatorsVideos
.videoAbuseReport
,
35 reportVideoAbuseRetryWrapper
38 // ---------------------------------------------------------------------------
40 module
.exports
= router
42 // ---------------------------------------------------------------------------
44 function listVideoAbuses (req
, res
, next
) {
45 db
.VideoAbuse
.listForApi(req
.query
.start
, req
.query
.count
, req
.query
.sort
, function (err
, abusesList
, abusesTotal
) {
46 if (err
) return next(err
)
48 res
.json(utils
.getFormatedObjects(abusesList
, abusesTotal
))
52 function reportVideoAbuseRetryWrapper (req
, res
, next
) {
54 arguments: [ req
, res
],
55 errorMessage: 'Cannot report abuse to the video with many retries.'
58 databaseUtils
.retryTransactionWrapper(reportVideoAbuse
, options
, function (err
) {
59 if (err
) return next(err
)
61 return res
.type('json').status(204).end()
65 function reportVideoAbuse (req
, res
, finalCallback
) {
66 const videoInstance
= res
.locals
.video
67 const reporterUsername
= res
.locals
.oauth
.token
.User
.username
71 reason: req
.body
.reason
,
72 videoId: videoInstance
.id
,
73 reporterPodId: null // This is our pod that reported this abuse
78 databaseUtils
.startSerializableTransaction
,
80 function createAbuse (t
, callback
) {
81 db
.VideoAbuse
.create(abuse
).asCallback(function (err
, abuse
) {
82 return callback(err
, t
, abuse
)
86 function sendToFriendsIfNeeded (t
, abuse
, callback
) {
87 // We send the information to the destination pod
88 if (videoInstance
.isOwned() === false) {
91 reportReason: abuse
.reason
,
92 videoRemoteId: videoInstance
.remoteId
95 friends
.reportAbuseVideoToFriend(reportData
, videoInstance
)
98 return callback(null, t
)
101 databaseUtils
.commitTransaction
103 ], function andFinally (err
, t
) {
105 logger
.debug('Cannot update the video.', { error: err
})
106 return databaseUtils
.rollbackTransaction(err
, t
, finalCallback
)
109 logger
.info('Abuse report for video %s created.', videoInstance
.name
)
110 return finalCallback(null)