]>
Commit | Line | Data |
---|---|---|
1 | import { values } from 'lodash' | |
2 | import * as Sequelize from 'sequelize' | |
3 | ||
4 | import { database as db } from '../../initializers/database' | |
5 | import { REQUEST_ENDPOINTS } from '../../initializers' | |
6 | import { addMethodsToModel } from '../utils' | |
7 | import { | |
8 | RequestInstance, | |
9 | RequestAttributes, | |
10 | ||
11 | RequestMethods, | |
12 | RequestsGrouped | |
13 | } from './request-interface' | |
14 | ||
15 | let Request: Sequelize.Model<RequestInstance, RequestAttributes> | |
16 | let countTotalRequests: RequestMethods.CountTotalRequests | |
17 | let listWithLimitAndRandom: RequestMethods.ListWithLimitAndRandom | |
18 | let removeWithEmptyTo: RequestMethods.RemoveWithEmptyTo | |
19 | let removeAll: RequestMethods.RemoveAll | |
20 | ||
21 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { | |
22 | Request = sequelize.define<RequestInstance, RequestAttributes>('Request', | |
23 | { | |
24 | request: { | |
25 | type: DataTypes.JSON, | |
26 | allowNull: false | |
27 | }, | |
28 | endpoint: { | |
29 | type: DataTypes.ENUM(values(REQUEST_ENDPOINTS)), | |
30 | allowNull: false | |
31 | } | |
32 | } | |
33 | ) | |
34 | ||
35 | const classMethods = [ | |
36 | associate, | |
37 | ||
38 | listWithLimitAndRandom, | |
39 | ||
40 | countTotalRequests, | |
41 | removeAll, | |
42 | removeWithEmptyTo | |
43 | ] | |
44 | addMethodsToModel(Request, classMethods) | |
45 | ||
46 | return Request | |
47 | } | |
48 | ||
49 | // ------------------------------ STATICS ------------------------------ | |
50 | ||
51 | function associate (models) { | |
52 | Request.belongsToMany(models.Pod, { | |
53 | foreignKey: { | |
54 | name: 'requestId', | |
55 | allowNull: false | |
56 | }, | |
57 | through: models.RequestToPod, | |
58 | onDelete: 'CASCADE' | |
59 | }) | |
60 | } | |
61 | ||
62 | countTotalRequests = function () { | |
63 | // We need to include Pod because there are no cascade delete when a pod is removed | |
64 | // So we could count requests that do not have existing pod anymore | |
65 | const query = { | |
66 | include: [ Request['sequelize'].models.Pod ] | |
67 | } | |
68 | ||
69 | return Request.count(query) | |
70 | } | |
71 | ||
72 | listWithLimitAndRandom = function (limitPods: number, limitRequestsPerPod: number) { | |
73 | const Pod = db.Pod | |
74 | const tableJoin = '' | |
75 | ||
76 | return Pod.listRandomPodIdsWithRequest(limitPods, 'RequestToPods', tableJoin).then(podIds => { | |
77 | // We don't have friends that have requests | |
78 | if (podIds.length === 0) return [] | |
79 | ||
80 | // The first x requests of these pods | |
81 | // It is very important to sort by id ASC to keep the requests order! | |
82 | const query = { | |
83 | order: [ | |
84 | [ 'id', 'ASC' ] | |
85 | ], | |
86 | include: [ | |
87 | { | |
88 | model: Request['sequelize'].models.Pod, | |
89 | where: { | |
90 | id: { | |
91 | $in: podIds | |
92 | } | |
93 | } | |
94 | } | |
95 | ] | |
96 | } | |
97 | ||
98 | return Request.findAll(query).then(requests => { | |
99 | ||
100 | const requestsGrouped = groupAndTruncateRequests(requests, limitRequestsPerPod) | |
101 | return requestsGrouped | |
102 | }) | |
103 | }) | |
104 | } | |
105 | ||
106 | removeAll = function () { | |
107 | // Delete all requests | |
108 | return Request.truncate({ cascade: true }) | |
109 | } | |
110 | ||
111 | removeWithEmptyTo = function () { | |
112 | const query = { | |
113 | where: { | |
114 | id: { | |
115 | $notIn: [ | |
116 | Sequelize.literal('SELECT "requestId" FROM "RequestToPods"') | |
117 | ] | |
118 | } | |
119 | } | |
120 | } | |
121 | ||
122 | return Request.destroy(query) | |
123 | } | |
124 | ||
125 | // --------------------------------------------------------------------------- | |
126 | ||
127 | function groupAndTruncateRequests (requests: RequestInstance[], limitRequestsPerPod: number) { | |
128 | const requestsGrouped: RequestsGrouped = {} | |
129 | ||
130 | requests.forEach(function (request) { | |
131 | request.Pods.forEach(function (pod) { | |
132 | if (!requestsGrouped[pod.id]) requestsGrouped[pod.id] = [] | |
133 | ||
134 | if (requestsGrouped[pod.id].length < limitRequestsPerPod) { | |
135 | requestsGrouped[pod.id].push({ | |
136 | request, | |
137 | pod | |
138 | }) | |
139 | } | |
140 | }) | |
141 | }) | |
142 | ||
143 | return requestsGrouped | |
144 | } |