]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/request/request-scheduler.ts
Video search -> case insensitive
[github/Chocobozzz/PeerTube.git] / server / lib / request / request-scheduler.ts
CommitLineData
69818c93
C
1import * as Sequelize from 'sequelize'
2
e02643f3 3import { database as db } from '../../initializers/database'
15a30294 4import { AbstractRequestScheduler } from './abstract-request-scheduler'
65fcc311 5import { logger } from '../../helpers'
6fcd19ba
C
6import { REQUESTS_LIMIT_PODS, REQUESTS_LIMIT_PER_POD } from '../../initializers'
7import { RequestsGrouped } from '../../models'
ee9e7b61 8import { RequestEndpoint } from '../../../shared'
65fcc311 9
69818c93
C
10export type RequestSchedulerOptions = {
11 type: string
ee9e7b61 12 endpoint: RequestEndpoint
69818c93
C
13 data: Object
14 toIds: number[]
15 transaction: Sequelize.Transaction
16}
17
6fcd19ba 18class RequestScheduler extends AbstractRequestScheduler<RequestsGrouped> {
fe783f6b 19 constructor () {
9e167724 20 super()
c1a7ab7f 21
9e167724 22 // We limit the size of the requests
65fcc311
C
23 this.limitPods = REQUESTS_LIMIT_PODS
24 this.limitPerPod = REQUESTS_LIMIT_PER_POD
c1a7ab7f 25
9e167724 26 this.description = 'requests'
c1a7ab7f
C
27 }
28
9e167724
C
29 getRequestModel () {
30 return db.Request
c1a7ab7f
C
31 }
32
9e167724
C
33 getRequestToPodModel () {
34 return db.RequestToPod
c1a7ab7f
C
35 }
36
6fcd19ba 37 buildRequestObjects (requestsGrouped: RequestsGrouped) {
9e167724
C
38 const requestsToMakeGrouped = {}
39
6fcd19ba
C
40 Object.keys(requestsGrouped).forEach(toPodId => {
41 requestsGrouped[toPodId].forEach(data => {
9e167724
C
42 const request = data.request
43 const pod = data.pod
44 const hashKey = toPodId + request.endpoint
45
46 if (!requestsToMakeGrouped[hashKey]) {
47 requestsToMakeGrouped[hashKey] = {
48 toPod: pod,
49 endpoint: request.endpoint,
50 ids: [], // request ids, to delete them from the DB in the future
51 datas: [] // requests data,
52 }
53 }
54
55 requestsToMakeGrouped[hashKey].ids.push(request.id)
56 requestsToMakeGrouped[hashKey].datas.push(request.request)
57 })
58 })
c1a7ab7f 59
9e167724 60 return requestsToMakeGrouped
c1a7ab7f
C
61 }
62
6fcd19ba 63 createRequest ({ type, endpoint, data, toIds, transaction }: RequestSchedulerOptions) {
e02643f3
C
64 // TODO: check the setPods works
65 const podIds = []
c1a7ab7f
C
66
67 // If there are no destination pods abort
6fcd19ba 68 if (toIds.length === 0) return undefined
c1a7ab7f
C
69
70 toIds.forEach(toPod => {
e02643f3 71 podIds.push(toPod)
c1a7ab7f
C
72 })
73
74 const createQuery = {
75 endpoint,
76 request: {
77 type: type,
78 data: data
79 }
80 }
81
69818c93 82 const dbRequestOptions: Sequelize.CreateOptions = {
c1a7ab7f
C
83 transaction
84 }
85
6fcd19ba
C
86 return db.Request.create(createQuery, dbRequestOptions)
87 .then(request => {
88 return request.setPods(podIds, dbRequestOptions)
89 })
c1a7ab7f
C
90 }
91
92 // ---------------------------------------------------------------------------
93
9e167724
C
94 afterRequestsHook () {
95 // Flush requests with no pod
6fcd19ba
C
96 this.getRequestModel().removeWithEmptyTo()
97 .catch(err => logger.error('Error when removing requests with no pods.', { error: err }))
c1a7ab7f
C
98 }
99}
65fcc311
C
100
101// ---------------------------------------------------------------------------
102
103export {
104 RequestScheduler
105}