UNPKG

3.05 kBJavaScriptView Raw
1"use strict";
2
3
4function parseFieldValues(output, searchField, field, values)
5{
6 for (let value of values)
7 {
8 if (searchField.filters && searchField.filters.length > 0)
9 {
10 let filter = searchField.filters[0];
11
12 if (value.match(/^[a-z0-9]+:/))
13 {
14 let index = value.indexOf(':');
15
16 filter = value.substr(0, index);
17 if (searchField.filters.indexOf(filter) === -1)
18 {
19 filter = searchField.filters[0];
20 }
21 else
22 {
23 value = value.substr(index + 1);
24 }
25 }
26 if (filter !== 'regex')
27 {
28 value = value.split('|');
29 }
30 else
31 {
32 value = [value];
33 }
34 if (searchField.enum)
35 {
36 value = value.filter((v) => v.length > 0 && searchField.enum.indexOf(v) !== -1);
37 }
38 output.filter.push({
39 field: searchField.searchField || field,
40 filter,
41 value
42 });
43 }
44 }
45}
46
47function getDefaultOutput(searchMetadata)
48{
49 return {
50 offset: 0,
51 limit: searchMetadata && searchMetadata.limit && searchMetadata.limit.default ? searchMetadata.limit.default : 20,
52 filter: [],
53 sort: false,
54 order: 'asc',
55 extra: [],
56 returnFacets: false
57 };
58}
59
60/**
61 * Validate and parse Request.query against what is acceptable from a SearchMetadata specification
62 *
63 * @param {SearchMetadata} searchMetadata
64 * @param {Query} query
65 * @return {ParsedQuery} will validated and parsed query filters
66 */
67function parse(searchMetadata, query)
68{
69 let output = getDefaultOutput(searchMetadata);
70 // process query fields
71
72 Object.keys(query)
73 .sort()
74 .forEach((field) =>
75 {
76 // filters
77 if (searchMetadata.fields)
78 {
79 let searchField = searchMetadata.fields && searchMetadata.fields[field];
80
81 if (searchField)
82 {
83 let values = query[field];
84
85 if (!Array.isArray(values))
86 {
87 values = [values];
88 }
89 parseFieldValues(output, searchField, field, values);
90 }
91 }
92 // paging
93 if (field === 'offset')
94 {
95 console.log();
96 output.offset = Math.max(0, parseInt(query.offset));
97 }
98 else if (field === 'limit' && searchMetadata.limit)
99 {
100 output.limit = Math.max(searchMetadata.limit.minimum, Math.min(searchMetadata.limit.maximum, parseInt(query.limit)));
101 }
102 // sorting
103 else if (field === 'sort')
104 {
105 if (searchMetadata.sort && searchMetadata.sort.indexOf(query.sort) !== -1)
106 {
107 output.sort = query.sort;
108 }
109 }
110 else if (field === 'order')
111 {
112 output.order = query.order.substr(0, 1) !== 'd' ? 'asc' : 'dsc';
113 }
114 // facets and extra columns
115 else if (field === 'extra')
116 {
117 output.extra = query.extra.split(/\|/g)
118 .filter((x) => x);
119 }
120 else if (field === 'facets' && searchMetadata.facets)
121 {
122 output.returnFacets = true;
123 }
124 });
125
126 return output;
127}
128
129module.exports = parse;