const express = require('express'); const Module = require('../../base/Module'); const RepositorySystem = require('../../systems/RepositorySystem'); const RoutingSystem = require('../../systems/RoutingSystem'); const FilterTypes = {} class FilterService { constructor(){ this.FilterTypes = FilterTypes; } } FilterService.buildQuery = function(query,filter) { switch(filter['type']){ case 'onetoone': return query.where((builder) => (filter['options'] || []).reduce((res, opt) => { return res.orWhere(filter['field'], opt); }, builder) ); case 'manytomany': return query.where((builder) => (filter['options'] || []).reduce((res, opt) => { return res.where(filter['field'], 'like', '%' + opt + '%'); }, builder) ); case 'includes': return query.whereIn(filter['field'],filter['options']) case 'equals': return query.where(filter['field'],filter['options']) case 'search': return query.where((builder) => (filter['field'].split(',')).reduce((res, field) => { // return res.orWhere(field, 'like', '%' + filter['options'][0] + '%'); return res.orWhere((sbuilder) => (filter['options'][0].split(' ')).reduce((res, opt) => { return res.where(field, 'like', '%' + opt + '%'); }, sbuilder)); }, builder) ); return query.where(filter['field'], 'like', '%' + filter['options'] + '%'); case 'less': return query.where(filter['field'], '<', filter['options']); case 'more': return query.where(filter['field'], '>', filter['options']); case 'ascending': return query.orderBy(filter['field'],'asc') case 'descending': return query.orderBy(filter['field'],'desc') case 'value_range': return query.whereBetween(filter['field'],filter['options']) case 'raw': break; // RAW SQL - Injection // return query.whereRaw(filter['options']) default: return query; } } //array of filters that coming from front-end (can be one also) FilterService.parseFilters = (query, filters = []) => { filters.forEach((filter, index) => { query = FilterService.buildQuery(query, filter); }); // console.log(query.toString()); // debug query return query; } FilterService.Middleware = (req, res, next) => { if(req.query.filters){ let filters = JSON.parse(req.query.filters) req.filters = filters.map((filter) => { switch(filter.type){ case 'select': case 'exact': filter.type = 'includes'; return filter; case 'range': filter.type = 'value_range'; return filter; default: return filter; } }) req.filters.push({ type: 'equals', field: 'deleted', options: false }); } next(); } module.exports = FilterService;