FilterService.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. const express = require('express');
  2. const Module = require('../../base/Module');
  3. const RepositorySystem = require('../../systems/RepositorySystem');
  4. const RoutingSystem = require('../../systems/RoutingSystem');
  5. const FilterTypes = {}
  6. class FilterService {
  7. constructor(){
  8. this.FilterTypes = FilterTypes;
  9. }
  10. }
  11. FilterService.buildQuery = function(query,filter) {
  12. switch(filter['type']){
  13. case 'onetoone':
  14. return query.where((builder) =>
  15. (filter['options'] || []).reduce((res, opt) => {
  16. return res.orWhere(filter['field'], opt);
  17. }, builder)
  18. );
  19. case 'manytomany':
  20. return query.where((builder) =>
  21. (filter['options'] || []).reduce((res, opt) => {
  22. return res.where(filter['field'], 'like', '%' + opt + '%');
  23. }, builder)
  24. );
  25. case 'includes':
  26. return query.whereIn(filter['field'],filter['options'])
  27. case 'equals':
  28. return query.where(filter['field'],filter['options'])
  29. case 'search':
  30. return query.where((builder) =>
  31. (filter['field'].split(',')).reduce((res, field) => {
  32. // return res.orWhere(field, 'like', '%' + filter['options'][0] + '%');
  33. return res.orWhere((sbuilder) =>
  34. (filter['options'][0].split(' ')).reduce((res, opt) => {
  35. return res.where(field, 'like', '%' + opt + '%');
  36. }, sbuilder));
  37. }, builder)
  38. );
  39. return query.where(filter['field'], 'like', '%' + filter['options'] + '%');
  40. case 'less':
  41. return query.where(filter['field'], '<', filter['options']);
  42. case 'more':
  43. return query.where(filter['field'], '>', filter['options']);
  44. case 'ascending':
  45. return query.orderBy(filter['field'],'asc')
  46. case 'descending':
  47. return query.orderBy(filter['field'],'desc')
  48. case 'value_range':
  49. return query.whereBetween(filter['field'],filter['options'])
  50. case 'raw':
  51. break; // RAW SQL - Injection
  52. // return query.whereRaw(filter['options'])
  53. default: return query;
  54. }
  55. }
  56. //array of filters that coming from front-end (can be one also)
  57. FilterService.parseFilters = (query, filters = []) => {
  58. filters.forEach((filter, index) => {
  59. query = FilterService.buildQuery(query, filter);
  60. });
  61. // console.log(query.toString()); // debug query
  62. return query;
  63. }
  64. FilterService.Middleware = (req, res, next) => {
  65. if(req.query.filters){
  66. let filters = JSON.parse(req.query.filters)
  67. req.filters = filters.map((filter) => {
  68. switch(filter.type){
  69. case 'select':
  70. case 'exact':
  71. filter.type = 'includes';
  72. return filter;
  73. case 'range':
  74. filter.type = 'value_range';
  75. return filter;
  76. default:
  77. return filter;
  78. }
  79. })
  80. req.filters.push({
  81. type: 'equals',
  82. field: 'deleted',
  83. options: false
  84. });
  85. }
  86. next();
  87. }
  88. module.exports = FilterService;