UNPKG

als-mongo-list

Version:

A flexible, lightweight MongoDB query utility for Node.js applications. Simplifies database operations with intuitive filtering, pagination, sorting, and field selection. Ideal for REST API endpoints, providing a primary List class that abstracts complex

58 lines (51 loc) 2.06 kB
const { isValidObjectId, Types: { ObjectId } } = require('mongoose'); const { date } = require('./date') const { number } = require('./number') const buildSearch = require('./search') class Filter { constructor(listObj) { this.validators = {} this.inputs = {} this.getKeys(listObj) } getKeys({ tree, searchKeys }) { if (searchKeys.size === 0) return const searchFields = [] Array.from(searchKeys).map(key => { const obj = Array.isArray(tree[key]) ? tree[key][0] : tree[key] return typeof obj === 'function' ? { key, type: obj } : { ...obj, key } }) .filter(item => item && item.type && item.type.name) .filter(item => item.type === String && item.enum === undefined ? searchFields.push(item) > 1000 : true) // push > 1000 should return false and filter strings .forEach(item => { this.validators[item.key] = this[item.type.name](item.key, item) }); buildSearch(searchFields,this) } String(key, item) { this.inputs[key] = { tag: 'select', name: key, options: item.enum.map(k => ({ value: k, text: k })) } return (v, search) => { if (item.enum.includes(v)) search[key] = v } } ObjectId(key, item) { this.inputs[key] = { tag: 'input', type: 'text', name: key } return (v, search) => { if (isValidObjectId(v)) search[key] = new ObjectId(v) } } Boolean(key, item) { this.inputs[key] = { tag: 'select', name: key, options:[ {value:'',text:'all'}, {value:'true',text:'true'}, {value:'false',text:'false'}, ]} return (v, search) => { if(v) search[key] = v === 'false' ? false : Boolean(v) } } Number(key, item) { number(key, item, this) } Date(key, item) { date(key, item, this) } getSearch(query = {}, search = {}) { for (const key in query) { if (this.validators[key]) this.validators[key](query[key], search,query) } return search } } module.exports = Filter