]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/api/v1/remote.js
Fix requests ordering between pods
[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 validators = middlewares.validators.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 validators.signature,
17 validators.dataToDecrypt,
18 secureMiddleware.decryptBody,
19 validators.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 } else {
43 logger.error('Unkown remote request type %s.', request.type)
44 }
45 }, function (err) {
46 if (err) logger.error('Error managing remote videos.', { error: err })
47 })
48
49 // We don't need to keep the other pod waiting
50 return res.type('json').status(204).end()
51 }
52
53 function addRemoteVideo (videoToCreateData, callback) {
54 logger.debug('Adding remote video %s.', videoToCreateData.magnetUri)
55
56 // Mongoose pre hook will automatically create the thumbnail on disk
57 videoToCreateData.thumbnail = videoToCreateData.thumbnailBase64
58
59 const video = new Video(videoToCreateData)
60 video.save(callback)
61 }
62
63 function removeRemoteVideo (videoToRemoveData, fromUrl, callback) {
64 // We need the list because we have to remove some other stuffs (thumbnail etc)
65 Video.listByUrlAndMagnet(fromUrl, videoToRemoveData.magnetUri, function (err, videosList) {
66 if (err) {
67 logger.error('Cannot list videos from url and magnets.', { error: err })
68 return callback(err)
69 }
70
71 if (videosList.length === 0) {
72 logger.error('No remote video was found for this pod.', { magnetUri: videoToRemoveData.magnetUri, podUrl: fromUrl })
73 }
74
75 async.each(videosList, function (video, callbackEach) {
76 logger.debug('Removing remote video %s.', video.magnetUri)
77
78 video.remove(callbackEach)
79 }, callback)
80 })
81 }