-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.js
More file actions
102 lines (90 loc) · 2.92 KB
/
builder.js
File metadata and controls
102 lines (90 loc) · 2.92 KB
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
const builder = (() => {
/**
* Prop: default options for request query string will go here
*/
this.defaults = {};
/**
* Select fields builder for list request
*
* @param {object} query request query object for select fields
* @return {object} query with select fields string
*/
this.select = (query) => {
// check & set select fields with no secret fields
if (query.select && query.select !== '*') {
// change the key separator from comma(,) to space( )
query.select = (`${query.select} ${this.defaults.select || ''}`).replace(/,/g, ' ').trim();
} else {
query.select = (this.defaults.select || '').replace(/,/g, ' ').trim();
}
return this;
};
/**
* Filter fields builder for list request
*
* @param {object} query request query object for select fields
* @return {object} query with filter fields object
*/
this.filter = (query) => {
// check or define object for filter
query.filter = Object.assign((this.defaults.filter || {}), (query.filter || {}));
return this;
};
/**
* With ref schema populate fields for list request
*
* @param {object} query request query object for select fields
* @return {object} query with filter fields object
*/
this.with = (query) => {
// define the populates array in with fields
query.populates = [];
Object.keys(query.with || {}).forEach((path) => {
const select = query.with[path].split(',').join(' ');
query.populates.push({ path, select });
});
return this;
};
/**
* With ref schema deep populate fields for list request
*
* @param {object} query request query object for select fields
* @return {object} query with filter fields object
*/
this.deep = (query) => {
// define the populates array in deep fields
query.deepPopulates = [];
Object.keys(query.deep || {}).forEach((path) => {
const model = Object.keys(query.deep[path]).shift();
const select = query.deep[path][model].split(',').join(' ');
query.deepPopulates.push({ path, select, model });
});
return this;
};
/**
* Set skip & limit values for list request
*
* @param {object} query request query object to set limit
* @return {object} return the param query with skip & limit set
*/
this.limit = (query) => {
// check & set the page
query.skip = (query.skip) ? parseInt(query.skip, 10) : this.defaults.skip || 0;
// check & set the limit query
query.limit = (query.limit) ? parseInt(query.limit, 10) : this.defaults.limit || 0;
return this;
};
/**
* Set Sort "order" for list request
*
* @param {object} query request query object to set sort order
* @return {Object} return the param query with sort values
*/
this.sort = (query) => {
// check sort set in query
query.sort = (query.sort) ? query.sort : this.defaults.sort || {};
return this;
};
return this;
})();
module.exports = builder;