X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=models%2Fpods.js;h=395b1e0b12056a1c27a345890c5030479a5e462b;hb=c173e56520b0fe4206b9ea8049b6add40bfeabcd;hp=ed2f0d8ee9f20a7204d4b61f06ed6447739a81e0;hpb=c45f7f84001c2731909db04dd82e1c1f290386eb;p=github%2FChocobozzz%2FPeerTube.git diff --git a/models/pods.js b/models/pods.js index ed2f0d8ee..395b1e0b1 100644 --- a/models/pods.js +++ b/models/pods.js @@ -1,73 +1,61 @@ ;(function () { 'use strict' - var async = require('async') - var config = require('config') - var fs = require('fs') - var request = require('request') + var mongoose = require('mongoose') var constants = require('../initializers/constants') var logger = require('../helpers/logger') - var PodsDB = require('../initializers/database').PodsDB - var poolRequests = require('../lib/poolRequests') - var utils = require('../helpers/utils') - var http = config.get('webserver.https') ? 'https' : 'http' - var host = config.get('webserver.host') - var port = config.get('webserver.port') + // --------------------------------------------------------------------------- + + var podsSchema = mongoose.Schema({ + url: String, + publicKey: String, + score: { type: Number, max: constants.FRIEND_BASE_SCORE } + }) + var PodsDB = mongoose.model('pods', podsSchema) - var pods = { + // --------------------------------------------------------------------------- + + var Pods = { add: add, - addVideoToFriends: addVideoToFriends, + count: count, + findByUrl: findByUrl, + findBadPods: findBadPods, + incrementScores: incrementScores, list: list, - hasFriends: hasFriends, - makeFriends: makeFriends, - quitFriends: quitFriends, remove: remove, - removeVideoToFriends + removeAll: removeAll, + removeAllByIds: removeAllByIds } // TODO: check if the pod is not already a friend function add (data, callback) { - var videos = require('./videos') - logger.info('Adding pod: %s', data.url) - + if (!callback) callback = function () {} var params = { url: data.url, publicKey: data.publicKey, score: constants.FRIEND_BASE_SCORE } - PodsDB.create(params, function (err, pod) { - if (err) { - logger.error('Cannot insert the pod.', { error: err }) - return callback(err) - } - - videos.addRemotes(data.videos) + PodsDB.create(params, callback) + } - fs.readFile(utils.getCertDir() + 'peertube.pub', 'utf8', function (err, cert) { - if (err) { - logger.error('Cannot read cert file.', { error: err }) - return callback(err) - } + function count (callback) { + return PodsDB.count(callback) + } - videos.listOwned(function (err, videos_list) { - if (err) { - logger.error('Cannot get the list of owned videos.', { error: err }) - return callback(err) - } + function findBadPods (callback) { + PodsDB.find({ score: 0 }, callback) + } - return callback(null, { cert: cert, videos: videos_list }) - }) - }) - }) + function findByUrl (url, callback) { + PodsDB.findOne({ url: url }, callback) } - function addVideoToFriends (video) { - // To avoid duplicates - var id = video.name + video.magnetUri - poolRequests.addToPoolRequests(id, 'add', video) + function incrementScores (ids, value, callback) { + if (!callback) callback = function () {} + PodsDB.update({ _id: { $in: ids } }, { $inc: { score: value } }, { multi: true }, callback) } function list (callback) { @@ -81,202 +69,22 @@ }) } - function hasFriends (callback) { - PodsDB.count(function (err, count) { - if (err) return callback(err) - - var has_friends = (count !== 0) - callback(null, has_friends) - }) - } - - function makeFriends (callback) { - var videos = require('./videos') - var pods_score = {} - - logger.info('Make friends!') - fs.readFile(utils.getCertDir() + 'peertube.pub', 'utf8', function (err, cert) { - if (err) { - logger.error('Cannot read public cert.', { error: err }) - return callback(err) - } - - var urls = config.get('network.friends') - - async.each(urls, computeForeignPodsList, function () { - logger.debug('Pods scores computed.', { pods_score: pods_score }) - var pods_list = computeWinningPods(urls, pods_score) - logger.debug('Pods that we keep computed.', { pods_to_keep: pods_list }) - - makeRequestsToWinningPods(cert, pods_list) - }) - }) - - // ----------------------------------------------------------------------- - - function computeForeignPodsList (url, callback) { - // Let's give 1 point to the pod we ask the friends list - pods_score[url] = 1 - - getForeignPodsList(url, function (foreign_pods_list) { - if (foreign_pods_list.length === 0) return callback() - - async.each(foreign_pods_list, function (foreign_pod, callback_each) { - var foreign_url = foreign_pod.url - - if (pods_score[foreign_url]) pods_score[foreign_url]++ - else pods_score[foreign_url] = 1 - - callback_each() - }, function () { - callback() - }) - }) - } - - function computeWinningPods (urls, pods_score) { - // Build the list of pods to add - // Only add a pod if it exists in more than a half base pods - var pods_list = [] - var base_score = urls.length / 2 - Object.keys(pods_score).forEach(function (pod) { - if (pods_score[pod] > base_score) pods_list.push({ url: pod }) - }) - - return pods_list - } - - function makeRequestsToWinningPods (cert, pods_list) { - // Stop pool requests - poolRequests.deactivate() - // Flush pool requests - poolRequests.forceSend() - - // Get the list of our videos to send to our new friends - videos.listOwned(function (err, videos_list) { - if (err) throw err - - var data = { - url: http + '://' + host + ':' + port, - publicKey: cert, - videos: videos_list - } - - utils.makeMultipleRetryRequest( - { method: 'POST', path: '/api/' + constants.API_VERSION + '/pods/', data: data }, - - pods_list, - - function eachRequest (err, response, body, url, pod, callback_each_request) { - // We add the pod if it responded correctly with its public certificate - if (!err && response.statusCode === 200) { - add({ url: pod.url, publicKey: body.cert, score: constants.FRIEND_BASE_SCORE }, function (err) { - if (err) logger.error('Error with adding %s pod.', pod.url, { error: err }) - - videos.addRemotes(body.videos, function (err) { - if (err) logger.error('Error with adding videos of pod.', pod.url, { error: err }) - - logger.debug('Adding remote videos from %s.', pod.url, { videos: body.videos }) - return callback_each_request() - }) - }) - } else { - logger.error('Error with adding %s pod.', pod.url, { error: err || new Error('Status not 200') }) - return callback_each_request() - } - }, - - function endRequests (err) { - // Now we made new friends, we can re activate the pool of requests - poolRequests.activate() - - if (err) { - logger.error('There was some errors when we wanted to make friends.', { error: err }) - return callback(err) - } - - logger.debug('makeRequestsToWinningPods finished.') - return callback(null) - } - ) - }) - } - } - - function quitFriends (callback) { - // Stop pool requests - poolRequests.deactivate() - // Flush pool requests - poolRequests.forceSend() - - PodsDB.find(function (err, pods) { - if (err) return callback(err) - - var request = { - method: 'POST', - path: '/api/' + constants.API_VERSION + '/pods/remove', - sign: true, - encrypt: true, - data: { - url: 'me' // Fake data - } - } - - // Announce we quit them - utils.makeMultipleRetryRequest(request, pods, function () { - PodsDB.remove(function (err) { - poolRequests.activate() - - if (err) return callback(err) - - logger.info('Broke friends, so sad :(') - - var videos = require('./videos') - videos.removeAllRemotes(function (err) { - if (err) return callback(err) - - logger.info('Removed all remote videos.') - callback(null) - }) - }) - }) - }) - } - function remove (url, callback) { - var videos = require('./videos') - logger.info('Removing %s pod.', url) - - videos.removeAllRemotesOf(url, function (err) { - if (err) logger.error('Cannot remove all remote videos of %s.', url) - - PodsDB.remove({ url: url }, function (err) { - if (err) return callback(err) - - logger.info('%s pod removed.', url) - callback(null) - }) - }) + if (!callback) callback = function () {} + PodsDB.remove({ url: url }, callback) } - function removeVideoToFriends (video) { - // To avoid duplicates - var id = video.name + video.magnetUri - poolRequests.addToPoolRequests(id, 'remove', video) + function removeAll (callback) { + if (!callback) callback = function () {} + PodsDB.remove(callback) } - // --------------------------------------------------------------------------- - - module.exports = pods + function removeAllByIds (ids, callback) { + if (!callback) callback = function () {} + PodsDB.remove({ _id: { $in: ids } }, callback) + } // --------------------------------------------------------------------------- - function getForeignPodsList (url, callback) { - var path = '/api/' + constants.API_VERSION + '/pods' - - request.get(url + path, function (err, response, body) { - if (err) throw err - callback(JSON.parse(body)) - }) - } + module.exports = Pods })()