SearchFilter.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // exports.SearchFilter = (search = '', fields = []) => {
  2. // if (!search || fields.length === 0) return {};
  3. // return {
  4. // OR: fields.map((field) => ({
  5. // [field]: {
  6. // contains: search,
  7. // mode: 'insensitive'
  8. // }
  9. // }))
  10. // };
  11. // };
  12. // exports.SearchFilter = (search = '', fields = []) => {
  13. // if (!search || fields.length === 0) return {};
  14. // const or = [];
  15. // for (const field of fields) {
  16. // const parts = field.split('.');
  17. // if (parts.length === 1) {
  18. // or.push({
  19. // [field]: {
  20. // contains: search,
  21. // mode: 'insensitive',
  22. // },
  23. // });
  24. // } else if (parts.length === 2) {
  25. // const [relation, subfield] = parts;
  26. // or.push({
  27. // [relation]: {
  28. // is: {
  29. // [subfield]: {
  30. // contains: search,
  31. // mode: 'insensitive',
  32. // }
  33. // }
  34. // }
  35. // });
  36. // }
  37. // }
  38. // return { OR: or };
  39. // };
  40. exports.SearchFilter = (search = '', fields = [], arrayRelations = []) => {
  41. if (!search || fields.length === 0) return {};
  42. const buildNestedFilter = (parts, value) => {
  43. if (parts.length === 1) {
  44. return {
  45. [parts[0]]: {
  46. contains: value,
  47. mode: 'insensitive',
  48. },
  49. };
  50. }
  51. const [current, ...rest] = parts;
  52. const nested = buildNestedFilter(rest, value);
  53. // Jika current adalah array relation
  54. if (arrayRelations.includes(current)) {
  55. return {
  56. [current]: {
  57. some: nested,
  58. },
  59. };
  60. } else {
  61. return {
  62. [current]: {
  63. is: nested,
  64. },
  65. };
  66. }
  67. };
  68. const or = fields.map(field => {
  69. const parts = field.split('.');
  70. return buildNestedFilter(parts, search);
  71. });
  72. return { OR: or };
  73. };