-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
142 lines (131 loc) · 4.34 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
var _ = require("lodash");
/**
* find an item through an array of object
* @param {array<any>} array array of object to filter
* @param {string} searchField field or attribute to search
* @param {any} value value to use to compare the predicate field value
* @param {any} returnField field to be return if item is found
* @returns {any}
*/
const finder = (array, searchField, value, returnField) => {
return (returnField !== null) | undefined
? _.find(array, (e) => e[String(searchField)] == String(value))?.[
String(returnField)
]
: _.find(array, (e) => e[String(searchField)] == String(value));
};
/**
* handle queries object passed in the body or query and return it
* @param {any} req reauest object
* @param {array<[key:string], value:any>} models Sequelize models map as [{key: ModelName, value: ModelObject}]
* @returns {any}
*/
const handleQuery = (req, models) => {
// handle properly query in the request query object
const __query =
typeof req.query?._query == "string"
? JSON.parse(req.query?._query)
: { ...req.query?._query };
// merge body & query object
const globalRequest = _.merge(req.body?._query, __query);
let query = {};
// in the body
// handle attributes clause
query.attributes = globalRequest?.attributes || { exclude: [] };
// handle where clause
query.where = globalRequest?.where || [];
// handle order clause
query.order = globalRequest?.order || [];
// handle pagination
if (req.query?.page && req.query?.pageSize) {
const page = parseInt(req.query?.page) || 1;
const pageSize = parseInt(req.query?.pageSize) || 10;
query.limit = pageSize;
query.offset = (page - 1) * pageSize;
}
// handle include & nested includes
if (globalRequest?.include && models && Array.isArray(models)) {
// 1st level
const globalRequestInclude = globalRequest?.include;
if (Array.isArray(globalRequestInclude)) {
globalRequestInclude?.map(async (firstLevelItem) => {
if (
firstLevelItem?.model &&
finder(models, "key", firstLevelItem?.model, "value")
) {
firstLevelItem.model = finder(
models,
"key",
firstLevelItem?.model,
"value"
);
}
// 2nd level
if (firstLevelItem?.include && Array.isArray(firstLevelItem?.include)) {
const seconLevelItems = firstLevelItem?.include;
seconLevelItems?.map((seconLevelItem) => {
if (
seconLevelItem?.model &&
finder(models, "key", seconLevelItem?.model, "value")
) {
seconLevelItem.model = finder(
models,
"key",
seconLevelItem?.model,
"value"
);
}
// 3rd level
if (
seconLevelItem?.include &&
Array.isArray(seconLevelItem?.include)
) {
const thirdLevelItems = seconLevelItem?.include;
thirdLevelItems?.map((thirdLevelItem) => {
if (
thirdLevelItem?.model &&
finder(models, "key", thirdLevelItem?.model, "value")
) {
thirdLevelItem.model = finder(
models,
"key",
thirdLevelItem?.model,
"value"
);
}
// 4th level
if (
thirdLevelItem?.include &&
Array.isArray(thirdLevelItem?.model)
) {
const fourthLevelItems = thirdLevelItem?.include;
fourthLevelItems.map((fourthLevelItem) => {
if (
fourthLevelItem?.model &&
finder(models, "key", fourthLevelItem?.model, "value")
) {
fourthLevelItem.model = finder(
models,
"key",
fourthLevelItem?.model,
"value"
);
}
});
}
});
}
});
}
});
}
query.include = globalRequestInclude;
} else {
query.include = [];
}
return query;
};
module.exports = {
finder,
handleQuery,
};