'use strict'
-var express = require('express')
-var fs = require('fs')
-
-var logger = require('../../../helpers/logger')
-var friends = require('../../../lib/friends')
-var middleware = require('../../../middlewares')
-var cacheMiddleware = middleware.cache
-var peertubeCrypto = require('../../../helpers/peertubeCrypto')
-var Pods = require('../../../models/pods')
-var reqValidator = middleware.reqValidators.pods
-var secureMiddleware = middleware.secure
-var secureRequest = middleware.reqValidators.remote.secureRequest
-var Videos = require('../../../models/videos')
-
-var router = express.Router()
-
-router.get('/', cacheMiddleware.cache(false), listPods)
-router.post('/', reqValidator.podsAdd, cacheMiddleware.cache(false), addPods)
-router.get('/makefriends', reqValidator.makeFriends, cacheMiddleware.cache(false), makeFriends)
-router.get('/quitfriends', cacheMiddleware.cache(false), quitFriends)
+const each = require('async/each')
+const express = require('express')
+const mongoose = require('mongoose')
+const waterfall = require('async/waterfall')
+
+const logger = require('../../../helpers/logger')
+const friends = require('../../../lib/friends')
+const middlewares = require('../../../middlewares')
+const admin = middlewares.admin
+const oAuth = middlewares.oauth
+const validators = middlewares.validators.pods
+const signatureValidator = middlewares.validators.remote.signature
+
+const router = express.Router()
+const Pod = mongoose.model('Pod')
+const Video = mongoose.model('Video')
+
+router.get('/', listPods)
+router.post('/', validators.podsAdd, addPods)
+router.post('/makefriends',
+ oAuth.authenticate,
+ admin.ensureIsAdmin,
+ validators.makeFriends,
+ makeFriends
+)
+router.get('/quitfriends',
+ oAuth.authenticate,
+ admin.ensureIsAdmin,
+ quitFriends
+)
// Post because this is a secured request
-router.post('/remove', secureRequest, secureMiddleware.decryptBody, removePods)
+router.post('/remove', signatureValidator, removePods)
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
function addPods (req, res, next) {
- var informations = req.body.data
- Pods.add(informations, function (err) {
- if (err) return next(err)
+ const informations = req.body
+
+ waterfall([
+ function addPod (callback) {
+ const pod = new Pod(informations)
+ pod.save(function (err, podCreated) {
+ // Be sure about the number of parameters for the callback
+ return callback(err, podCreated)
+ })
+ },
- Videos.addRemotes(informations.videos)
+ function sendMyVideos (podCreated, callback) {
+ friends.sendOwnedVideosToPod(podCreated._id)
- fs.readFile(peertubeCrypto.getCertDir() + 'peertube.pub', 'utf8', function (err, cert) {
- if (err) {
- logger.error('Cannot read cert file.')
- return next(err)
- }
+ callback(null)
+ },
- Videos.listOwned(function (err, videos_list) {
+ function fetchMyCertificate (callback) {
+ friends.getMyCertificate(function (err, cert) {
if (err) {
- logger.error('Cannot get the list of owned videos.')
- return next(err)
+ logger.error('Cannot read cert file.')
+ return callback(err)
}
- res.json({ cert: cert, videos: videos_list })
+ return callback(null, cert)
})
- })
+ }
+ ], function (err, cert) {
+ if (err) return next(err)
+
+ return res.json({ cert: cert })
})
}
function listPods (req, res, next) {
- Pods.list(function (err, pods_list) {
+ Pod.list(function (err, podsUrlList) {
if (err) return next(err)
- res.json(pods_list)
+ res.json(getFormatedPods(podsUrlList))
})
}
function makeFriends (req, res, next) {
- friends.makeFriends(function (err) {
- if (err) return next(err)
+ const urls = req.body.urls
+
+ friends.makeFriends(urls, function (err) {
+ if (err) {
+ logger.error('Could not make friends.', { error: err })
+ return
+ }
- res.sendStatus(204)
+ logger.info('Made friends!')
})
+
+ res.type('json').status(204).end()
}
function removePods (req, res, next) {
- var url = req.body.signature.url
- Pods.remove(url, function (err) {
- if (err) return next(err)
+ const url = req.body.signature.url
+
+ waterfall([
+ function loadPod (callback) {
+ Pod.loadByUrl(url, callback)
+ },
- Videos.removeAllRemotesOf(url, function (err) {
- if (err) logger.error('Cannot remove all remote videos of %s.', url)
- else logger.info('%s pod removed.', url)
+ function removePod (pod, callback) {
+ pod.remove(function (err) {
+ // Be sure we only return one argument in the callback
+ return callback(err)
+ })
+ },
- res.sendStatus(204)
- })
+ function (callback) {
+ Video.listByUrls([ url ], function (err, videosList) {
+ if (err) {
+ logger.error('Cannot list videos from url.', { error: err })
+ return callback(err)
+ }
+
+ return callback(null, videosList)
+ })
+ },
+
+ function removeTheRemoteVideos (videosList, callback) {
+ each(videosList, function (video, callbackEach) {
+ video.remove(callbackEach)
+ }, callback)
+ }
+ ], function (err) {
+ if (err) return next(err)
+
+ return res.type('json').status(204).end()
})
}
friends.quitFriends(function (err) {
if (err) return next(err)
- res.sendStatus(204)
+ res.type('json').status(204).end()
})
}
+
+// ---------------------------------------------------------------------------
+
+function getFormatedPods (pods) {
+ const formatedPods = []
+
+ pods.forEach(function (pod) {
+ formatedPods.push(pod.toFormatedJSON())
+ })
+
+ return formatedPods
+}