-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathInvenioRecordsResourcesRequestSerializer.js
More file actions
106 lines (96 loc) · 2.76 KB
/
Copy pathInvenioRecordsResourcesRequestSerializer.js
File metadata and controls
106 lines (96 loc) · 2.76 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
103
104
105
106
/*
* SPDX-FileCopyrightText: 2021 CERN.
* SPDX-License-Identifier: MIT
*/
import Qs from "qs";
import _extend from "lodash/extend";
import _isEmpty from "lodash/isEmpty";
/** Default backend request serializer for invenio-records-resources */
export class InvenioRecordsResourcesRequestSerializer {
constructor() {
this.serialize = this.serialize.bind(this);
}
_checkFilter = (filter) => {
if (!Array.isArray(filter)) {
throw new Error(`Filter value "${filter}" in query state must be an array.`);
}
if (!(filter.length === 2 || filter.length === 3)) {
throw new Error(
`Filter value "${filter}" in query state must be an array of 2 or 3 elements`
);
}
};
_addFilter = (filter, filterUrlParams) => {
this._checkFilter(filter);
const aggName = filter[0];
const fieldValue = filter[1];
const hasChild = filter.length === 3;
if (hasChild) {
this._checkFilter(filter[2]);
}
if (aggName in filterUrlParams) {
if (hasChild) {
filterUrlParams[aggName].push(fieldValue + "::" + filter[2][1]);
} else {
filterUrlParams[aggName].push(fieldValue);
}
} else {
if (hasChild) {
filterUrlParams[aggName] = [fieldValue + "::" + filter[2][1]];
} else {
filterUrlParams[aggName] = [fieldValue];
}
}
};
_addFilters = (filters) => {
if (!Array.isArray(filters)) {
throw new Error(`Filters query state "${filters}" must be an array.`);
}
/**
* input: [
* [ 'type_agg', 'value1' ]
* [ 'type_agg', 'value2', [ 'subtype_agg', 'a value' ] ]
* ]
*/
const filterUrlParams = {};
filters.forEach((filter) => {
this._addFilter(filter, filterUrlParams);
});
/**
* output: {
* type_agg: ['value1', 'value2::a value']
* }
*/
return filterUrlParams;
};
/**
* Return a serialized version of the app state `query` for the API backend.
* @param {object} stateQuery the `query` state to serialize
*/
serialize(stateQuery) {
const { queryString, sortBy, sortOrder, page, size, filters, hiddenParams } =
stateQuery;
let getParams = {};
if (queryString !== null) {
getParams["q"] = queryString;
}
if (sortBy !== null) {
getParams["sort"] = sortBy;
if (sortOrder !== null) {
getParams["sort"] = sortOrder === "desc" ? `-${sortBy}` : sortBy;
}
}
if (page > 0) {
getParams["page"] = page;
}
if (size > 0) {
getParams["size"] = size;
}
if (!_isEmpty(hiddenParams)) {
_extend(getParams, this._addFilters(hiddenParams));
}
const filterParams = this._addFilters(filters);
_extend(getParams, filterParams);
return Qs.stringify(getParams, { arrayFormat: "repeat" });
}
}