]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/models/request-video-qadu.ts
Type models
[github/Chocobozzz/PeerTube.git] / server / models / request-video-qadu.ts
CommitLineData
9e167724
C
1/*
2 Request Video for Quick And Dirty Updates like:
3 - views
4 - likes
5 - dislikes
6
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.
10*/
11
65fcc311 12import { values } from 'lodash'
e02643f3 13import * as Sequelize from 'sequelize'
9e167724 14
65fcc311 15import { REQUEST_VIDEO_QADU_TYPES } from '../initializers'
9e167724 16
e02643f3
C
17import { addMethodsToModel } from './utils'
18import {
19 RequestVideoQaduClass,
20 RequestVideoQaduInstance,
21 RequestVideoQaduAttributes,
22
23 RequestVideoQaduMethods
24} from './request-video-qadu-interface'
25
26let RequestVideoQadu: Sequelize.Model<RequestVideoQaduInstance, RequestVideoQaduAttributes>
27let countTotalRequests: RequestVideoQaduMethods.CountTotalRequests
28let listWithLimitAndRandom: RequestVideoQaduMethods.ListWithLimitAndRandom
29let removeByRequestIdsAndPod: RequestVideoQaduMethods.RemoveByRequestIdsAndPod
30let removeAll: RequestVideoQaduMethods.RemoveAll
9e167724 31
e02643f3
C
32export default function (sequelize, DataTypes) {
33 RequestVideoQadu = sequelize.define('RequestVideoQadu',
9e167724
C
34 {
35 type: {
65fcc311 36 type: DataTypes.ENUM(values(REQUEST_VIDEO_QADU_TYPES)),
9e167724
C
37 allowNull: false
38 }
39 },
40 {
41 timestamps: false,
42 indexes: [
43 {
44 fields: [ 'podId' ]
45 },
46 {
47 fields: [ 'videoId' ]
48 }
e02643f3 49 ]
9e167724
C
50 }
51 )
52
e02643f3
C
53 const classMethods = [
54 associate,
55
56 listWithLimitAndRandom,
57 countTotalRequests,
58 removeAll,
59 removeByRequestIdsAndPod
60 ]
61 addMethodsToModel(RequestVideoQadu, classMethods)
62
9e167724
C
63 return RequestVideoQadu
64}
65
66// ------------------------------ STATICS ------------------------------
67
68function associate (models) {
e02643f3 69 RequestVideoQadu.belongsTo(models.Pod, {
9e167724
C
70 foreignKey: {
71 name: 'podId',
72 allowNull: false
73 },
74 onDelete: 'CASCADE'
75 })
76
e02643f3 77 RequestVideoQadu.belongsTo(models.Video, {
9e167724
C
78 foreignKey: {
79 name: 'videoId',
80 allowNull: false
81 },
82 onDelete: 'CASCADE'
83 })
84}
85
e02643f3 86countTotalRequests = function (callback) {
e4c87ec2 87 const query = {}
e02643f3 88 return RequestVideoQadu.count(query).asCallback(callback)
9e167724
C
89}
90
e02643f3
C
91listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) {
92 const Pod = RequestVideoQadu['sequelize'].models.Pod
9e167724
C
93
94 Pod.listRandomPodIdsWithRequest(limitPods, 'RequestVideoQadus', function (err, podIds) {
95 if (err) return callback(err)
96
97 // We don't have friends that have requests
98 if (podIds.length === 0) return callback(null, [])
99
100 const query = {
101 include: [
102 {
e02643f3 103 model: RequestVideoQadu['sequelize'].models.Pod,
9e167724
C
104 where: {
105 id: {
106 $in: podIds
107 }
108 }
109 },
110 {
e02643f3 111 model: RequestVideoQadu['sequelize'].models.Video
9e167724
C
112 }
113 ]
114 }
115
e02643f3 116 RequestVideoQadu.findAll(query).asCallback(function (err, requests) {
9e167724
C
117 if (err) return callback(err)
118
119 const requestsGrouped = groupAndTruncateRequests(requests, limitRequestsPerPod)
120 return callback(err, requestsGrouped)
121 })
122 })
123}
124
e02643f3 125removeByRequestIdsAndPod = function (ids, podId, callback) {
9e167724
C
126 const query = {
127 where: {
128 id: {
129 $in: ids
130 },
131 podId
132 }
133 }
134
e02643f3 135 RequestVideoQadu.destroy(query).asCallback(callback)
9e167724
C
136}
137
e02643f3 138removeAll = function (callback) {
9e167724 139 // Delete all requests
e02643f3 140 RequestVideoQadu.truncate({ cascade: true }).asCallback(callback)
9e167724
C
141}
142
143// ---------------------------------------------------------------------------
144
145function groupAndTruncateRequests (requests, limitRequestsPerPod) {
146 const requestsGrouped = {}
147
148 requests.forEach(function (request) {
149 const pod = request.Pod
150
151 if (!requestsGrouped[pod.id]) requestsGrouped[pod.id] = []
152
153 if (requestsGrouped[pod.id].length < limitRequestsPerPod) {
154 requestsGrouped[pod.id].push({
155 request: request,
156 video: request.Video,
157 pod
158 })
159 }
160 })
161
162 return requestsGrouped
163}