@archi-code/criteria 1.0.0-alpha.1

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 (87) hide show
  1. package/dist/cjs/composite-filter.dto.d.ts +8 -0
  2. package/dist/cjs/composite-filter.dto.js +23 -0
  3. package/dist/cjs/composite-filter.dto.js.map +1 -0
  4. package/dist/cjs/converter/mongo-db/mongo-criteria-converter.d.ts +10 -0
  5. package/dist/cjs/converter/mongo-db/mongo-criteria-converter.js +90 -0
  6. package/dist/cjs/converter/mongo-db/mongo-criteria-converter.js.map +1 -0
  7. package/dist/cjs/converter/mongo-db/mongo-query.d.ts +13 -0
  8. package/dist/cjs/converter/mongo-db/mongo-query.js +3 -0
  9. package/dist/cjs/converter/mongo-db/mongo-query.js.map +1 -0
  10. package/dist/cjs/filter-operator.d.ts +14 -0
  11. package/dist/cjs/filter-operator.js +19 -0
  12. package/dist/cjs/filter-operator.js.map +1 -0
  13. package/dist/cjs/index.d.ts +13 -0
  14. package/dist/cjs/index.js +30 -0
  15. package/dist/cjs/index.js.map +1 -0
  16. package/dist/cjs/logical-operator.d.ts +1 -0
  17. package/dist/cjs/logical-operator.js +3 -0
  18. package/dist/cjs/logical-operator.js.map +1 -0
  19. package/dist/cjs/search-criteria.dto.d.ts +11 -0
  20. package/dist/cjs/search-criteria.dto.js +13 -0
  21. package/dist/cjs/search-criteria.dto.js.map +1 -0
  22. package/dist/cjs/search-filter.dto.d.ts +3 -0
  23. package/dist/cjs/search-filter.dto.js +3 -0
  24. package/dist/cjs/search-filter.dto.js.map +1 -0
  25. package/dist/cjs/search-group-by.dto.d.ts +4 -0
  26. package/dist/cjs/search-group-by.dto.js +24 -0
  27. package/dist/cjs/search-group-by.dto.js.map +1 -0
  28. package/dist/cjs/search-order-item.dto.d.ts +4 -0
  29. package/dist/cjs/search-order-item.dto.js +3 -0
  30. package/dist/cjs/search-order-item.dto.js.map +1 -0
  31. package/dist/cjs/search-order.dto.d.ts +5 -0
  32. package/dist/cjs/search-order.dto.js +21 -0
  33. package/dist/cjs/search-order.dto.js.map +1 -0
  34. package/dist/cjs/search-paginator.dto.d.ts +6 -0
  35. package/dist/cjs/search-paginator.dto.js +20 -0
  36. package/dist/cjs/search-paginator.dto.js.map +1 -0
  37. package/dist/cjs/search-query-serializer.d.ts +7 -0
  38. package/dist/cjs/search-query-serializer.js +74 -0
  39. package/dist/cjs/search-query-serializer.js.map +1 -0
  40. package/dist/cjs/simple-filter.dto.d.ts +8 -0
  41. package/dist/cjs/simple-filter.dto.js +52 -0
  42. package/dist/cjs/simple-filter.dto.js.map +1 -0
  43. package/dist/esm/composite-filter.dto.d.ts +8 -0
  44. package/dist/esm/composite-filter.dto.js +19 -0
  45. package/dist/esm/composite-filter.dto.js.map +1 -0
  46. package/dist/esm/converter/mongo-db/mongo-criteria-converter.d.ts +10 -0
  47. package/dist/esm/converter/mongo-db/mongo-criteria-converter.js +86 -0
  48. package/dist/esm/converter/mongo-db/mongo-criteria-converter.js.map +1 -0
  49. package/dist/esm/converter/mongo-db/mongo-query.d.ts +13 -0
  50. package/dist/esm/converter/mongo-db/mongo-query.js +2 -0
  51. package/dist/esm/converter/mongo-db/mongo-query.js.map +1 -0
  52. package/dist/esm/filter-operator.d.ts +14 -0
  53. package/dist/esm/filter-operator.js +16 -0
  54. package/dist/esm/filter-operator.js.map +1 -0
  55. package/dist/esm/index.d.ts +13 -0
  56. package/dist/esm/index.js +14 -0
  57. package/dist/esm/index.js.map +1 -0
  58. package/dist/esm/logical-operator.d.ts +1 -0
  59. package/dist/esm/logical-operator.js +2 -0
  60. package/dist/esm/logical-operator.js.map +1 -0
  61. package/dist/esm/search-criteria.dto.d.ts +11 -0
  62. package/dist/esm/search-criteria.dto.js +9 -0
  63. package/dist/esm/search-criteria.dto.js.map +1 -0
  64. package/dist/esm/search-filter.dto.d.ts +3 -0
  65. package/dist/esm/search-filter.dto.js +2 -0
  66. package/dist/esm/search-filter.dto.js.map +1 -0
  67. package/dist/esm/search-group-by.dto.d.ts +4 -0
  68. package/dist/esm/search-group-by.dto.js +20 -0
  69. package/dist/esm/search-group-by.dto.js.map +1 -0
  70. package/dist/esm/search-order-item.dto.d.ts +4 -0
  71. package/dist/esm/search-order-item.dto.js +2 -0
  72. package/dist/esm/search-order-item.dto.js.map +1 -0
  73. package/dist/esm/search-order.dto.d.ts +5 -0
  74. package/dist/esm/search-order.dto.js +17 -0
  75. package/dist/esm/search-order.dto.js.map +1 -0
  76. package/dist/esm/search-paginator.dto.d.ts +6 -0
  77. package/dist/esm/search-paginator.dto.js +16 -0
  78. package/dist/esm/search-paginator.dto.js.map +1 -0
  79. package/dist/esm/search-query-serializer.d.ts +7 -0
  80. package/dist/esm/search-query-serializer.js +70 -0
  81. package/dist/esm/search-query-serializer.js.map +1 -0
  82. package/dist/esm/simple-filter.dto.d.ts +8 -0
  83. package/dist/esm/simple-filter.dto.js +48 -0
  84. package/dist/esm/simple-filter.dto.js.map +1 -0
  85. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  86. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  87. package/package.json +73 -0
@@ -0,0 +1,8 @@
1
+ import { LogicalOperator } from './logical-operator';
2
+ import { SearchFilterDto } from './search-filter.dto';
3
+ export declare class CompositeFilterDto {
4
+ readonly logicalOperator: LogicalOperator;
5
+ readonly filters: SearchFilterDto[];
6
+ constructor(logicalOperator: LogicalOperator, filters: SearchFilterDto[]);
7
+ validate(): void;
8
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompositeFilterDto = void 0;
4
+ class CompositeFilterDto {
5
+ constructor(logicalOperator, filters) {
6
+ this.logicalOperator = logicalOperator;
7
+ this.filters = filters;
8
+ this.validate();
9
+ }
10
+ validate() {
11
+ if (this.logicalOperator !== 'and' && this.logicalOperator !== 'or') {
12
+ throw new Error('CompositeFilterDto: logicalOperator must be "and" or "or"');
13
+ }
14
+ if (!Array.isArray(this.filters) || this.filters.length === 0) {
15
+ throw new Error('CompositeFilterDto: "filters" must be a non-empty array');
16
+ }
17
+ this.filters.forEach((filter) => {
18
+ filter.validate();
19
+ });
20
+ }
21
+ }
22
+ exports.CompositeFilterDto = CompositeFilterDto;
23
+ //# sourceMappingURL=composite-filter.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-filter.dto.js","sourceRoot":"","sources":["../../src/composite-filter.dto.ts"],"names":[],"mappings":";;;AAGA,MAAa,kBAAkB;IAC7B,YACkB,eAAgC,EAChC,OAA0B;QAD1B,oBAAe,GAAf,eAAe,CAAiB;QAChC,YAAO,GAAP,OAAO,CAAmB;QAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAA+B,CAAC,QAAQ,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAnBD,gDAmBC"}
@@ -0,0 +1,10 @@
1
+ import { SearchCriteriaDto } from '../../search-criteria.dto';
2
+ import { MongoQuery } from './mongo-query';
3
+ export declare class MongoCriteriaConverter {
4
+ private operatorMap;
5
+ convert(criteria: SearchCriteriaDto): MongoQuery;
6
+ private generateFilter;
7
+ private generateSimpleFilter;
8
+ private generateSort;
9
+ private generatePagination;
10
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoCriteriaConverter = void 0;
4
+ const filter_operator_1 = require("../../filter-operator");
5
+ const simple_filter_dto_1 = require("../../simple-filter.dto");
6
+ const composite_filter_dto_1 = require("../../composite-filter.dto");
7
+ class MongoCriteriaConverter {
8
+ constructor() {
9
+ this.operatorMap = {
10
+ [filter_operator_1.FilterOperator.EQ]: '$eq',
11
+ [filter_operator_1.FilterOperator.NE]: '$ne',
12
+ [filter_operator_1.FilterOperator.GT]: '$gt',
13
+ [filter_operator_1.FilterOperator.GTE]: '$gte',
14
+ [filter_operator_1.FilterOperator.LT]: '$lt',
15
+ [filter_operator_1.FilterOperator.LTE]: '$lte',
16
+ [filter_operator_1.FilterOperator.LIKE]: '$regex',
17
+ [filter_operator_1.FilterOperator.ILIKE]: '$regex',
18
+ };
19
+ }
20
+ convert(criteria) {
21
+ const filter = criteria.filters ? this.generateFilter(criteria.filters) : {};
22
+ const sort = criteria.orders ? this.generateSort(criteria.orders) : {};
23
+ const { skip, limit } = this.generatePagination(criteria.paginator);
24
+ return { filter, sort, skip, limit };
25
+ }
26
+ generateFilter(filterDto) {
27
+ if (filterDto instanceof simple_filter_dto_1.SimpleFilterDto) {
28
+ return this.generateSimpleFilter(filterDto);
29
+ }
30
+ else if (filterDto instanceof composite_filter_dto_1.CompositeFilterDto) {
31
+ const nestedFilters = filterDto.filters.map((f) => this.generateFilter(f));
32
+ if (filterDto.logicalOperator === 'or') {
33
+ return { $or: nestedFilters };
34
+ }
35
+ else {
36
+ return { $and: nestedFilters };
37
+ }
38
+ }
39
+ throw new Error('Unsupported filter type');
40
+ }
41
+ generateSimpleFilter(filter) {
42
+ const field = filter.field;
43
+ const value = filter.value;
44
+ if (filter.operator === filter_operator_1.FilterOperator.EQ) {
45
+ return { [field]: value };
46
+ }
47
+ const op = this.operatorMap[filter.operator];
48
+ if (filter.operator === filter_operator_1.FilterOperator.IN) {
49
+ return { [field]: { $in: Array.isArray(value) ? value : [value] } };
50
+ }
51
+ if (filter.operator === filter_operator_1.FilterOperator.NIN) {
52
+ return { [field]: { $nin: Array.isArray(value) ? value : [value] } };
53
+ }
54
+ if (filter.operator === filter_operator_1.FilterOperator.BETWEEN) {
55
+ if (!Array.isArray(value) || value.length !== 2) {
56
+ throw new Error(`BETWEEN operator requires an array of two values for field ${field}`);
57
+ }
58
+ return { [field]: { $gte: value[0], $lte: value[1] } };
59
+ }
60
+ if (filter.operator === filter_operator_1.FilterOperator.LIKE || filter.operator === filter_operator_1.FilterOperator.ILIKE) {
61
+ const regexOptions = filter.operator === filter_operator_1.FilterOperator.ILIKE ? 'i' : '';
62
+ const regexFilter = regexOptions
63
+ ? { $regex: value, $options: regexOptions }
64
+ : { $regex: value };
65
+ return { [field]: regexFilter };
66
+ }
67
+ if (op) {
68
+ return { [field]: { [op]: value } };
69
+ }
70
+ throw new Error(`Operator ${filter.operator} is not supported for Mongo conversion`);
71
+ }
72
+ generateSort(orders) {
73
+ const sort = {};
74
+ orders.orders.forEach((orderItem) => {
75
+ const field = orderItem.field === 'id' ? '_id' : orderItem.field;
76
+ sort[field] = orderItem.direction === 'asc' ? 1 : -1;
77
+ });
78
+ return sort;
79
+ }
80
+ generatePagination(paginator) {
81
+ if (!paginator) {
82
+ return { skip: 0, limit: 0 };
83
+ }
84
+ const skip = (paginator.page - 1) * paginator.perPage;
85
+ const limit = paginator.perPage;
86
+ return { skip, limit };
87
+ }
88
+ }
89
+ exports.MongoCriteriaConverter = MongoCriteriaConverter;
90
+ //# sourceMappingURL=mongo-criteria-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-criteria-converter.js","sourceRoot":"","sources":["../../../../src/converter/mongo-db/mongo-criteria-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type MongoFilterOperator = '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$regex' | '$in' | '$nin';
2
+ export type MongoFilter = Record<string, Partial<Record<MongoFilterOperator, any>>> | {
3
+ $or: MongoFilter[];
4
+ } | {
5
+ $and: MongoFilter[];
6
+ };
7
+ export type MongoSort = Record<string, 1 | -1>;
8
+ export interface MongoQuery {
9
+ filter: MongoFilter;
10
+ sort: MongoSort;
11
+ skip: number;
12
+ limit: number;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mongo-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-query.js","sourceRoot":"","sources":["../../../../src/converter/mongo-db/mongo-query.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ export declare enum FilterOperator {
2
+ EQ = "eq",
3
+ NE = "ne",
4
+ LT = "lt",
5
+ LTE = "lte",
6
+ GT = "gt",
7
+ GTE = "gte",
8
+ IN = "in",
9
+ NIN = "nin",
10
+ BETWEEN = "between",
11
+ LIKE = "like",
12
+ ILIKE = "ilike",
13
+ INARRAY = "inarray"
14
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FilterOperator = void 0;
4
+ var FilterOperator;
5
+ (function (FilterOperator) {
6
+ FilterOperator["EQ"] = "eq";
7
+ FilterOperator["NE"] = "ne";
8
+ FilterOperator["LT"] = "lt";
9
+ FilterOperator["LTE"] = "lte";
10
+ FilterOperator["GT"] = "gt";
11
+ FilterOperator["GTE"] = "gte";
12
+ FilterOperator["IN"] = "in";
13
+ FilterOperator["NIN"] = "nin";
14
+ FilterOperator["BETWEEN"] = "between";
15
+ FilterOperator["LIKE"] = "like";
16
+ FilterOperator["ILIKE"] = "ilike";
17
+ FilterOperator["INARRAY"] = "inarray";
18
+ })(FilterOperator || (exports.FilterOperator = FilterOperator = {}));
19
+ //# sourceMappingURL=filter-operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-operator.js","sourceRoot":"","sources":["../../src/filter-operator.ts"],"names":[],"mappings":";;;AAAA,IAAY,cAaX;AAbD,WAAY,cAAc;IACxB,2BAAS,CAAA;IACT,2BAAS,CAAA;IACT,2BAAS,CAAA;IACT,6BAAW,CAAA;IACX,2BAAS,CAAA;IACT,6BAAW,CAAA;IACX,2BAAS,CAAA;IACT,6BAAW,CAAA;IACX,qCAAmB,CAAA;IACnB,+BAAa,CAAA;IACb,iCAAe,CAAA;IACf,qCAAmB,CAAA;AACrB,CAAC,EAbW,cAAc,8BAAd,cAAc,QAazB"}
@@ -0,0 +1,13 @@
1
+ export * from './converter/mongo-db/mongo-query';
2
+ export * from './converter/mongo-db/mongo-criteria-converter';
3
+ export * from './composite-filter.dto';
4
+ export * from './filter-operator';
5
+ export * from './logical-operator';
6
+ export * from './search-criteria.dto';
7
+ export * from './search-filter.dto';
8
+ export * from './search-group-by.dto';
9
+ export * from './search-order.dto';
10
+ export * from './search-order-item.dto';
11
+ export * from './search-paginator.dto';
12
+ export * from './simple-filter.dto';
13
+ export * from './search-query-serializer';
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./converter/mongo-db/mongo-query"), exports);
18
+ __exportStar(require("./converter/mongo-db/mongo-criteria-converter"), exports);
19
+ __exportStar(require("./composite-filter.dto"), exports);
20
+ __exportStar(require("./filter-operator"), exports);
21
+ __exportStar(require("./logical-operator"), exports);
22
+ __exportStar(require("./search-criteria.dto"), exports);
23
+ __exportStar(require("./search-filter.dto"), exports);
24
+ __exportStar(require("./search-group-by.dto"), exports);
25
+ __exportStar(require("./search-order.dto"), exports);
26
+ __exportStar(require("./search-order-item.dto"), exports);
27
+ __exportStar(require("./search-paginator.dto"), exports);
28
+ __exportStar(require("./simple-filter.dto"), exports);
29
+ __exportStar(require("./search-query-serializer"), exports);
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,gFAA8D;AAC9D,yDAAuC;AACvC,oDAAkC;AAClC,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,wDAAsC;AACtC,qDAAmC;AACnC,0DAAwC;AACxC,yDAAuC;AACvC,sDAAoC;AACpC,4DAA0C"}
@@ -0,0 +1 @@
1
+ export type LogicalOperator = 'and' | 'or';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logical-operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logical-operator.js","sourceRoot":"","sources":["../../src/logical-operator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { SearchFilterDto } from './search-filter.dto';
2
+ import { SearchOrderDto } from './search-order.dto';
3
+ import { SearchPaginatorDto } from './search-paginator.dto';
4
+ import { SearchGroupByDto } from './search-group-by.dto';
5
+ export declare class SearchCriteriaDto {
6
+ readonly filters?: SearchFilterDto | undefined;
7
+ readonly orders?: SearchOrderDto | undefined;
8
+ readonly paginator?: SearchPaginatorDto | undefined;
9
+ readonly groupBy?: SearchGroupByDto | undefined;
10
+ constructor(filters?: SearchFilterDto | undefined, orders?: SearchOrderDto | undefined, paginator?: SearchPaginatorDto | undefined, groupBy?: SearchGroupByDto | undefined);
11
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchCriteriaDto = void 0;
4
+ class SearchCriteriaDto {
5
+ constructor(filters, orders, paginator, groupBy) {
6
+ this.filters = filters;
7
+ this.orders = orders;
8
+ this.paginator = paginator;
9
+ this.groupBy = groupBy;
10
+ }
11
+ }
12
+ exports.SearchCriteriaDto = SearchCriteriaDto;
13
+ //# sourceMappingURL=search-criteria.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-criteria.dto.js","sourceRoot":"","sources":["../../src/search-criteria.dto.ts"],"names":[],"mappings":";;;AAKA,MAAa,iBAAiB;IAC5B,YACkB,OAAyB,EACzB,MAAuB,EACvB,SAA8B,EAC9B,OAA0B;QAH1B,YAAO,GAAP,OAAO,CAAkB;QACzB,WAAM,GAAN,MAAM,CAAiB;QACvB,cAAS,GAAT,SAAS,CAAqB;QAC9B,YAAO,GAAP,OAAO,CAAmB;IACzC,CAAC;CACL;AAPD,8CAOC"}
@@ -0,0 +1,3 @@
1
+ import { SimpleFilterDto } from './simple-filter.dto';
2
+ import { CompositeFilterDto } from './composite-filter.dto';
3
+ export type SearchFilterDto = SimpleFilterDto | CompositeFilterDto;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=search-filter.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filter.dto.js","sourceRoot":"","sources":["../../src/search-filter.dto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare class SearchGroupByDto {
2
+ readonly fields: string[];
3
+ constructor(groupBy: string | string[]);
4
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchGroupByDto = void 0;
4
+ class SearchGroupByDto {
5
+ constructor(groupBy) {
6
+ if (groupBy == null) {
7
+ throw new Error('SearchGroupByDto: groupBy value cannot be null or undefined');
8
+ }
9
+ else if (typeof groupBy === 'string') {
10
+ this.fields = [groupBy];
11
+ }
12
+ else if (Array.isArray(groupBy)) {
13
+ if (!groupBy.every((item) => typeof item === 'string')) {
14
+ throw new Error('SearchGroupByDto: All groupBy fields must be strings');
15
+ }
16
+ this.fields = groupBy;
17
+ }
18
+ else {
19
+ throw new Error('SearchGroupByDto: groupBy must be a string or an array of strings');
20
+ }
21
+ }
22
+ }
23
+ exports.SearchGroupByDto = SearchGroupByDto;
24
+ //# sourceMappingURL=search-group-by.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-group-by.dto.js","sourceRoot":"","sources":["../../src/search-group-by.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,gBAAgB;IAG3B,YAAY,OAA0B;QACpC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;CACF;AAjBD,4CAiBC"}
@@ -0,0 +1,4 @@
1
+ export interface SearchOrderItemDto {
2
+ field: string;
3
+ direction: 'asc' | 'desc';
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=search-order-item.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-order-item.dto.js","sourceRoot":"","sources":["../../src/search-order-item.dto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { SearchOrderItemDto } from './search-order-item.dto';
2
+ export declare class SearchOrderDto {
3
+ readonly orders: SearchOrderItemDto[];
4
+ constructor(orders: SearchOrderItemDto[]);
5
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchOrderDto = void 0;
4
+ class SearchOrderDto {
5
+ constructor(orders) {
6
+ if (!Array.isArray(orders)) {
7
+ throw new Error('SearchOrderDto: orders must be an array');
8
+ }
9
+ orders.forEach((o) => {
10
+ if (!o.field || typeof o.field !== 'string') {
11
+ throw new Error('SearchOrderDto: Each order must have a non-empty string as field');
12
+ }
13
+ if (o.direction !== 'asc' && o.direction !== 'desc') {
14
+ throw new Error('SearchOrderDto: Each order must have direction "asc" or "desc"');
15
+ }
16
+ });
17
+ this.orders = orders;
18
+ }
19
+ }
20
+ exports.SearchOrderDto = SearchOrderDto;
21
+ //# sourceMappingURL=search-order.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-order.dto.js","sourceRoot":"","sources":["../../src/search-order.dto.ts"],"names":[],"mappings":";;;AAKA,MAAa,cAAc;IAGzB,YAAY,MAA4B;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAjBD,wCAiBC"}
@@ -0,0 +1,6 @@
1
+ export declare class SearchPaginatorDto {
2
+ readonly page: number;
3
+ readonly perPage: number;
4
+ constructor(page: number, perPage: number);
5
+ validate(): void;
6
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchPaginatorDto = void 0;
4
+ class SearchPaginatorDto {
5
+ constructor(page, perPage) {
6
+ this.page = typeof page === 'string' ? Number(page) : page;
7
+ this.perPage = typeof perPage === 'string' ? Number(perPage) : perPage;
8
+ this.validate();
9
+ }
10
+ validate() {
11
+ if (!Number.isInteger(this.page) || !Number.isInteger(this.perPage)) {
12
+ throw new Error('SearchPaginatorDto: "page" and "perPage" must be integers');
13
+ }
14
+ if (this.page < 1 || this.perPage < 1) {
15
+ throw new Error('SearchPaginatorDto: "page" and "perPage" must be positive integers');
16
+ }
17
+ }
18
+ }
19
+ exports.SearchPaginatorDto = SearchPaginatorDto;
20
+ //# sourceMappingURL=search-paginator.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-paginator.dto.js","sourceRoot":"","sources":["../../src/search-paginator.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,kBAAkB;IAI7B,YAAY,IAAY,EAAE,OAAe;QAEvC,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF;AAnBD,gDAmBC"}
@@ -0,0 +1,7 @@
1
+ import { SearchCriteriaDto } from './search-criteria.dto';
2
+ export declare class SearchQuerySerializer {
3
+ static serialize(query: SearchCriteriaDto): string;
4
+ static deserialize(serialized: string): SearchCriteriaDto;
5
+ private static serializeFilter;
6
+ private static deserializeFilter;
7
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchQuerySerializer = void 0;
4
+ const search_criteria_dto_1 = require("./search-criteria.dto");
5
+ const search_order_dto_1 = require("./search-order.dto");
6
+ const search_paginator_dto_1 = require("./search-paginator.dto");
7
+ const composite_filter_dto_1 = require("./composite-filter.dto");
8
+ const simple_filter_dto_1 = require("./simple-filter.dto");
9
+ const search_group_by_dto_1 = require("./search-group-by.dto");
10
+ class SearchQuerySerializer {
11
+ static serialize(query) {
12
+ const obj = {};
13
+ obj.filters = query.filters ? this.serializeFilter(query.filters) : null;
14
+ obj.orders = query.orders
15
+ ? query.orders.orders.map((o) => ({
16
+ field: o.field,
17
+ direction: o.direction,
18
+ }))
19
+ : null;
20
+ obj.paginator = query.paginator
21
+ ? { page: query.paginator.page, perPage: query.paginator.perPage }
22
+ : null;
23
+ obj.groupBy = query.groupBy ? query.groupBy.fields : null;
24
+ return JSON.stringify(obj);
25
+ }
26
+ static deserialize(serialized) {
27
+ let obj;
28
+ try {
29
+ obj = JSON.parse(serialized);
30
+ }
31
+ catch {
32
+ throw new Error('Invalid JSON string');
33
+ }
34
+ const filters = obj.filters ? this.deserializeFilter(obj.filters) : undefined;
35
+ const orders = obj.orders ? new search_order_dto_1.SearchOrderDto(obj.orders) : undefined;
36
+ const paginator = obj.paginator
37
+ ? new search_paginator_dto_1.SearchPaginatorDto(obj.paginator.page, obj.paginator.perPage)
38
+ : undefined;
39
+ const groupBy = obj.groupBy ? new search_group_by_dto_1.SearchGroupByDto(obj.groupBy) : undefined;
40
+ return new search_criteria_dto_1.SearchCriteriaDto(filters, orders, paginator, groupBy);
41
+ }
42
+ static serializeFilter(filter) {
43
+ if (filter instanceof simple_filter_dto_1.SimpleFilterDto) {
44
+ return {
45
+ type: 'simple',
46
+ field: filter.field,
47
+ operator: filter.operator,
48
+ value: filter.value,
49
+ };
50
+ }
51
+ else if (filter instanceof composite_filter_dto_1.CompositeFilterDto) {
52
+ return {
53
+ type: 'composite',
54
+ logicalOperator: filter.logicalOperator,
55
+ filters: filter.filters.map((f) => this.serializeFilter(f)),
56
+ };
57
+ }
58
+ throw new Error('Unknown filter type');
59
+ }
60
+ static deserializeFilter(obj) {
61
+ if (obj.type === 'simple') {
62
+ return new simple_filter_dto_1.SimpleFilterDto(obj.field, obj.operator, obj.value);
63
+ }
64
+ else if (obj.type === 'composite') {
65
+ const subFilters = Array.isArray(obj.filters)
66
+ ? obj.filters.map((sub) => this.deserializeFilter(sub))
67
+ : [];
68
+ return new composite_filter_dto_1.CompositeFilterDto(obj.logicalOperator, subFilters);
69
+ }
70
+ throw new Error('Unknown filter format');
71
+ }
72
+ }
73
+ exports.SearchQuerySerializer = SearchQuerySerializer;
74
+ //# sourceMappingURL=search-query-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-query-serializer.js","sourceRoot":"","sources":["../../src/search-query-serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FilterOperator } from './filter-operator';
2
+ export declare class SimpleFilterDto {
3
+ readonly field: string;
4
+ readonly operator: FilterOperator;
5
+ readonly value: string | number | (string | number)[];
6
+ constructor(field: string, operator: FilterOperator, value: string | number | (string | number)[]);
7
+ validate(): void;
8
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SimpleFilterDto = void 0;
4
+ const filter_operator_1 = require("./filter-operator");
5
+ class SimpleFilterDto {
6
+ constructor(field, operator, value) {
7
+ this.field = field;
8
+ this.operator = operator;
9
+ const numericOperators = [
10
+ filter_operator_1.FilterOperator.LT,
11
+ filter_operator_1.FilterOperator.LTE,
12
+ filter_operator_1.FilterOperator.GT,
13
+ filter_operator_1.FilterOperator.GTE,
14
+ filter_operator_1.FilterOperator.BETWEEN,
15
+ ];
16
+ if (numericOperators.includes(operator)) {
17
+ if (Array.isArray(value)) {
18
+ this.value = value.map((v) => {
19
+ const num = Number(v);
20
+ if (isNaN(num)) {
21
+ throw new Error(`SimpleFilterDto: Value "${v}" must be a number`);
22
+ }
23
+ return num;
24
+ });
25
+ }
26
+ else {
27
+ const num = Number(value);
28
+ if (isNaN(num)) {
29
+ throw new Error(`SimpleFilterDto: Value "${value}" must be a number`);
30
+ }
31
+ this.value = num;
32
+ }
33
+ }
34
+ else {
35
+ this.value = value;
36
+ }
37
+ this.validate();
38
+ }
39
+ validate() {
40
+ if (!this.field || typeof this.field !== 'string') {
41
+ throw new Error('SimpleFilterDto: "field" must be a non-empty string');
42
+ }
43
+ if (!Object.values(filter_operator_1.FilterOperator).includes(this.operator)) {
44
+ throw new Error(`SimpleFilterDto: Invalid operator "${this.operator}"`);
45
+ }
46
+ if (this.value === undefined) {
47
+ throw new Error('SimpleFilterDto: "value" is required');
48
+ }
49
+ }
50
+ }
51
+ exports.SimpleFilterDto = SimpleFilterDto;
52
+ //# sourceMappingURL=simple-filter.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-filter.dto.js","sourceRoot":"","sources":["../../src/simple-filter.dto.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAEnD,MAAa,eAAe;IAG1B,YACkB,KAAa,EACb,QAAwB,EACxC,KAA4C;QAF5B,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAgB;QAIxC,MAAM,gBAAgB,GAAG;YACvB,gCAAc,CAAC,EAAE;YACjB,gCAAc,CAAC,GAAG;YAClB,gCAAc,CAAC,EAAE;YACjB,gCAAc,CAAC,GAAG;YAClB,gCAAc,CAAC,OAAO;SACvB,CAAC;QACF,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,oBAAoB,CAAC,CAAC;oBACpE,CAAC;oBACD,OAAO,GAAG,CAAC;gBACb,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,oBAAoB,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gCAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAjDD,0CAiDC"}
@@ -0,0 +1,8 @@
1
+ import { LogicalOperator } from './logical-operator';
2
+ import { SearchFilterDto } from './search-filter.dto';
3
+ export declare class CompositeFilterDto {
4
+ readonly logicalOperator: LogicalOperator;
5
+ readonly filters: SearchFilterDto[];
6
+ constructor(logicalOperator: LogicalOperator, filters: SearchFilterDto[]);
7
+ validate(): void;
8
+ }
@@ -0,0 +1,19 @@
1
+ export class CompositeFilterDto {
2
+ constructor(logicalOperator, filters) {
3
+ this.logicalOperator = logicalOperator;
4
+ this.filters = filters;
5
+ this.validate();
6
+ }
7
+ validate() {
8
+ if (this.logicalOperator !== 'and' && this.logicalOperator !== 'or') {
9
+ throw new Error('CompositeFilterDto: logicalOperator must be "and" or "or"');
10
+ }
11
+ if (!Array.isArray(this.filters) || this.filters.length === 0) {
12
+ throw new Error('CompositeFilterDto: "filters" must be a non-empty array');
13
+ }
14
+ this.filters.forEach((filter) => {
15
+ filter.validate();
16
+ });
17
+ }
18
+ }
19
+ //# sourceMappingURL=composite-filter.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-filter.dto.js","sourceRoot":"","sources":["../../src/composite-filter.dto.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,kBAAkB;IAC7B,YACkB,eAAgC,EAChC,OAA0B;QAD1B,oBAAe,GAAf,eAAe,CAAiB;QAChC,YAAO,GAAP,OAAO,CAAmB;QAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAA+B,CAAC,QAAQ,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}