
This system will be useful to to update some int video attributes (likes, dislikes, views...) The classic system is not used because we need some optimization for scaling
117 lines
3.4 KiB
JavaScript
117 lines
3.4 KiB
JavaScript
'use strict'
|
|
|
|
const BaseRequestScheduler = require('./base-request-scheduler')
|
|
const constants = require('../initializers/constants')
|
|
const db = require('../initializers/database')
|
|
const logger = require('../helpers/logger')
|
|
|
|
module.exports = class RequestVideoQaduScheduler extends BaseRequestScheduler {
|
|
|
|
constructor () {
|
|
super()
|
|
|
|
// We limit the size of the requests
|
|
this.limitPods = constants.REQUESTS_VIDEO_QADU_LIMIT_PODS
|
|
this.limitPerPod = constants.REQUESTS_VIDEO_QADU_LIMIT_PODS
|
|
|
|
this.description = 'video QADU requests'
|
|
}
|
|
|
|
getRequestModel () {
|
|
return db.RequestVideoQadu
|
|
}
|
|
|
|
getRequestToPodModel () {
|
|
return db.RequestVideoQadu
|
|
}
|
|
|
|
buildRequestObjects (requests) {
|
|
const requestsToMakeGrouped = {}
|
|
|
|
Object.keys(requests).forEach(toPodId => {
|
|
requests[toPodId].forEach(data => {
|
|
const request = data.request
|
|
const video = data.video
|
|
const pod = data.pod
|
|
const hashKey = toPodId
|
|
|
|
if (!requestsToMakeGrouped[hashKey]) {
|
|
requestsToMakeGrouped[hashKey] = {
|
|
toPod: pod,
|
|
endpoint: constants.REQUEST_ENDPOINTS.QADU,
|
|
ids: [], // request ids, to delete them from the DB in the future
|
|
datas: [], // requests data
|
|
videos: {}
|
|
}
|
|
}
|
|
|
|
if (!requestsToMakeGrouped[hashKey].videos[video.id]) {
|
|
requestsToMakeGrouped[hashKey].videos[video.id] = {}
|
|
}
|
|
|
|
const videoData = requestsToMakeGrouped[hashKey].videos[video.id]
|
|
|
|
switch (request.type) {
|
|
case constants.REQUEST_VIDEO_QADU_TYPES.LIKES:
|
|
videoData.likes = video.likes
|
|
break
|
|
|
|
case constants.REQUEST_VIDEO_QADU_TYPES.DISLIKES:
|
|
videoData.likes = video.dislikes
|
|
break
|
|
|
|
case constants.REQUEST_VIDEO_QADU_TYPES.VIEWS:
|
|
videoData.views = video.views
|
|
break
|
|
|
|
default:
|
|
logger.error('Unknown request video QADU type %s.', request.type)
|
|
return
|
|
}
|
|
|
|
// Do not forget the remoteId so the remote pod can identify the video
|
|
videoData.remoteId = video.id
|
|
requestsToMakeGrouped[hashKey].ids.push(request.id)
|
|
requestsToMakeGrouped[hashKey].videos[video.id] = videoData
|
|
})
|
|
})
|
|
|
|
Object.keys(requestsToMakeGrouped).forEach(hashKey => {
|
|
Object.keys(requestsToMakeGrouped[hashKey].videos).forEach(videoId => {
|
|
const videoData = requestsToMakeGrouped[hashKey].videos[videoId]
|
|
|
|
requestsToMakeGrouped[hashKey].datas.push({
|
|
data: videoData
|
|
})
|
|
})
|
|
|
|
// We don't need it anymore, it was just to build our datas array
|
|
delete requestsToMakeGrouped[hashKey].videos
|
|
})
|
|
|
|
return requestsToMakeGrouped
|
|
}
|
|
|
|
// { type, videoId, transaction? }
|
|
createRequest (options, callback) {
|
|
const type = options.type
|
|
const videoId = options.videoId
|
|
const transaction = options.transaction
|
|
|
|
const dbRequestOptions = {}
|
|
if (transaction) dbRequestOptions.transaction = transaction
|
|
|
|
// Send the update to all our friends
|
|
db.Pod.listAllIds(options.transaction, function (err, podIds) {
|
|
if (err) return callback(err)
|
|
|
|
const queries = []
|
|
podIds.forEach(podId => {
|
|
queries.push({ type, videoId, podId })
|
|
})
|
|
|
|
return db.RequestVideoQadu.bulkCreate(queries, dbRequestOptions).asCallback(callback)
|
|
})
|
|
}
|
|
}
|