pagination.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. let _ = require('lodash');
  2. module.exports = function (default_sort, default_offset, default_limit, max_limit) {
  3. /**
  4. * This will setup the req query params with filtered data and defaults
  5. *
  6. * sort will be an array of fields and their direction
  7. * offset will be an int, defaulting to zero if no other default supplied
  8. * limit will be an int, defaulting to 50 if no other default supplied, and limited to the max if that was supplied
  9. *
  10. */
  11. return function (req, res, next) {
  12. req.query.offset = typeof req.query.limit === 'undefined' ? default_offset || 0 : parseInt(req.query.offset, 10);
  13. req.query.limit = typeof req.query.limit === 'undefined' ? default_limit || 50 : parseInt(req.query.limit, 10);
  14. if (max_limit && req.query.limit > max_limit) {
  15. req.query.limit = max_limit;
  16. }
  17. // Sorting
  18. let sort = typeof req.query.sort === 'undefined' ? default_sort : req.query.sort;
  19. let myRegexp = /.*\.(asc|desc)$/ig;
  20. let sort_array = [];
  21. sort = sort.split(',');
  22. _.map(sort, function (val) {
  23. let matches = myRegexp.exec(val);
  24. if (matches !== null) {
  25. let dir = matches[1];
  26. sort_array.push({
  27. field: val.substr(0, val.length - (dir.length + 1)),
  28. dir: dir.toLowerCase()
  29. });
  30. } else {
  31. sort_array.push({
  32. field: val,
  33. dir: 'asc'
  34. });
  35. }
  36. });
  37. // Sort will now be in this format:
  38. // [
  39. // { field: 'field1', dir: 'asc' },
  40. // { field: 'field2', dir: 'desc' }
  41. // ]
  42. req.query.sort = sort_array;
  43. next();
  44. };
  45. };