@apihawk/billia-sdk
Version:
The ApiHawk Billia SDK
93 lines (92 loc) • 2.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
class QueryBuilder {
/**
* Parses a pagination query into a Billia Query Builder object.
*
* Supported types of queries:
*
* - sort by
* - equal to
* - filter
* - between
* - search
*
* @param query pagination query
* @param options config
*/
parse(query, options) {
const q = {
page: query.page || 1,
page_size: query.page_size || 25,
where: []
};
// sort by
if (query.sort_by &&
query.sort_order &&
query.sort_order.match(/^(A|DE)SC$/)) {
q.order = [{ field: query.sort_by, sort: query.sort_order }];
}
// equal to
if (query.equalTo) {
const equalTo = query.equalTo || {};
Object.keys(equalTo).forEach((field) => {
q.where.push({
field: `${field}`,
where: 'and',
type: 'equalTo',
value: equalTo[field]
});
});
}
// filter
if (query.filter) {
const f = query.filter || {};
Object.keys(f).forEach((field) => {
if (Array.isArray(f[field]) && f[field].length > 0) {
q.where.push({
field,
where: 'and',
type: 'in',
values: f[field]
});
}
});
}
// between
if (query.between) {
const between = query.between || {};
Object.keys(between).forEach((field) => {
q.where.push({
field,
where: 'and',
type: 'greaterThanOrEqualTo',
value: between[field].min
}, {
field,
where: 'and',
type: 'lessThanOrEqualTo',
value: between[field].max
});
});
}
// search
if (query.search) {
const search = query.search || {};
Object.keys(search).forEach((field) => {
q.where.push({
field,
where: 'and',
type: 'like',
value: `%${search[field]}%`
});
});
}
if (q.where.length === 0) {
delete q.where;
}
return q;
}
}
exports.QueryBuilder = QueryBuilder;
exports.default = new QueryBuilder();