From e4c87ec26962e359d1c70b03ed188a3f19d6a25b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Sun, 26 Feb 2017 18:57:33 +0100 Subject: Server: implement video views --- server/lib/friends.js | 22 +++++- server/lib/request-video-event-scheduler.js | 109 ++++++++++++++++++++++++++++ server/lib/request-video-qadu-scheduler.js | 2 +- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 server/lib/request-video-event-scheduler.js (limited to 'server/lib') diff --git a/server/lib/friends.js b/server/lib/friends.js index 424a30801..203f0e52c 100644 --- a/server/lib/friends.js +++ b/server/lib/friends.js @@ -11,13 +11,16 @@ const db = require('../initializers/database') const logger = require('../helpers/logger') const peertubeCrypto = require('../helpers/peertube-crypto') const requests = require('../helpers/requests') +const utils = require('../helpers/utils') const RequestScheduler = require('./request-scheduler') const RequestVideoQaduScheduler = require('./request-video-qadu-scheduler') +const RequestVideoEventScheduler = require('./request-video-event-scheduler') const ENDPOINT_ACTIONS = constants.REQUEST_ENDPOINT_ACTIONS[constants.REQUEST_ENDPOINTS.VIDEOS] const requestScheduler = new RequestScheduler() const requestSchedulerVideoQadu = new RequestVideoQaduScheduler() +const requestSchedulerVideoEvent = new RequestVideoEventScheduler() const friends = { activate, @@ -25,6 +28,7 @@ const friends = { updateVideoToFriends, reportAbuseVideoToFriend, quickAndDirtyUpdateVideoToFriends, + addEventToRemoteVideo, hasFriends, makeFriends, quitFriends, @@ -35,6 +39,7 @@ const friends = { function activate () { requestScheduler.activate() requestSchedulerVideoQadu.activate() + requestSchedulerVideoEvent.activate() } function addVideoToFriends (videoData, transaction, callback) { @@ -85,6 +90,15 @@ function quickAndDirtyUpdateVideoToFriends (videoId, type, transaction, callback return createVideoQaduRequest(options, callback) } +function addEventToRemoteVideo (videoId, type, transaction, callback) { + const options = { + videoId, + type, + transaction + } + createVideoEventRequest(options, callback) +} + function hasFriends (callback) { db.Pod.countAll(function (err, count) { if (err) return callback(err) @@ -329,11 +343,17 @@ function createRequest (options, callback) { } function createVideoQaduRequest (options, callback) { - if (!callback) callback = function () {} + if (!callback) callback = utils.createEmptyCallback() requestSchedulerVideoQadu.createRequest(options, callback) } +function createVideoEventRequest (options, callback) { + if (!callback) callback = utils.createEmptyCallback() + + requestSchedulerVideoEvent.createRequest(options, callback) +} + function isMe (host) { return host === constants.CONFIG.WEBSERVER.HOST } diff --git a/server/lib/request-video-event-scheduler.js b/server/lib/request-video-event-scheduler.js new file mode 100644 index 000000000..5ea5631b0 --- /dev/null +++ b/server/lib/request-video-event-scheduler.js @@ -0,0 +1,109 @@ +'use strict' + +const BaseRequestScheduler = require('./base-request-scheduler') +const constants = require('../initializers/constants') +const db = require('../initializers/database') + +module.exports = class RequestVideoEventScheduler extends BaseRequestScheduler { + + constructor () { + super() + + // We limit the size of the requests + this.limitPods = constants.REQUESTS_VIDEO_EVENT_LIMIT_PODS + this.limitPerPod = constants.REQUESTS_VIDEO_EVENT_LIMIT_PER_POD + + this.description = 'video event requests' + } + + getRequestModel () { + return db.RequestVideoEvent + } + + getRequestToPodModel () { + return db.RequestVideoEvent + } + + buildRequestObjects (eventsToProcess) { + const requestsToMakeGrouped = {} + + /* Example: + { + pod1: { + video1: { views: 4, likes: 5 }, + video2: { likes: 5 } + } + } + */ + const eventsPerVideoPerPod = {} + + // We group video events per video and per pod + // We add the counts of the same event types + Object.keys(eventsToProcess).forEach(toPodId => { + eventsToProcess[toPodId].forEach(eventToProcess => { + if (!eventsPerVideoPerPod[toPodId]) eventsPerVideoPerPod[toPodId] = {} + + if (!requestsToMakeGrouped[toPodId]) { + requestsToMakeGrouped[toPodId] = { + toPod: eventToProcess.pod, + endpoint: constants.REQUEST_ENDPOINTS.EVENT, + ids: [], // request ids, to delete them from the DB in the future + datas: [] // requests data + } + } + requestsToMakeGrouped[toPodId].ids.push(eventToProcess.id) + + const eventsPerVideo = eventsPerVideoPerPod[toPodId] + const remoteId = eventToProcess.video.remoteId + if (!eventsPerVideo[remoteId]) eventsPerVideo[remoteId] = {} + + const events = eventsPerVideo[remoteId] + if (!events[eventToProcess.type]) events[eventToProcess.type] = 0 + + events[eventToProcess.type] += eventToProcess.count + }) + }) + + // Now we build our requests array per pod + Object.keys(eventsPerVideoPerPod).forEach(toPodId => { + const eventsForPod = eventsPerVideoPerPod[toPodId] + + Object.keys(eventsForPod).forEach(remoteId => { + const eventsForVideo = eventsForPod[remoteId] + + Object.keys(eventsForVideo).forEach(eventType => { + requestsToMakeGrouped[toPodId].datas.push({ + data: { + remoteId, + eventType, + count: eventsForVideo[eventType] + } + }) + }) + }) + }) + + return requestsToMakeGrouped + } + + // { type, videoId, count?, transaction? } + createRequest (options, callback) { + const type = options.type + const videoId = options.videoId + const transaction = options.transaction + let count = options.count + + if (count === undefined) count = 1 + + const dbRequestOptions = {} + if (transaction) dbRequestOptions.transaction = transaction + + const createQuery = { + type, + count, + videoId + } + + return db.RequestVideoEvent.create(createQuery, dbRequestOptions).asCallback(callback) + } +} diff --git a/server/lib/request-video-qadu-scheduler.js b/server/lib/request-video-qadu-scheduler.js index 401b2fb44..29e44a6c4 100644 --- a/server/lib/request-video-qadu-scheduler.js +++ b/server/lib/request-video-qadu-scheduler.js @@ -12,7 +12,7 @@ module.exports = class RequestVideoQaduScheduler extends BaseRequestScheduler { // We limit the size of the requests this.limitPods = constants.REQUESTS_VIDEO_QADU_LIMIT_PODS - this.limitPerPod = constants.REQUESTS_VIDEO_QADU_LIMIT_PODS + this.limitPerPod = constants.REQUESTS_VIDEO_QADU_LIMIT_PER_POD this.description = 'video QADU requests' } -- cgit v1.2.3