]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/api/v1/remote.js
OAuth/User models refractoring -> use mongoose api
[github/Chocobozzz/PeerTube.git] / server / controllers / api / v1 / remote.js
1 'use strict'
2
3 const async = require('async')
4 const express = require('express')
5 const mongoose = require('mongoose')
6
7 const middlewares = require('../../../middlewares')
8 const secureMiddleware = middlewares.secure
9 const reqValidator = middlewares.reqValidators.remote
10 const logger = require('../../../helpers/logger')
11
12 const router = express.Router()
13 const Video = mongoose.model('Video')
14
15 router.post('/videos',
16 reqValidator.signature,
17 reqValidator.dataToDecrypt,
18 secureMiddleware.decryptBody,
19 reqValidator.remoteVideos,
20 remoteVideos
21 )
22
23 // ---------------------------------------------------------------------------
24
25 module.exports = router
26
27 // ---------------------------------------------------------------------------
28
29 function remoteVideos (req, res, next) {
30 const requests = req.body.data
31 const fromUrl = req.body.signature.url
32
33 // We need to process in the same order to keep consistency
34 // TODO: optimization
35 async.eachSeries(requests, function (request, callbackEach) {
36 const videoData = request.data
37
38 if (request.type === 'add') {
39 addRemoteVideo(videoData, callbackEach)
40 } else if (request.type === 'remove') {
41 removeRemoteVideo(videoData, fromUrl, callbackEach)
42 }
43 }, function (err) {
44 if (err) logger.error('Error managing remote videos.', { error: err })
45 })
46
47 // We don't need to keep the other pod waiting
48 return res.type('json').status(204).end()
49 }
50
51 function addRemoteVideo (videoToCreateData, callback) {
52 // Mongoose pre hook will automatically create the thumbnail on disk
53 videoToCreateData.thumbnail = videoToCreateData.thumbnailBase64
54
55 const video = new Video(videoToCreateData)
56 video.save(callback)
57 }
58
59 function removeRemoteVideo (videoToRemoveData, fromUrl, callback) {
60 // We need the list because we have to remove some other stuffs (thumbnail etc)
61 Video.listByUrlAndMagnet(fromUrl, videoToRemoveData.magnetUri, function (err, videosList) {
62 if (err) {
63 logger.error('Cannot list videos from url and magnets.', { error: err })
64 return callback(err)
65 }
66
67 async.each(videosList, function (video, callbackEach) {
68 video.remove(callbackEach)
69 }, callback)
70 })
71 }