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
JavaScript
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