]>
Commit | Line | Data |
---|---|---|
69818c93 C |
1 | import * as Sequelize from 'sequelize' |
2 | ||
e02643f3 | 3 | import { database as db } from '../../initializers/database' |
4771e000 | 4 | import { AbstractRequestScheduler, RequestsObjects } from './abstract-request-scheduler' |
65fcc311 | 5 | import { logger } from '../../helpers' |
6fcd19ba C |
6 | import { REQUESTS_LIMIT_PODS, REQUESTS_LIMIT_PER_POD } from '../../initializers' |
7 | import { RequestsGrouped } from '../../models' | |
4771e000 | 8 | import { RequestEndpoint, RemoteVideoRequest } from '../../../shared' |
65fcc311 | 9 | |
69818c93 C |
10 | export type RequestSchedulerOptions = { |
11 | type: string | |
ee9e7b61 | 12 | endpoint: RequestEndpoint |
69818c93 C |
13 | data: Object |
14 | toIds: number[] | |
15 | transaction: Sequelize.Transaction | |
16 | } | |
17 | ||
6fcd19ba | 18 | class 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 | ||
4771e000 C |
37 | buildRequestsObjects (requestsGrouped: RequestsGrouped) { |
38 | const requestsToMakeGrouped: RequestsObjects<RemoteVideoRequest> = {} | |
9e167724 | 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) { |
c1a7ab7f | 64 | // If there are no destination pods abort |
6fcd19ba | 65 | if (toIds.length === 0) return undefined |
c1a7ab7f | 66 | |
c1a7ab7f C |
67 | const createQuery = { |
68 | endpoint, | |
69 | request: { | |
70 | type: type, | |
71 | data: data | |
72 | } | |
73 | } | |
74 | ||
69818c93 | 75 | const dbRequestOptions: Sequelize.CreateOptions = { |
c1a7ab7f C |
76 | transaction |
77 | } | |
78 | ||
6fcd19ba C |
79 | return db.Request.create(createQuery, dbRequestOptions) |
80 | .then(request => { | |
709756b8 | 81 | return request.setPods(toIds, dbRequestOptions) |
6fcd19ba | 82 | }) |
c1a7ab7f C |
83 | } |
84 | ||
85 | // --------------------------------------------------------------------------- | |
86 | ||
9e167724 C |
87 | afterRequestsHook () { |
88 | // Flush requests with no pod | |
6fcd19ba | 89 | this.getRequestModel().removeWithEmptyTo() |
ad0997ad | 90 | .catch(err => logger.error('Error when removing requests with no pods.', err)) |
c1a7ab7f C |
91 | } |
92 | } | |
65fcc311 C |
93 | |
94 | // --------------------------------------------------------------------------- | |
95 | ||
96 | export { | |
97 | RequestScheduler | |
98 | } |