]>
Commit | Line | Data |
---|---|---|
69818c93 C |
1 | import * as Sequelize from 'sequelize' |
2 | ||
e02643f3 | 3 | import { database as db } from '../../initializers/database' |
15a30294 | 4 | import { AbstractRequestScheduler } 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' | |
ee9e7b61 | 8 | import { RequestEndpoint } 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 | ||
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 | ||
103 | export { | |
104 | RequestScheduler | |
105 | } |