mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 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_PER_POD
 | 
						|
 | 
						|
    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_VIDEO_QADU_ENDPOINT,
 | 
						|
            ids: [], // request ids, to delete them from the DB in the future
 | 
						|
            datas: [], // requests data
 | 
						|
            videos: {}
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        // Maybe another attribute was filled for this video
 | 
						|
        let videoData = requestsToMakeGrouped[hashKey].videos[video.id]
 | 
						|
        if (!videoData) videoData = {}
 | 
						|
 | 
						|
        switch (request.type) {
 | 
						|
          case constants.REQUEST_VIDEO_QADU_TYPES.LIKES:
 | 
						|
            videoData.likes = video.likes
 | 
						|
            break
 | 
						|
 | 
						|
          case constants.REQUEST_VIDEO_QADU_TYPES.DISLIKES:
 | 
						|
            videoData.dislikes = 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)
 | 
						|
 | 
						|
        // Maybe there are multiple quick and dirty update for the same video
 | 
						|
        // We use this hashmap to dedupe them
 | 
						|
        requestsToMakeGrouped[hashKey].videos[video.id] = videoData
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    // Now we deduped similar quick and dirty updates, we can build our requests datas
 | 
						|
    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)
 | 
						|
    })
 | 
						|
  }
 | 
						|
}
 |