Pod URL -> pod host. HTTPS is required to make friends.
[oweals/peertube.git] / server / controllers / api / remote.js
1 'use strict'
2
3 const each = require('async/each')
4 const eachSeries = require('async/eachSeries')
5 const express = require('express')
6 const mongoose = require('mongoose')
7
8 const middlewares = require('../../middlewares')
9 const secureMiddleware = middlewares.secure
10 const validators = middlewares.validators.remote
11 const logger = require('../../helpers/logger')
12
13 const router = express.Router()
14 const Video = mongoose.model('Video')
15
16 router.post('/videos',
17   validators.signature,
18   validators.dataToDecrypt,
19   secureMiddleware.checkSignature,
20   secureMiddleware.decryptBody,
21   validators.remoteVideos,
22   remoteVideos
23 )
24
25 // ---------------------------------------------------------------------------
26
27 module.exports = router
28
29 // ---------------------------------------------------------------------------
30
31 function remoteVideos (req, res, next) {
32   const requests = req.body.data
33   const fromHost = req.body.signature.host
34
35   // We need to process in the same order to keep consistency
36   // TODO: optimization
37   eachSeries(requests, function (request, callbackEach) {
38     const videoData = request.data
39
40     if (request.type === 'add') {
41       addRemoteVideo(videoData, callbackEach)
42     } else if (request.type === 'remove') {
43       removeRemoteVideo(videoData, fromHost, callbackEach)
44     } else {
45       logger.error('Unkown remote request type %s.', request.type)
46     }
47   }, function (err) {
48     if (err) logger.error('Error managing remote videos.', { error: err })
49   })
50
51   // We don't need to keep the other pod waiting
52   return res.type('json').status(204).end()
53 }
54
55 function addRemoteVideo (videoToCreateData, callback) {
56   logger.debug('Adding remote video %s.', videoToCreateData.magnetUri)
57
58   // Mongoose pre hook will automatically create the thumbnail on disk
59   videoToCreateData.thumbnail = videoToCreateData.thumbnailBase64
60
61   const video = new Video(videoToCreateData)
62   video.save(callback)
63 }
64
65 function removeRemoteVideo (videoToRemoveData, fromHost, callback) {
66   // We need the list because we have to remove some other stuffs (thumbnail etc)
67   Video.listByHostAndRemoteId(fromHost, videoToRemoveData.remoteId, function (err, videosList) {
68     if (err) {
69       logger.error('Cannot list videos from host and magnets.', { error: err })
70       return callback(err)
71     }
72
73     if (videosList.length === 0) {
74       logger.error('No remote video was found for this pod.', { magnetUri: videoToRemoveData.magnetUri, podHost: fromHost })
75     }
76
77     each(videosList, function (video, callbackEach) {
78       logger.debug('Removing remote video %s.', video.magnetUri)
79
80       video.remove(callbackEach)
81     }, callback)
82   })
83 }