]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/api/videos/index.js
Server: split videos controller
[github/Chocobozzz/PeerTube.git] / server / controllers / api / videos / index.js
similarity index 59%
rename from server/controllers/api/videos.js
rename to server/controllers/api/videos/index.js
index aeefaa555e6ee25440a858027cba8edb7added7b..8de44d5acda5b7cfed1cd96a1b74f2891c252745 100644 (file)
@@ -6,12 +6,11 @@ const multer = require('multer')
 const path = require('path')
 const waterfall = require('async/waterfall')
 
-const constants = require('../../initializers/constants')
-const db = require('../../initializers/database')
-const logger = require('../../helpers/logger')
-const friends = require('../../lib/friends')
-const middlewares = require('../../middlewares')
-const admin = middlewares.admin
+const constants = require('../../../initializers/constants')
+const db = require('../../../initializers/database')
+const logger = require('../../../helpers/logger')
+const friends = require('../../../lib/friends')
+const middlewares = require('../../../middlewares')
 const oAuth = middlewares.oauth
 const pagination = middlewares.pagination
 const validators = middlewares.validators
@@ -20,8 +19,12 @@ const validatorsSort = validators.sort
 const validatorsVideos = validators.videos
 const search = middlewares.search
 const sort = middlewares.sort
-const databaseUtils = require('../../helpers/database-utils')
-const utils = require('../../helpers/utils')
+const databaseUtils = require('../../../helpers/database-utils')
+const utils = require('../../../helpers/utils')
+
+const abuseController = require('./abuse')
+const blacklistController = require('./blacklist')
+const rateController = require('./rate')
 
 const router = express.Router()
 
@@ -45,31 +48,14 @@ const storage = multer.diskStorage({
 
 const reqFiles = multer({ storage: storage }).fields([{ name: 'videofile', maxCount: 1 }])
 
+router.use('/', abuseController)
+router.use('/', blacklistController)
+router.use('/', rateController)
+
 router.get('/categories', listVideoCategories)
 router.get('/licences', listVideoLicences)
 router.get('/languages', listVideoLanguages)
 
-router.get('/abuse',
-  oAuth.authenticate,
-  admin.ensureIsAdmin,
-  validatorsPagination.pagination,
-  validatorsSort.videoAbusesSort,
-  sort.setVideoAbusesSort,
-  pagination.setPagination,
-  listVideoAbuses
-)
-router.post('/:id/abuse',
-  oAuth.authenticate,
-  validatorsVideos.videoAbuseReport,
-  reportVideoAbuseRetryWrapper
-)
-
-router.put('/:id/rate',
-  oAuth.authenticate,
-  validatorsVideos.videoRate,
-  rateVideoRetryWrapper
-)
-
 router.get('/',
   validatorsPagination.pagination,
   validatorsSort.videosSort,
@@ -110,13 +96,6 @@ router.get('/search/:value',
   searchVideos
 )
 
-router.post('/:id/blacklist',
-  oAuth.authenticate,
-  admin.ensureIsAdmin,
-  validatorsVideos.videosBlacklist,
-  addVideoToBlacklist
-)
-
 // ---------------------------------------------------------------------------
 
 module.exports = router
@@ -135,147 +114,6 @@ function listVideoLanguages (req, res, next) {
   res.json(constants.VIDEO_LANGUAGES)
 }
 
-function rateVideoRetryWrapper (req, res, next) {
-  const options = {
-    arguments: [ req, res ],
-    errorMessage: 'Cannot update the user video rate.'
-  }
-
-  databaseUtils.retryTransactionWrapper(rateVideo, options, function (err) {
-    if (err) return next(err)
-
-    return res.type('json').status(204).end()
-  })
-}
-
-function rateVideo (req, res, finalCallback) {
-  const rateType = req.body.rating
-  const videoInstance = res.locals.video
-  const userInstance = res.locals.oauth.token.User
-
-  waterfall([
-    databaseUtils.startSerializableTransaction,
-
-    function findPreviousRate (t, callback) {
-      db.UserVideoRate.load(userInstance.id, videoInstance.id, t, function (err, previousRate) {
-        return callback(err, t, previousRate)
-      })
-    },
-
-    function insertUserRateIntoDB (t, previousRate, callback) {
-      const options = { transaction: t }
-
-      let likesToIncrement = 0
-      let dislikesToIncrement = 0
-
-      if (rateType === constants.VIDEO_RATE_TYPES.LIKE) likesToIncrement++
-      else if (rateType === constants.VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement++
-
-      // There was a previous rate, update it
-      if (previousRate) {
-        // We will remove the previous rate, so we will need to remove it from the video attribute
-        if (previousRate.type === constants.VIDEO_RATE_TYPES.LIKE) likesToIncrement--
-        else if (previousRate.type === constants.VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement--
-
-        previousRate.type = rateType
-
-        previousRate.save(options).asCallback(function (err) {
-          return callback(err, t, likesToIncrement, dislikesToIncrement)
-        })
-      } else { // There was not a previous rate, insert a new one
-        const query = {
-          userId: userInstance.id,
-          videoId: videoInstance.id,
-          type: rateType
-        }
-
-        db.UserVideoRate.create(query, options).asCallback(function (err) {
-          return callback(err, t, likesToIncrement, dislikesToIncrement)
-        })
-      }
-    },
-
-    function updateVideoAttributeDB (t, likesToIncrement, dislikesToIncrement, callback) {
-      const options = { transaction: t }
-      const incrementQuery = {
-        likes: likesToIncrement,
-        dislikes: dislikesToIncrement
-      }
-
-      // Even if we do not own the video we increment the attributes
-      // It is usefull for the user to have a feedback
-      videoInstance.increment(incrementQuery, options).asCallback(function (err) {
-        return callback(err, t, likesToIncrement, dislikesToIncrement)
-      })
-    },
-
-    function sendEventsToFriendsIfNeeded (t, likesToIncrement, dislikesToIncrement, callback) {
-      // No need for an event type, we own the video
-      if (videoInstance.isOwned()) return callback(null, t, likesToIncrement, dislikesToIncrement)
-
-      const eventsParams = []
-
-      if (likesToIncrement !== 0) {
-        eventsParams.push({
-          videoId: videoInstance.id,
-          type: constants.REQUEST_VIDEO_EVENT_TYPES.LIKES,
-          count: likesToIncrement
-        })
-      }
-
-      if (dislikesToIncrement !== 0) {
-        eventsParams.push({
-          videoId: videoInstance.id,
-          type: constants.REQUEST_VIDEO_EVENT_TYPES.DISLIKES,
-          count: dislikesToIncrement
-        })
-      }
-
-      friends.addEventsToRemoteVideo(eventsParams, t, function (err) {
-        return callback(err, t, likesToIncrement, dislikesToIncrement)
-      })
-    },
-
-    function sendQaduToFriendsIfNeeded (t, likesToIncrement, dislikesToIncrement, callback) {
-      // We do not own the video, there is no need to send a quick and dirty update to friends
-      // Our rate was already sent by the addEvent function
-      if (videoInstance.isOwned() === false) return callback(null, t)
-
-      const qadusParams = []
-
-      if (likesToIncrement !== 0) {
-        qadusParams.push({
-          videoId: videoInstance.id,
-          type: constants.REQUEST_VIDEO_QADU_TYPES.LIKES
-        })
-      }
-
-      if (dislikesToIncrement !== 0) {
-        qadusParams.push({
-          videoId: videoInstance.id,
-          type: constants.REQUEST_VIDEO_QADU_TYPES.DISLIKES
-        })
-      }
-
-      friends.quickAndDirtyUpdatesVideoToFriends(qadusParams, t, function (err) {
-        return callback(err, t)
-      })
-    },
-
-    databaseUtils.commitTransaction
-
-  ], function (err, t) {
-    if (err) {
-      // This is just a debug because we will retry the insert
-      logger.debug('Cannot add the user video rate.', { error: err })
-      return databaseUtils.rollbackTransaction(err, t, finalCallback)
-    }
-
-    logger.info('User video rate for video %s of user %s updated.', videoInstance.name, userInstance.username)
-    return finalCallback(null)
-  })
-}
-
 // Wrapper to video add that retry the function if there is a database error
 // We need this because we run the transaction in SERIALIZABLE isolation that can fail
 function addVideoRetryWrapper (req, res, next) {
@@ -564,90 +402,3 @@ function searchVideos (req, res, next) {
     }
   )
 }
-
-function listVideoAbuses (req, res, next) {
-  db.VideoAbuse.listForApi(req.query.start, req.query.count, req.query.sort, function (err, abusesList, abusesTotal) {
-    if (err) return next(err)
-
-    res.json(utils.getFormatedObjects(abusesList, abusesTotal))
-  })
-}
-
-function reportVideoAbuseRetryWrapper (req, res, next) {
-  const options = {
-    arguments: [ req, res ],
-    errorMessage: 'Cannot report abuse to the video with many retries.'
-  }
-
-  databaseUtils.retryTransactionWrapper(reportVideoAbuse, options, function (err) {
-    if (err) return next(err)
-
-    return res.type('json').status(204).end()
-  })
-}
-
-function reportVideoAbuse (req, res, finalCallback) {
-  const videoInstance = res.locals.video
-  const reporterUsername = res.locals.oauth.token.User.username
-
-  const abuse = {
-    reporterUsername,
-    reason: req.body.reason,
-    videoId: videoInstance.id,
-    reporterPodId: null // This is our pod that reported this abuse
-  }
-
-  waterfall([
-
-    databaseUtils.startSerializableTransaction,
-
-    function createAbuse (t, callback) {
-      db.VideoAbuse.create(abuse).asCallback(function (err, abuse) {
-        return callback(err, t, abuse)
-      })
-    },
-
-    function sendToFriendsIfNeeded (t, abuse, callback) {
-      // We send the information to the destination pod
-      if (videoInstance.isOwned() === false) {
-        const reportData = {
-          reporterUsername,
-          reportReason: abuse.reason,
-          videoRemoteId: videoInstance.remoteId
-        }
-
-        friends.reportAbuseVideoToFriend(reportData, videoInstance)
-      }
-
-      return callback(null, t)
-    },
-
-    databaseUtils.commitTransaction
-
-  ], function andFinally (err, t) {
-    if (err) {
-      logger.debug('Cannot update the video.', { error: err })
-      return databaseUtils.rollbackTransaction(err, t, finalCallback)
-    }
-
-    logger.info('Abuse report for video %s created.', videoInstance.name)
-    return finalCallback(null)
-  })
-}
-
-function addVideoToBlacklist (req, res, next) {
-  const videoInstance = res.locals.video
-
-  const toCreate = {
-    videoId: videoInstance.id
-  }
-
-  db.BlacklistedVideo.create(toCreate).asCallback(function (err) {
-    if (err) {
-      logger.error('Errors when blacklisting video ', { error: err })
-      return next(err)
-    }
-
-    return res.type('json').status(204).end()
-  })
-}