UNPKG

@truepic/queryql

Version:

Easily add filtering, sorting, and pagination to your REST API through your old friend: the query string!

67 lines (53 loc) 1.32 kB
const is = require('is') class Schema { constructor() { this.filters = new Map() this.sorts = new Map() this.page(false) } filter(name, operatorOrOperators, options = {}) { const operators = Array.isArray(operatorOrOperators) ? operatorOrOperators : [operatorOrOperators] for (const operator of operators) { this.filters.set(`${name}[${operator}]`, { name, operator, options, }) } return this } sort(name, options = {}) { this.sorts.set(name, { name, options, }) return this } page(isEnabledOrOptions = true) { if (is.bool(isEnabledOrOptions)) { this.pageOptions = { isEnabled: isEnabledOrOptions } } else { this.pageOptions = { ...isEnabledOrOptions, isEnabled: isEnabledOrOptions.isEnabled !== undefined ? isEnabledOrOptions.isEnabled : true, } } return this } mapFilterNamesToOperators() { const filters = Array.from(this.filters.values()) return filters.reduce((accumulator, filter) => { if (!accumulator[filter.name]) { accumulator[filter.name] = [] } accumulator[filter.name].push(filter.operator) return accumulator }, {}) } } module.exports = Schema