@neohm/nestend 3.3.10 → 3.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +3 -3
  2. package/dist/admin/controllers/admin.api.key.controller.d.ts +4 -10
  3. package/dist/admin/controllers/admin.api.key.controller.d.ts.map +1 -1
  4. package/dist/admin/controllers/admin.api.key.controller.js +5 -5
  5. package/dist/admin/controllers/admin.api.key.controller.js.map +1 -1
  6. package/dist/admin/controllers/admin.email.template.controller.d.ts +4 -10
  7. package/dist/admin/controllers/admin.email.template.controller.d.ts.map +1 -1
  8. package/dist/admin/controllers/admin.email.template.controller.js +5 -5
  9. package/dist/admin/controllers/admin.email.template.controller.js.map +1 -1
  10. package/dist/admin/controllers/admin.pdf.template.controller.d.ts +4 -10
  11. package/dist/admin/controllers/admin.pdf.template.controller.d.ts.map +1 -1
  12. package/dist/admin/controllers/admin.pdf.template.controller.js +5 -5
  13. package/dist/admin/controllers/admin.pdf.template.controller.js.map +1 -1
  14. package/dist/admin/controllers/admin.role.controller.d.ts +5 -17
  15. package/dist/admin/controllers/admin.role.controller.d.ts.map +1 -1
  16. package/dist/admin/controllers/admin.role.controller.js +7 -6
  17. package/dist/admin/controllers/admin.role.controller.js.map +1 -1
  18. package/dist/admin/controllers/admin.scheduled.task.controller.d.ts +4 -10
  19. package/dist/admin/controllers/admin.scheduled.task.controller.d.ts.map +1 -1
  20. package/dist/admin/controllers/admin.scheduled.task.controller.js +5 -5
  21. package/dist/admin/controllers/admin.scheduled.task.controller.js.map +1 -1
  22. package/dist/admin/controllers/admin.scope.controller.d.ts +4 -10
  23. package/dist/admin/controllers/admin.scope.controller.d.ts.map +1 -1
  24. package/dist/admin/controllers/admin.scope.controller.js +5 -5
  25. package/dist/admin/controllers/admin.scope.controller.js.map +1 -1
  26. package/dist/admin/controllers/admin.system.user.controller.d.ts +4 -10
  27. package/dist/admin/controllers/admin.system.user.controller.d.ts.map +1 -1
  28. package/dist/admin/controllers/admin.system.user.controller.js +5 -5
  29. package/dist/admin/controllers/admin.system.user.controller.js.map +1 -1
  30. package/dist/admin/controllers/admin.tenant.controller.d.ts +4 -10
  31. package/dist/admin/controllers/admin.tenant.controller.d.ts.map +1 -1
  32. package/dist/admin/controllers/admin.tenant.controller.js +6 -6
  33. package/dist/admin/controllers/admin.tenant.controller.js.map +1 -1
  34. package/dist/admin/controllers/admin.tenant.user.controller.d.ts +4 -10
  35. package/dist/admin/controllers/admin.tenant.user.controller.d.ts.map +1 -1
  36. package/dist/admin/controllers/admin.tenant.user.controller.js +5 -5
  37. package/dist/admin/controllers/admin.tenant.user.controller.js.map +1 -1
  38. package/dist/admin/controllers/admin.user.controller.d.ts +4 -10
  39. package/dist/admin/controllers/admin.user.controller.d.ts.map +1 -1
  40. package/dist/admin/controllers/admin.user.controller.js +5 -5
  41. package/dist/admin/controllers/admin.user.controller.js.map +1 -1
  42. package/dist/admin/controllers/system.role.controller.d.ts +4 -10
  43. package/dist/admin/controllers/system.role.controller.d.ts.map +1 -1
  44. package/dist/admin/controllers/system.role.controller.js +5 -5
  45. package/dist/admin/controllers/system.role.controller.js.map +1 -1
  46. package/dist/admin/es6.classes.d.ts +3 -2
  47. package/dist/admin/es6.classes.d.ts.map +1 -1
  48. package/dist/admin/es6.classes.js +2 -1
  49. package/dist/admin/es6.classes.js.map +1 -1
  50. package/dist/admin/libraries/admin.role.list.processor.d.ts +11 -0
  51. package/dist/admin/libraries/admin.role.list.processor.d.ts.map +1 -0
  52. package/dist/admin/libraries/admin.role.list.processor.js +39 -0
  53. package/dist/admin/libraries/admin.role.list.processor.js.map +1 -0
  54. package/dist/admin/libraries/admin.user.list.processor.d.ts +6 -10
  55. package/dist/admin/libraries/admin.user.list.processor.d.ts.map +1 -1
  56. package/dist/admin/libraries/admin.user.list.processor.js +17 -8
  57. package/dist/admin/libraries/admin.user.list.processor.js.map +1 -1
  58. package/dist/admin/libraries/api.key.list.processor.d.ts +6 -10
  59. package/dist/admin/libraries/api.key.list.processor.d.ts.map +1 -1
  60. package/dist/admin/libraries/api.key.list.processor.js +55 -26
  61. package/dist/admin/libraries/api.key.list.processor.js.map +1 -1
  62. package/dist/admin/libraries/client.user.list.processor.d.ts +7 -10
  63. package/dist/admin/libraries/client.user.list.processor.d.ts.map +1 -1
  64. package/dist/admin/libraries/client.user.list.processor.js +35 -25
  65. package/dist/admin/libraries/client.user.list.processor.js.map +1 -1
  66. package/dist/admin/libraries/email.template.list.processor.d.ts +6 -10
  67. package/dist/admin/libraries/email.template.list.processor.d.ts.map +1 -1
  68. package/dist/admin/libraries/email.template.list.processor.js +17 -8
  69. package/dist/admin/libraries/email.template.list.processor.js.map +1 -1
  70. package/dist/admin/libraries/pdf.template.list.processor.d.ts +6 -10
  71. package/dist/admin/libraries/pdf.template.list.processor.d.ts.map +1 -1
  72. package/dist/admin/libraries/pdf.template.list.processor.js +17 -8
  73. package/dist/admin/libraries/pdf.template.list.processor.js.map +1 -1
  74. package/dist/admin/libraries/role.list.processor.d.ts +6 -21
  75. package/dist/admin/libraries/role.list.processor.d.ts.map +1 -1
  76. package/dist/admin/libraries/role.list.processor.js +17 -32
  77. package/dist/admin/libraries/role.list.processor.js.map +1 -1
  78. package/dist/admin/libraries/scheduled.task.list.processor.d.ts +6 -10
  79. package/dist/admin/libraries/scheduled.task.list.processor.d.ts.map +1 -1
  80. package/dist/admin/libraries/scheduled.task.list.processor.js +27 -10
  81. package/dist/admin/libraries/scheduled.task.list.processor.js.map +1 -1
  82. package/dist/admin/libraries/scope.list.processor.d.ts +6 -10
  83. package/dist/admin/libraries/scope.list.processor.d.ts.map +1 -1
  84. package/dist/admin/libraries/scope.list.processor.js +13 -7
  85. package/dist/admin/libraries/scope.list.processor.js.map +1 -1
  86. package/dist/admin/libraries/system.user.list.processor.d.ts +7 -10
  87. package/dist/admin/libraries/system.user.list.processor.d.ts.map +1 -1
  88. package/dist/admin/libraries/system.user.list.processor.js +34 -23
  89. package/dist/admin/libraries/system.user.list.processor.js.map +1 -1
  90. package/dist/admin/libraries/tenant.list.processor.d.ts +6 -10
  91. package/dist/admin/libraries/tenant.list.processor.d.ts.map +1 -1
  92. package/dist/admin/libraries/tenant.list.processor.js +27 -10
  93. package/dist/admin/libraries/tenant.list.processor.js.map +1 -1
  94. package/dist/auth/controllers/auth.controller.d.ts.map +1 -1
  95. package/dist/auth/helpers/auth.js +1 -1
  96. package/dist/auth/helpers/auth.js.map +1 -1
  97. package/dist/common/common.module.d.ts.map +1 -1
  98. package/dist/common/common.module.js +2 -0
  99. package/dist/common/common.module.js.map +1 -1
  100. package/dist/common/dtos/common.list.filter.dto.d.ts.map +1 -1
  101. package/dist/common/dtos/common.list.filter.dto.js +4 -0
  102. package/dist/common/dtos/common.list.filter.dto.js.map +1 -1
  103. package/dist/common/dtos/filter.dto.d.ts +0 -2
  104. package/dist/common/dtos/filter.dto.d.ts.map +1 -1
  105. package/dist/common/dtos/filter.dto.js +0 -10
  106. package/dist/common/dtos/filter.dto.js.map +1 -1
  107. package/dist/common/enums/filter.value.type.enum.d.ts +3 -1
  108. package/dist/common/enums/filter.value.type.enum.d.ts.map +1 -1
  109. package/dist/common/enums/filter.value.type.enum.js +3 -1
  110. package/dist/common/enums/filter.value.type.enum.js.map +1 -1
  111. package/dist/common/enums/sql.default.enum.d.ts +1 -0
  112. package/dist/common/enums/sql.default.enum.d.ts.map +1 -1
  113. package/dist/common/enums/sql.default.enum.js +1 -0
  114. package/dist/common/enums/sql.default.enum.js.map +1 -1
  115. package/dist/common/libraries/common.list.processor.d.ts +7 -22
  116. package/dist/common/libraries/common.list.processor.d.ts.map +1 -1
  117. package/dist/common/libraries/common.list.processor.js +14 -159
  118. package/dist/common/libraries/common.list.processor.js.map +1 -1
  119. package/dist/common/libraries/filter.operator.defaults.d.ts +4 -0
  120. package/dist/common/libraries/filter.operator.defaults.d.ts.map +1 -0
  121. package/dist/common/libraries/filter.operator.defaults.js +26 -0
  122. package/dist/common/libraries/filter.operator.defaults.js.map +1 -0
  123. package/dist/common/libraries/predicate.set.d.ts +14 -0
  124. package/dist/common/libraries/predicate.set.d.ts.map +1 -0
  125. package/dist/common/libraries/predicate.set.js +48 -0
  126. package/dist/common/libraries/predicate.set.js.map +1 -0
  127. package/dist/common/services/list.filter.service.d.ts +19 -0
  128. package/dist/common/services/list.filter.service.d.ts.map +1 -0
  129. package/dist/common/services/list.filter.service.js +225 -0
  130. package/dist/common/services/list.filter.service.js.map +1 -0
  131. package/dist/common/services/sql.service.d.ts.map +1 -1
  132. package/dist/common/services/sql.service.js +1 -1
  133. package/dist/common/services/sql.service.js.map +1 -1
  134. package/dist/common/types/list.types.d.ts +25 -0
  135. package/dist/common/types/list.types.d.ts.map +1 -1
  136. package/dist/index.d.ts +4 -1
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +7 -1
  139. package/dist/index.js.map +1 -1
  140. package/dist/migrations/1749600000003.CreateSysUsersTable.js +2 -2
  141. package/dist/migrations/1749600000003.CreateSysUsersTable.js.map +1 -1
  142. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"filter.value.type.enum.js","sourceRoot":"","sources":["../../../src/common/enums/filter.value.type.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,mBAMX;AAND,WAAY,mBAAmB;IAC7B,qCAAc,CAAA;IACd,qCAAc,CAAA;IACd,oCAAa,CAAA;IACb,uCAAgB,CAAA;IAChB,oCAAa,CAAA;AACf,CAAC,EANW,mBAAmB,mCAAnB,mBAAmB,QAM9B"}
1
+ {"version":3,"file":"filter.value.type.enum.js","sourceRoot":"","sources":["../../../src/common/enums/filter.value.type.enum.ts"],"names":[],"mappings":";;;AAQA,IAAY,mBAUX;AAVD,WAAY,mBAAmB;IAC7B,qCAAc,CAAA;IACd,qCAAc,CAAA;IAEd,oCAAa,CAAA;IAEb,4CAAqB,CAAA;IACrB,uCAAgB,CAAA;IAChB,oCAAa,CAAA;IACb,oCAAa,CAAA;AACf,CAAC,EAVW,mBAAmB,mCAAnB,mBAAmB,QAU9B"}
@@ -1,6 +1,7 @@
1
1
  export declare enum SqlDefault {
2
2
  PAGE = 1,
3
3
  LIMIT = 10,
4
+ MAX_LIMIT = 100,
4
5
  LIMIT_PARAM = "sql_paginate_limit",
5
6
  OFFSET_PARAM = "sql_paginate_offset"
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql.default.enum.d.ts","sourceRoot":"","sources":["../../../src/common/enums/sql.default.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,IAAI,IAAI;IACR,KAAK,KAAK;IAEV,WAAW,uBAAuB;IAClC,YAAY,wBAAwB;CACrC"}
1
+ {"version":3,"file":"sql.default.enum.d.ts","sourceRoot":"","sources":["../../../src/common/enums/sql.default.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,IAAI,IAAI;IACR,KAAK,KAAK;IAEV,SAAS,MAAM;IAEf,WAAW,uBAAuB;IAClC,YAAY,wBAAwB;CACrC"}
@@ -5,6 +5,7 @@ var SqlDefault;
5
5
  (function (SqlDefault) {
6
6
  SqlDefault[SqlDefault["PAGE"] = 1] = "PAGE";
7
7
  SqlDefault[SqlDefault["LIMIT"] = 10] = "LIMIT";
8
+ SqlDefault[SqlDefault["MAX_LIMIT"] = 100] = "MAX_LIMIT";
8
9
  SqlDefault["LIMIT_PARAM"] = "sql_paginate_limit";
9
10
  SqlDefault["OFFSET_PARAM"] = "sql_paginate_offset";
10
11
  })(SqlDefault || (exports.SqlDefault = SqlDefault = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"sql.default.enum.js","sourceRoot":"","sources":["../../../src/common/enums/sql.default.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,2CAAQ,CAAA;IACR,8CAAU,CAAA;IAEV,gDAAkC,CAAA;IAClC,kDAAoC,CAAA;AACtC,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB"}
1
+ {"version":3,"file":"sql.default.enum.js","sourceRoot":"","sources":["../../../src/common/enums/sql.default.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAQX;AARD,WAAY,UAAU;IACpB,2CAAQ,CAAA;IACR,8CAAU,CAAA;IAEV,uDAAe,CAAA;IAEf,gDAAkC,CAAA;IAClC,kDAAoC,CAAA;AACtC,CAAC,EARW,UAAU,0BAAV,UAAU,QAQrB"}
@@ -1,28 +1,13 @@
1
1
  import { CommonListFilterDto } from '../dtos/common.list.filter.dto';
2
- import { SqlService } from '../services/sql.service';
3
- import { SqlParams } from '../types/sql.types';
4
- import { CommonListFilterConfig } from '../types/list.types';
2
+ import { ListFilterService } from '../services/list.filter.service';
3
+ import { CommonListFilterConfig, CommonListResult } from '../types/list.types';
4
+ import { PredicateSet } from './predicate.set';
5
5
  export declare class CommonListProcessor {
6
- protected readonly sqlService: SqlService;
7
6
  protected config: CommonListFilterConfig;
8
7
  protected payload: CommonListFilterDto;
9
- protected conditions: string[];
10
- protected filterParams: SqlParams;
11
- protected handle(): Promise<{
12
- records: import("../types/sql.types").SqlRow[];
13
- total: number;
14
- page: number;
15
- limit: number;
16
- total_pages: number;
17
- }>;
18
- private constructFinalQuery;
19
- private constructOrderByStatement;
20
- private constructFilterConditions;
21
- private constructSoftDeleteCondition;
22
- private constructSearchCondition;
23
- private resolveColumn;
24
- private transformFilterValue;
25
- private splitFilterValue;
26
- private castFilterValue;
8
+ protected readonly predicates: PredicateSet;
9
+ protected readonly listFilterService: ListFilterService;
10
+ protected applyCustomPredicates(): void;
11
+ protected handle(): Promise<CommonListResult>;
27
12
  }
28
13
  //# sourceMappingURL=common.list.processor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.list.processor.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/common.list.processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAEL,sBAAsB,EAEvB,MAAM,qBAAqB,CAAC;AAc7B,qBAAa,mBAAmB;IAC9B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACzC,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAEvC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IACpC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAM;cAEvB,MAAM;;;;;;;IA4BtB,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,CAAC,4BAA4B;IAyBpC,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,eAAe;CAiCxB"}
1
+ {"version":3,"file":"common.list.processor.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/common.list.processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAc/C,qBAAa,mBAAmB;IAC9B,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACzC,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAGvC,SAAS,CAAC,QAAQ,CAAC,UAAU,eAAsB;IAOnD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAExD,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAEvC,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAe9C"}
@@ -1,167 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CommonListProcessor = void 0;
4
- const operation_exception_1 = require("../../global/exceptions/operation.exception");
5
- const filter_operator_enum_1 = require("../enums/filter.operator.enum");
6
- const filter_value_type_enum_1 = require("../enums/filter.value.type.enum");
7
- const sort_direction_enum_1 = require("../enums/sort.direction.enum");
8
- const sql_default_enum_1 = require("../enums/sql.default.enum");
9
- const filter_operator_registry_1 = require("./filter.operator.registry");
10
- const SEARCH_PARAM = 'search_str';
11
- const SOFT_DELETE_COLUMN = 'deleted_at';
12
- function escapeLikePattern(value) {
13
- return value.replace(/[\\%_]/g, (character) => `\\${character}`);
14
- }
4
+ const predicate_set_1 = require("./predicate.set");
15
5
  class CommonListProcessor {
16
6
  constructor() {
17
- this.conditions = [];
18
- this.filterParams = {};
19
- }
20
- async handle() {
21
- this.constructFilterConditions();
22
- this.constructSearchCondition();
23
- this.constructSoftDeleteCondition();
24
- const finalQuery = this.constructFinalQuery();
25
- const page = Math.max(this.payload?.page ?? sql_default_enum_1.SqlDefault.PAGE, 1);
26
- const limit = Math.max(this.payload?.limit ?? sql_default_enum_1.SqlDefault.LIMIT, 1);
27
- const result = await this.sqlService.paginate(finalQuery, this.filterParams, { page, limit });
28
- const finalResult = {
29
- records: result.data,
30
- total: result.total,
31
- page: result.page,
32
- limit: result.limit,
33
- total_pages: result.total_pages,
34
- };
35
- return finalResult;
36
- }
37
- constructFinalQuery() {
38
- let query = this.config.query;
39
- const columnStatement = this.config.columns
40
- .map((column) => `${column.key} ${column.identifier}`)
41
- .join(', ');
42
- query = 'select ' + columnStatement + ' from ' + query;
43
- const wrapperQuery = `select * from ( ${query} ) query where true`;
44
- let conditionStatement = '';
45
- for (const condition of this.conditions)
46
- conditionStatement += ` and ( ${condition} )`;
47
- const finalQuery = wrapperQuery + conditionStatement + this.constructOrderByStatement();
48
- return finalQuery;
49
- }
50
- constructOrderByStatement() {
51
- const sorts = this.payload?.sorts?.length
52
- ? this.payload.sorts.map((sort) => ({
53
- field: this.resolveColumn(sort.identifier).identifier,
54
- direction: sort.direction,
55
- }))
56
- : this.config.defaultSort
57
- ? [this.config.defaultSort]
58
- : [];
59
- if (!sorts.length)
60
- return '';
61
- const orderStatement = sorts
62
- .map((sort) => `${sort.field} ${sort.direction === sort_direction_enum_1.SortDirection.DESC
63
- ? sort_direction_enum_1.SortDirection.DESC
64
- : sort_direction_enum_1.SortDirection.ASC}`)
65
- .join(', ');
66
- return ` order by ${orderStatement}`;
67
- }
68
- constructFilterConditions() {
69
- this.conditions = [];
70
- this.filterParams = {};
71
- for (const [index, filter] of (this.payload?.filters ?? []).entries()) {
72
- const column = this.resolveColumn(filter.identifier);
73
- const buildClause = filter_operator_registry_1.FILTER_OPERATORS[filter.operator];
74
- if (!buildClause)
75
- throw new operation_exception_1.OperationException(`Unsupported filter operator: ${filter.operator}`);
76
- const { clause, params } = buildClause(column.identifier, `filter_${index}`, this.transformFilterValue(filter));
77
- this.conditions.push(clause);
78
- Object.assign(this.filterParams, params);
79
- }
80
- }
81
- constructSoftDeleteCondition() {
82
- if (this.config.includeDeleted)
83
- return;
84
- const column = this.config.columns.find((candidate) => candidate.identifier === SOFT_DELETE_COLUMN);
85
- if (!column)
86
- return;
87
- const filtered = (this.payload?.filters ?? []).some((filter) => filter.identifier === SOFT_DELETE_COLUMN);
88
- if (filtered)
89
- return;
90
- this.conditions.push(`${SOFT_DELETE_COLUMN} IS NULL`);
91
- }
92
- constructSearchCondition() {
93
- const term = this.payload?.str?.trim();
94
- if (!term)
95
- return;
96
- const columns = this.config.columns.filter((column) => column.searchable);
97
- if (!columns.length)
98
- throw new operation_exception_1.OperationException('This list does not support free-text search');
99
- const clause = columns
100
- .map((column) => `CAST(${column.identifier} AS TEXT) ILIKE :${SEARCH_PARAM} ESCAPE '\\'`)
101
- .join(' or ');
102
- this.conditions.push(clause);
103
- this.filterParams[SEARCH_PARAM] = `%${escapeLikePattern(term)}%`;
104
- }
105
- resolveColumn(identifier) {
106
- const column = this.config.columns.find((candidate) => candidate.identifier === identifier);
107
- if (!column)
108
- throw new operation_exception_1.OperationException(`Unknown filter identifier: ${identifier}`);
109
- return column;
110
- }
111
- transformFilterValue(filter) {
112
- switch (filter.operator) {
113
- case filter_operator_enum_1.FilterOperatorEnum.IS_NULL:
114
- return !['false', '0', ''].includes((filter.value ?? '').trim().toLowerCase());
115
- case filter_operator_enum_1.FilterOperatorEnum.IN:
116
- return this.splitFilterValue(filter).map((part) => this.castFilterValue(part, filter.value_type));
117
- case filter_operator_enum_1.FilterOperatorEnum.BETWEEN: {
118
- const parts = this.splitFilterValue(filter);
119
- if (parts.length !== 2)
120
- throw new operation_exception_1.OperationException(`Filter on ${filter.identifier} expects exactly two comma-separated values`);
121
- return parts.map((part) => this.castFilterValue(part, filter.value_type));
122
- }
123
- default:
124
- return this.castFilterValue(filter.value, filter.value_type);
125
- }
126
- }
127
- splitFilterValue(filter) {
128
- const parts = (filter.value ?? '')
129
- .split(',')
130
- .map((part) => part.trim())
131
- .filter((part) => part.length);
132
- if (!parts.length)
133
- throw new operation_exception_1.OperationException(`Filter on ${filter.identifier} received no values`);
134
- return parts;
135
- }
136
- castFilterValue(raw, valueType) {
137
- switch (valueType) {
138
- case filter_value_type_enum_1.FilterValueTypeEnum.NULL:
139
- return null;
140
- case filter_value_type_enum_1.FilterValueTypeEnum.NUMBER: {
141
- const numeric = Number(raw);
142
- if (raw === null || raw === '' || Number.isNaN(numeric))
143
- throw new operation_exception_1.OperationException(`Invalid numeric filter value: ${raw}`);
144
- return numeric;
145
- }
146
- case filter_value_type_enum_1.FilterValueTypeEnum.DATE: {
147
- const date = new Date(raw);
148
- if (Number.isNaN(date.getTime()))
149
- throw new operation_exception_1.OperationException(`Invalid date filter value: ${raw}`);
150
- return date;
151
- }
152
- case filter_value_type_enum_1.FilterValueTypeEnum.BOOLEAN: {
153
- const normalized = (raw ?? '').trim().toLowerCase();
154
- if (normalized === 'true')
155
- return true;
156
- if (normalized === 'false')
157
- return false;
158
- throw new operation_exception_1.OperationException(`Invalid boolean filter value: ${raw}`);
159
- }
160
- case filter_value_type_enum_1.FilterValueTypeEnum.STRING:
161
- return raw;
162
- default:
163
- throw new operation_exception_1.OperationException(`Unsupported filter value type: ${String(valueType)}`);
164
- }
7
+ this.predicates = new predicate_set_1.PredicateSet();
8
+ }
9
+ applyCustomPredicates() { }
10
+ handle() {
11
+ this.predicates.reset();
12
+ for (const clause of this.config?.predicates ?? [])
13
+ this.predicates.add(clause);
14
+ this.applyCustomPredicates();
15
+ return this.listFilterService.execute({
16
+ config: this.config,
17
+ payload: this.payload,
18
+ predicates: this.predicates,
19
+ });
165
20
  }
166
21
  }
167
22
  exports.CommonListProcessor = CommonListProcessor;
@@ -1 +1 @@
1
- {"version":3,"file":"common.list.processor.js","sourceRoot":"","sources":["../../../src/common/libraries/common.list.processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.list.processor.js","sourceRoot":"","sources":["../../../src/common/libraries/common.list.processor.ts"],"names":[],"mappings":";;;AAGA,mDAA+C;AAc/C,MAAa,mBAAmB;IAAhC;QAKqB,eAAU,GAAG,IAAI,4BAAY,EAAE,CAAC;IA0BrD,CAAC;IAjBW,qBAAqB,KAAU,CAAC;IAEhC,MAAM;QACd,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAIxB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE;YAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;CACF;AA/BD,kDA+BC"}
@@ -0,0 +1,4 @@
1
+ import { FilterOperatorEnum } from '../enums/filter.operator.enum';
2
+ import { FilterValueTypeEnum } from '../enums/filter.value.type.enum';
3
+ export declare const DEFAULT_OPERATORS: Record<FilterValueTypeEnum, FilterOperatorEnum[]>;
4
+ //# sourceMappingURL=filter.operator.defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.operator.defaults.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/filter.operator.defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AActE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,mBAAmB,EACnB,kBAAkB,EAAE,CAqBrB,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_OPERATORS = void 0;
4
+ const filter_operator_enum_1 = require("../enums/filter.operator.enum");
5
+ const filter_value_type_enum_1 = require("../enums/filter.value.type.enum");
6
+ const { EQ, NE, IN, GT, GTE, LT, LTE, LIKE, ILIKE, BETWEEN, IS_NULL } = filter_operator_enum_1.FilterOperatorEnum;
7
+ exports.DEFAULT_OPERATORS = {
8
+ [filter_value_type_enum_1.FilterValueTypeEnum.STRING]: [EQ, NE, IN, LIKE, ILIKE, IS_NULL],
9
+ [filter_value_type_enum_1.FilterValueTypeEnum.NUMBER]: [
10
+ EQ,
11
+ NE,
12
+ IN,
13
+ GT,
14
+ GTE,
15
+ LT,
16
+ LTE,
17
+ BETWEEN,
18
+ IS_NULL,
19
+ ],
20
+ [filter_value_type_enum_1.FilterValueTypeEnum.DATE]: [EQ, NE, GT, GTE, LT, LTE, BETWEEN, IS_NULL],
21
+ [filter_value_type_enum_1.FilterValueTypeEnum.DATETIME]: [EQ, NE, GT, GTE, LT, LTE, BETWEEN, IS_NULL],
22
+ [filter_value_type_enum_1.FilterValueTypeEnum.BOOLEAN]: [EQ, NE, IS_NULL],
23
+ [filter_value_type_enum_1.FilterValueTypeEnum.UUID]: [EQ, NE, IN, IS_NULL],
24
+ [filter_value_type_enum_1.FilterValueTypeEnum.JSON]: [IS_NULL],
25
+ };
26
+ //# sourceMappingURL=filter.operator.defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.operator.defaults.js","sourceRoot":"","sources":["../../../src/common/libraries/filter.operator.defaults.ts"],"names":[],"mappings":";;;AAAA,wEAAmE;AACnE,4EAAsE;AAEtE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GACnE,yCAAkB,CAAC;AAWR,QAAA,iBAAiB,GAG1B;IACF,CAAC,4CAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IAChE,CAAC,4CAAmB,CAAC,MAAM,CAAC,EAAE;QAC5B,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,GAAG;QACH,EAAE;QACF,GAAG;QACH,OAAO;QACP,OAAO;KACR;IACD,CAAC,4CAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IACxE,CAAC,4CAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IAC5E,CAAC,4CAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC;IAEhD,CAAC,4CAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC;IAEjD,CAAC,4CAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;CACtC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { SqlParams } from '../types/sql.types';
2
+ export declare class PredicateSet {
3
+ private clauses;
4
+ private params;
5
+ private sequence;
6
+ add(clause: string, value?: unknown): void;
7
+ add(clause: string, params: SqlParams): void;
8
+ reset(): void;
9
+ get statement(): string;
10
+ get bindings(): SqlParams;
11
+ get isEmpty(): boolean;
12
+ private isParamBag;
13
+ }
14
+ //# sourceMappingURL=predicate.set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate.set.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/predicate.set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgB/C,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAK;IAYrB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAC1C,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI;IAqB5C,KAAK,IAAI,IAAI;IAMb,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAMD,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PredicateSet = void 0;
4
+ const VALUE_PLACEHOLDER = /:value\b/g;
5
+ class PredicateSet {
6
+ constructor() {
7
+ this.clauses = [];
8
+ this.params = {};
9
+ this.sequence = 0;
10
+ }
11
+ add(clause, value) {
12
+ if (value === undefined) {
13
+ this.clauses.push(clause);
14
+ return;
15
+ }
16
+ if (this.isParamBag(value)) {
17
+ this.clauses.push(clause);
18
+ Object.assign(this.params, value);
19
+ return;
20
+ }
21
+ const name = `predicate_${this.sequence++}`;
22
+ this.clauses.push(clause.replace(VALUE_PLACEHOLDER, `:${name}`));
23
+ this.params[name] = value;
24
+ }
25
+ reset() {
26
+ this.clauses = [];
27
+ this.params = {};
28
+ this.sequence = 0;
29
+ }
30
+ get statement() {
31
+ return this.clauses.map((clause) => ` and ( ${clause} )`).join('');
32
+ }
33
+ get bindings() {
34
+ return this.params;
35
+ }
36
+ get isEmpty() {
37
+ return this.clauses.length === 0;
38
+ }
39
+ isParamBag(value) {
40
+ return (typeof value === 'object' &&
41
+ value !== null &&
42
+ !Array.isArray(value) &&
43
+ !(value instanceof Date) &&
44
+ Object.getPrototypeOf(value) === Object.prototype);
45
+ }
46
+ }
47
+ exports.PredicateSet = PredicateSet;
48
+ //# sourceMappingURL=predicate.set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate.set.js","sourceRoot":"","sources":["../../../src/common/libraries/predicate.set.ts"],"names":[],"mappings":";;;AAGA,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAatC,MAAa,YAAY;IAAzB;QACU,YAAO,GAAa,EAAE,CAAC;QACvB,WAAM,GAAc,EAAE,CAAC;QACvB,aAAQ,GAAG,CAAC,CAAC;IAiEvB,CAAC;IAnDC,GAAG,CAAC,MAAc,EAAE,KAAe;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAID,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IAGD,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IACnC,CAAC;IAMO,UAAU,CAAC,KAAc;QAC/B,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC;YACxB,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAClD,CAAC;IACJ,CAAC;CACF;AApED,oCAoEC"}
@@ -0,0 +1,19 @@
1
+ import { SqlService } from './sql.service';
2
+ import { CommonListResult, ListFilterRequest } from '../types/list.types';
3
+ export declare class ListFilterService {
4
+ private readonly sqlService;
5
+ constructor(sqlService: SqlService);
6
+ execute(request: ListFilterRequest): Promise<CommonListResult>;
7
+ private constructFinalQuery;
8
+ private constructOrderByStatement;
9
+ private constructFilterConditions;
10
+ private constructSoftDeleteCondition;
11
+ private constructSearchCondition;
12
+ private resolveColumn;
13
+ private allowedOperators;
14
+ private assertOperatorAllowed;
15
+ private transformFilterValue;
16
+ private splitFilterValue;
17
+ private castFilterValue;
18
+ }
19
+ //# sourceMappingURL=list.filter.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.filter.service.d.ts","sourceRoot":"","sources":["../../../src/common/services/list.filter.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAEL,gBAAgB,EAEhB,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAiD7B,qBACa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAE7C,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuCpE,OAAO,CAAC,mBAAmB;IAyC3B,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,CAAC,yBAAyB;IAkCjC,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,eAAe;CAuDxB"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ListFilterService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const operation_exception_1 = require("../../global/exceptions/operation.exception");
15
+ const filter_operator_enum_1 = require("../enums/filter.operator.enum");
16
+ const filter_value_type_enum_1 = require("../enums/filter.value.type.enum");
17
+ const sort_direction_enum_1 = require("../enums/sort.direction.enum");
18
+ const sql_default_enum_1 = require("../enums/sql.default.enum");
19
+ const sql_service_1 = require("./sql.service");
20
+ const filter_operator_registry_1 = require("../libraries/filter.operator.registry");
21
+ const filter_operator_defaults_1 = require("../libraries/filter.operator.defaults");
22
+ const SEARCH_PARAM = 'search_str';
23
+ const SOFT_DELETE_COLUMN = 'deleted_at';
24
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
25
+ function escapeLikePattern(value) {
26
+ return value.replace(/[\\%_]/g, (character) => `\\${character}`);
27
+ }
28
+ const CALENDAR_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
29
+ function isRealCalendarDate(value) {
30
+ const [year, month, day] = value.split('-').map(Number);
31
+ const parsed = new Date(Date.UTC(year, month - 1, day));
32
+ return (parsed.getUTCFullYear() === year &&
33
+ parsed.getUTCMonth() === month - 1 &&
34
+ parsed.getUTCDate() === day);
35
+ }
36
+ let ListFilterService = class ListFilterService {
37
+ constructor(sqlService) {
38
+ this.sqlService = sqlService;
39
+ }
40
+ async execute(request) {
41
+ const context = {
42
+ ...request,
43
+ conditions: [],
44
+ filterParams: {},
45
+ };
46
+ this.constructFilterConditions(context);
47
+ this.constructSearchCondition(context);
48
+ this.constructSoftDeleteCondition(context);
49
+ const finalQuery = this.constructFinalQuery(context);
50
+ const page = Math.max(context.payload?.page ?? sql_default_enum_1.SqlDefault.PAGE, 1);
51
+ const limit = Math.min(Math.max(context.payload?.limit ?? sql_default_enum_1.SqlDefault.LIMIT, 1), context.config.maxLimit ?? sql_default_enum_1.SqlDefault.MAX_LIMIT);
52
+ const result = await this.sqlService.paginate(finalQuery, context.filterParams, { page, limit });
53
+ return {
54
+ records: result.data,
55
+ total: result.total,
56
+ page: result.page,
57
+ limit: result.limit,
58
+ total_pages: result.total_pages,
59
+ };
60
+ }
61
+ constructFinalQuery(context) {
62
+ let query = context.config.query;
63
+ const columnStatement = context.config.columns
64
+ .map((column) => `${column.key} ${column.identifier}`)
65
+ .join(', ');
66
+ query =
67
+ 'select ' +
68
+ columnStatement +
69
+ ' from ' +
70
+ query +
71
+ ' where true' +
72
+ context.predicates.statement;
73
+ const wrapperQuery = `select * from ( ${query} ) query where true`;
74
+ let conditionStatement = '';
75
+ for (const condition of context.conditions)
76
+ conditionStatement += ` and ( ${condition} )`;
77
+ const finalQuery = wrapperQuery +
78
+ conditionStatement +
79
+ this.constructOrderByStatement(context);
80
+ return finalQuery;
81
+ }
82
+ constructOrderByStatement(context) {
83
+ const sorts = context.payload?.sorts?.length
84
+ ? context.payload.sorts.map((sort) => ({
85
+ field: this.resolveColumn(context, sort.identifier).identifier,
86
+ direction: sort.direction,
87
+ }))
88
+ : context.config.defaultSort
89
+ ? [context.config.defaultSort]
90
+ : [];
91
+ if (!sorts.length)
92
+ return '';
93
+ const orderStatement = sorts
94
+ .map((sort) => `${sort.field} ${sort.direction === sort_direction_enum_1.SortDirection.DESC
95
+ ? sort_direction_enum_1.SortDirection.DESC
96
+ : sort_direction_enum_1.SortDirection.ASC}`)
97
+ .join(', ');
98
+ return ` order by ${orderStatement}`;
99
+ }
100
+ constructFilterConditions(context) {
101
+ context.conditions = [];
102
+ context.filterParams = { ...context.predicates.bindings };
103
+ for (const [index, filter] of (context.payload?.filters ?? []).entries()) {
104
+ const column = this.resolveColumn(context, filter.identifier);
105
+ const buildClause = filter_operator_registry_1.FILTER_OPERATORS[filter.operator];
106
+ if (!buildClause)
107
+ throw new operation_exception_1.OperationException(`Unsupported filter operator: ${filter.operator}`);
108
+ this.assertOperatorAllowed(column, filter.operator);
109
+ const { clause, params } = buildClause(column.identifier, `filter_${index}`, this.transformFilterValue(filter, column));
110
+ context.conditions.push(clause);
111
+ Object.assign(context.filterParams, params);
112
+ }
113
+ }
114
+ constructSoftDeleteCondition(context) {
115
+ if (context.config.includeDeleted)
116
+ return;
117
+ const column = context.config.columns.find((candidate) => candidate.identifier === SOFT_DELETE_COLUMN);
118
+ if (!column)
119
+ return;
120
+ context.conditions.push(`${SOFT_DELETE_COLUMN} IS NULL`);
121
+ }
122
+ constructSearchCondition(context) {
123
+ const term = context.payload?.str?.trim();
124
+ if (!term)
125
+ return;
126
+ const columns = context.config.columns.filter((column) => column.searchable);
127
+ if (!columns.length)
128
+ throw new operation_exception_1.OperationException('This list does not support free-text search');
129
+ const clause = columns
130
+ .map((column) => `CAST(${column.identifier} AS TEXT) ILIKE :${SEARCH_PARAM} ESCAPE '\\'`)
131
+ .join(' or ');
132
+ context.conditions.push(clause);
133
+ context.filterParams[SEARCH_PARAM] = `%${escapeLikePattern(term)}%`;
134
+ }
135
+ resolveColumn(context, identifier) {
136
+ const column = context.config.columns.find((candidate) => candidate.identifier === identifier);
137
+ if (!column)
138
+ throw new operation_exception_1.OperationException(`Unknown filter identifier: ${identifier}`);
139
+ return column;
140
+ }
141
+ allowedOperators(column) {
142
+ const supported = filter_operator_defaults_1.DEFAULT_OPERATORS[column.type ?? filter_value_type_enum_1.FilterValueTypeEnum.STRING];
143
+ if (!column.operators)
144
+ return supported;
145
+ return column.operators.filter((operator) => supported.includes(operator));
146
+ }
147
+ assertOperatorAllowed(column, operator) {
148
+ if (this.allowedOperators(column).includes(operator))
149
+ return;
150
+ throw new operation_exception_1.OperationException(`Operator ${operator} is not available on ${column.identifier}`);
151
+ }
152
+ transformFilterValue(filter, column) {
153
+ switch (filter.operator) {
154
+ case filter_operator_enum_1.FilterOperatorEnum.IS_NULL:
155
+ return !['false', '0', ''].includes((filter.value ?? '').trim().toLowerCase());
156
+ case filter_operator_enum_1.FilterOperatorEnum.IN:
157
+ return this.splitFilterValue(filter).map((part) => this.castFilterValue(part, column));
158
+ case filter_operator_enum_1.FilterOperatorEnum.BETWEEN: {
159
+ const parts = this.splitFilterValue(filter);
160
+ if (parts.length !== 2)
161
+ throw new operation_exception_1.OperationException(`Filter on ${filter.identifier} expects exactly two comma-separated values`);
162
+ return parts.map((part) => this.castFilterValue(part, column));
163
+ }
164
+ default:
165
+ return this.castFilterValue(filter.value, column);
166
+ }
167
+ }
168
+ splitFilterValue(filter) {
169
+ const parts = (filter.value ?? '')
170
+ .split(',')
171
+ .map((part) => part.trim())
172
+ .filter((part) => part.length);
173
+ if (!parts.length)
174
+ throw new operation_exception_1.OperationException(`Filter on ${filter.identifier} received no values`);
175
+ return parts;
176
+ }
177
+ castFilterValue(raw, column) {
178
+ const valueType = column.type ?? filter_value_type_enum_1.FilterValueTypeEnum.STRING;
179
+ switch (valueType) {
180
+ case filter_value_type_enum_1.FilterValueTypeEnum.UUID: {
181
+ if (!UUID_PATTERN.test(raw?.trim() ?? ''))
182
+ throw new operation_exception_1.OperationException(`Invalid uuid filter value on ${column.identifier}`);
183
+ return raw.trim();
184
+ }
185
+ case filter_value_type_enum_1.FilterValueTypeEnum.JSON:
186
+ throw new operation_exception_1.OperationException(`${column.identifier} cannot be compared by value`);
187
+ case filter_value_type_enum_1.FilterValueTypeEnum.NUMBER: {
188
+ const numeric = Number(raw);
189
+ if (raw === null || raw === '' || Number.isNaN(numeric))
190
+ throw new operation_exception_1.OperationException(`Invalid numeric filter value: ${raw}`);
191
+ return numeric;
192
+ }
193
+ case filter_value_type_enum_1.FilterValueTypeEnum.DATE: {
194
+ const value = raw?.trim() ?? '';
195
+ if (!CALENDAR_DATE_PATTERN.test(value) || !isRealCalendarDate(value))
196
+ throw new operation_exception_1.OperationException(`Invalid date filter value on ${column.identifier}: expected YYYY-MM-DD`);
197
+ return value;
198
+ }
199
+ case filter_value_type_enum_1.FilterValueTypeEnum.DATETIME: {
200
+ const date = new Date(raw);
201
+ if (Number.isNaN(date.getTime()))
202
+ throw new operation_exception_1.OperationException(`Invalid datetime filter value on ${column.identifier}`);
203
+ return date;
204
+ }
205
+ case filter_value_type_enum_1.FilterValueTypeEnum.BOOLEAN: {
206
+ const normalized = (raw ?? '').trim().toLowerCase();
207
+ if (normalized === 'true')
208
+ return true;
209
+ if (normalized === 'false')
210
+ return false;
211
+ throw new operation_exception_1.OperationException(`Invalid boolean filter value: ${raw}`);
212
+ }
213
+ case filter_value_type_enum_1.FilterValueTypeEnum.STRING:
214
+ return raw;
215
+ default:
216
+ throw new operation_exception_1.OperationException(`Unsupported filter value type: ${String(valueType)}`);
217
+ }
218
+ }
219
+ };
220
+ exports.ListFilterService = ListFilterService;
221
+ exports.ListFilterService = ListFilterService = __decorate([
222
+ (0, common_1.Injectable)(),
223
+ __metadata("design:paramtypes", [sql_service_1.SqlService])
224
+ ], ListFilterService);
225
+ //# sourceMappingURL=list.filter.service.js.map