2 Request Video for Quick And Dirty Updates like:
7 We can't put it in the same system than basic requests for efficiency.
8 Moreover we don't want to slow down the basic requests with a lot of views/likes/dislikes requests.
9 So we put it an independant request scheduler.
12 import { values } from 'lodash'
13 import * as Sequelize from 'sequelize'
15 import { database as db } from '../initializers/database'
16 import { REQUEST_VIDEO_QADU_TYPES } from '../initializers'
17 import { addMethodsToModel } from './utils'
19 RequestVideoQaduClass,
20 RequestVideoQaduInstance,
21 RequestVideoQaduAttributes,
23 RequestVideoQaduMethods
24 } from './request-video-qadu-interface'
26 let RequestVideoQadu: Sequelize.Model<RequestVideoQaduInstance, RequestVideoQaduAttributes>
27 let countTotalRequests: RequestVideoQaduMethods.CountTotalRequests
28 let listWithLimitAndRandom: RequestVideoQaduMethods.ListWithLimitAndRandom
29 let removeByRequestIdsAndPod: RequestVideoQaduMethods.RemoveByRequestIdsAndPod
30 let removeAll: RequestVideoQaduMethods.RemoveAll
32 export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
33 RequestVideoQadu = sequelize.define<RequestVideoQaduInstance, RequestVideoQaduAttributes>('RequestVideoQadu',
36 type: DataTypes.ENUM(values(REQUEST_VIDEO_QADU_TYPES)),
53 const classMethods = [
56 listWithLimitAndRandom,
59 removeByRequestIdsAndPod
61 addMethodsToModel(RequestVideoQadu, classMethods)
63 return RequestVideoQadu
66 // ------------------------------ STATICS ------------------------------
68 function associate (models) {
69 RequestVideoQadu.belongsTo(models.Pod, {
77 RequestVideoQadu.belongsTo(models.Video, {
86 countTotalRequests = function (callback: RequestVideoQaduMethods.CountTotalRequestsCallback) {
88 return RequestVideoQadu.count(query).asCallback(callback)
91 listWithLimitAndRandom = function (limitPods: number, limitRequestsPerPod: number, callback: RequestVideoQaduMethods.ListWithLimitAndRandomCallback) {
95 Pod.listRandomPodIdsWithRequest(limitPods, 'RequestVideoQadus', tableJoin, function (err, podIds) {
96 if (err) return callback(err)
98 // We don't have friends that have requests
99 if (podIds.length === 0) return callback(null, [])
104 model: RequestVideoQadu['sequelize'].models.Pod,
112 model: RequestVideoQadu['sequelize'].models.Video
117 RequestVideoQadu.findAll(query).asCallback(function (err, requests) {
118 if (err) return callback(err)
120 const requestsGrouped = groupAndTruncateRequests(requests, limitRequestsPerPod)
121 return callback(err, requestsGrouped)
126 removeByRequestIdsAndPod = function (ids: number[], podId: number, callback: RequestVideoQaduMethods.RemoveByRequestIdsAndPodCallback) {
136 RequestVideoQadu.destroy(query).asCallback(callback)
139 removeAll = function (callback: RequestVideoQaduMethods.RemoveAllCallback) {
140 // Delete all requests
141 RequestVideoQadu.truncate({ cascade: true }).asCallback(callback)
144 // ---------------------------------------------------------------------------
146 function groupAndTruncateRequests (requests: RequestVideoQaduInstance[], limitRequestsPerPod: number) {
147 const requestsGrouped = {}
149 requests.forEach(function (request) {
150 const pod = request.Pod
152 if (!requestsGrouped[pod.id]) requestsGrouped[pod.id] = []
154 if (requestsGrouped[pod.id].length < limitRequestsPerPod) {
155 requestsGrouped[pod.id].push({
157 video: request.Video,
163 return requestsGrouped