123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- 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;
|