@ptc-org/nestjs-query-typegoose 1.1.0 → 1.1.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 (42) hide show
  1. package/package.json +4 -4
  2. package/src/index.d.ts +2 -0
  3. package/src/index.js.map +1 -0
  4. package/src/module.d.ts +5 -0
  5. package/src/module.js +19 -0
  6. package/src/module.js.map +1 -0
  7. package/src/providers.d.ts +3 -0
  8. package/src/providers.js +41 -0
  9. package/src/providers.js.map +1 -0
  10. package/src/query/aggregate.builder.d.ts +25 -0
  11. package/src/query/aggregate.builder.js +111 -0
  12. package/src/query/aggregate.builder.js.map +1 -0
  13. package/src/query/comparison.builder.d.ts +29 -0
  14. package/src/query/comparison.builder.js +101 -0
  15. package/src/query/comparison.builder.js.map +1 -0
  16. package/src/query/filter-query.builder.d.ts +44 -0
  17. package/src/query/filter-query.builder.js +85 -0
  18. package/src/query/filter-query.builder.js.map +1 -0
  19. package/src/query/helpers.d.ts +1 -0
  20. package/src/query/helpers.js +8 -0
  21. package/src/query/helpers.js.map +1 -0
  22. package/src/query/index.d.ts +4 -0
  23. package/src/query/index.js +8 -0
  24. package/src/query/index.js.map +1 -0
  25. package/src/query/where.builder.d.ts +24 -0
  26. package/src/query/where.builder.js +72 -0
  27. package/src/query/where.builder.js.map +1 -0
  28. package/src/services/index.d.ts +1 -0
  29. package/src/services/index.js +5 -0
  30. package/src/services/index.js.map +1 -0
  31. package/src/services/reference-query.service.d.ts +34 -0
  32. package/src/services/reference-query.service.js +237 -0
  33. package/src/services/reference-query.service.js.map +1 -0
  34. package/src/services/typegoose-query-service.d.ts +134 -0
  35. package/src/services/typegoose-query-service.js +246 -0
  36. package/src/services/typegoose-query-service.js.map +1 -0
  37. package/src/typegoose-interface.helpers.d.ts +14 -0
  38. package/src/typegoose-interface.helpers.js +3 -0
  39. package/src/typegoose-interface.helpers.js.map +1 -0
  40. package/src/typegoose-types.helper.d.ts +40 -0
  41. package/src/typegoose-types.helper.js +40 -0
  42. package/src/typegoose-types.helper.js.map +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ptc-org/nestjs-query-typegoose",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Typegoose adapter for @ptc-org/nestjs-query-core",
5
5
  "author": "john mcinall<johnmcinall@gmail.com>",
6
6
  "homepage": "https://github.com/tripss/nestjs-query#readme",
@@ -12,7 +12,7 @@
12
12
  "test": "__tests__"
13
13
  },
14
14
  "files": [
15
- "dist/src/**"
15
+ "src/**"
16
16
  ],
17
17
  "publishConfig": {
18
18
  "access": "public"
@@ -23,12 +23,12 @@
23
23
  "lodash.escaperegexp": "^4.1.2",
24
24
  "lodash.merge": "^4.6.2",
25
25
  "tslib": "^2.4.0",
26
- "@ptc-org/nestjs-query-core": "1.1.0",
26
+ "@ptc-org/nestjs-query-core": "1.1.1",
27
27
  "reflect-metadata": "^0.1.13"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "@nestjs/common": "^8.0.0 || ^9.0.0",
31
- "@typegoose/typegoose": "^8.0.0-beta.2",
31
+ "@typegoose/typegoose": "^8.0.0 || ^9.0.0",
32
32
  "mongoose": "^6.3.3",
33
33
  "nestjs-typegoose": "^7.1.38"
34
34
  },
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { NestjsQueryTypegooseModule } from './module';
2
+ export { TypegooseQueryService, TypegooseQueryServiceOpts } from './services';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/query-typegoose/src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAA5C,oHAAA,0BAA0B,OAAA;AACnC,uCAA6E;AAApE,iHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { TypegooseClass, TypegooseClassWithOptions } from './typegoose-interface.helpers';
3
+ export declare class NestjsQueryTypegooseModule {
4
+ static forFeature(models: (TypegooseClass | TypegooseClassWithOptions)[], connectionName?: string): DynamicModule;
5
+ }
package/src/module.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NestjsQueryTypegooseModule = void 0;
4
+ const nestjs_typegoose_1 = require("nestjs-typegoose");
5
+ const providers_1 = require("./providers");
6
+ class NestjsQueryTypegooseModule {
7
+ static forFeature(models, connectionName) {
8
+ const queryServiceProviders = (0, providers_1.createTypegooseQueryServiceProviders)(models);
9
+ const typegooseModule = nestjs_typegoose_1.TypegooseModule.forFeature(models, connectionName);
10
+ return {
11
+ imports: [typegooseModule],
12
+ module: NestjsQueryTypegooseModule,
13
+ providers: [...queryServiceProviders],
14
+ exports: [...queryServiceProviders, typegooseModule]
15
+ };
16
+ }
17
+ }
18
+ exports.NestjsQueryTypegooseModule = NestjsQueryTypegooseModule;
19
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../packages/query-typegoose/src/module.ts"],"names":[],"mappings":";;;AACA,uDAAkD;AAElD,2CAAkE;AAGlE,MAAa,0BAA0B;IACrC,MAAM,CAAC,UAAU,CAAC,MAAsD,EAAE,cAAuB;QAC/F,MAAM,qBAAqB,GAAG,IAAA,gDAAoC,EAAC,MAAM,CAAC,CAAA;QAC1E,MAAM,eAAe,GAAG,kCAAe,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAC1E,OAAO;YACL,OAAO,EAAE,CAAC,eAAe,CAAC;YAC1B,MAAM,EAAE,0BAA0B;YAClC,SAAS,EAAE,CAAC,GAAG,qBAAqB,CAAC;YACrC,OAAO,EAAE,CAAC,GAAG,qBAAqB,EAAE,eAAe,CAAC;SACrD,CAAA;IACH,CAAC;CACF;AAXD,gEAWC"}
@@ -0,0 +1,3 @@
1
+ import { FactoryProvider } from '@nestjs/common';
2
+ import { TypegooseClass, TypegooseClassWithOptions } from './typegoose-interface.helpers';
3
+ export declare const createTypegooseQueryServiceProviders: (models: (TypegooseClass | TypegooseClassWithOptions)[]) => FactoryProvider[];
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTypegooseQueryServiceProviders = void 0;
4
+ const nestjs_query_core_1 = require("@ptc-org/nestjs-query-core");
5
+ const typegoose_1 = require("@typegoose/typegoose");
6
+ const is_class_1 = require("is-class");
7
+ const nestjs_typegoose_1 = require("nestjs-typegoose");
8
+ const services_1 = require("./services");
9
+ const isTypegooseClass = (item) => (0, is_class_1.isClass)(item);
10
+ const isTypegooseClassWithOptions = (item) => isTypegooseClass(item.typegooseClass);
11
+ (0, nestjs_query_core_1.AssemblerSerializer)((obj) => obj.toObject({ virtuals: true }))(typegoose_1.mongoose.Document);
12
+ function ensureProperInput(item) {
13
+ if (isTypegooseClass(item)) {
14
+ return { typegooseClass: item };
15
+ }
16
+ if (isTypegooseClassWithOptions(item)) {
17
+ return item;
18
+ }
19
+ return undefined;
20
+ }
21
+ function createTypegooseQueryServiceProvider(model) {
22
+ const inputModel = ensureProperInput(model);
23
+ if (!inputModel) {
24
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
25
+ throw new Error(`Model definitions ${model} is incorrect.`);
26
+ }
27
+ const modelName = inputModel.typegooseClass?.name;
28
+ return {
29
+ provide: (0, nestjs_query_core_1.getQueryServiceToken)({ name: modelName }),
30
+ useFactory(ModelClass) {
31
+ // initialize default serializer for documents, this is the type that mongoose returns from queries
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
33
+ (0, nestjs_query_core_1.AssemblerSerializer)((obj) => obj.toObject({ virtuals: true }))(ModelClass);
34
+ return new services_1.TypegooseQueryService(ModelClass);
35
+ },
36
+ inject: [(0, nestjs_typegoose_1.getModelToken)(modelName)]
37
+ };
38
+ }
39
+ const createTypegooseQueryServiceProviders = (models) => models.map((model) => createTypegooseQueryServiceProvider(model));
40
+ exports.createTypegooseQueryServiceProviders = createTypegooseQueryServiceProviders;
41
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../packages/query-typegoose/src/providers.ts"],"names":[],"mappings":";;;AACA,kEAAsF;AACtF,oDAA8E;AAE9E,uCAAkC;AAClC,uDAAgD;AAEhD,yCAAkD;AAMlD,MAAM,gBAAgB,GAAG,CAAC,IAAoB,EAA0B,EAAE,CAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAA;AAExF,MAAM,2BAA2B,GAAG,CAAC,IAA0B,EAAqC,EAAE,CACpG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAEvC,IAAA,uCAAmB,EAAC,CAAC,GAAsB,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAQ,CAAC,QAAQ,CAAC,CAAA;AAEpG,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;QAC1B,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;KAChC;IACD,IAAI,2BAA2B,CAAC,IAAI,CAAC,EAAE;QACrC,OAAO,IAAI,CAAA;KACZ;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,mCAAmC,CAC1C,KAAiD;IAEjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,CAAC,UAAU,EAAE;QACf,4EAA4E;QAC5E,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,gBAAgB,CAAC,CAAA;KAC5D;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,IAAI,CAAA;IAEjD,OAAO;QACL,OAAO,EAAE,IAAA,wCAAoB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAClD,UAAU,CAAC,UAA6C;YACtD,mGAAmG;YACnG,+DAA+D;YAC/D,IAAA,uCAAmB,EAAC,CAAC,GAA0B,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YAEjG,OAAO,IAAI,gCAAqB,CAAC,UAAU,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM,EAAE,CAAC,IAAA,gCAAa,EAAC,SAAS,CAAC,CAAC;KACnC,CAAA;AACH,CAAC;AAEM,MAAM,oCAAoC,GAAG,CAAC,MAAsD,EAAqB,EAAE,CAChI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC,CAAA;AADtD,QAAA,oCAAoC,wCACkB"}
@@ -0,0 +1,25 @@
1
+ import { AggregateQuery, AggregateResponse } from '@ptc-org/nestjs-query-core';
2
+ import { DocumentType } from '@typegoose/typegoose';
3
+ declare type Aggregate = Record<string, Record<string, unknown>>;
4
+ declare type Group = {
5
+ _id: Record<string, string> | null;
6
+ };
7
+ export declare type TypegooseGroupAndAggregate = Aggregate & Group;
8
+ /**
9
+ * @internal
10
+ * Builds a WHERE clause from a Filter.
11
+ */
12
+ export declare class AggregateBuilder<Entity> {
13
+ static convertToAggregateResponse<Entity>(aggregates: Record<string, unknown>[]): AggregateResponse<Entity>[];
14
+ private static extractResponse;
15
+ /**
16
+ * Builds a aggregate SELECT clause from a aggregate.
17
+ * @param aggregate - the aggregates to select.
18
+ */
19
+ build(aggregate: AggregateQuery<DocumentType<Entity>>): TypegooseGroupAndAggregate;
20
+ private createAggSelect;
21
+ private createGroupBySelect;
22
+ getGroupBySelects(fields?: (keyof DocumentType<Entity>)[]): string[] | undefined;
23
+ private getGroupByAlias;
24
+ }
25
+ export {};
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AggregateBuilder = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const camel_case_1 = require("camel-case");
6
+ const helpers_1 = require("./helpers");
7
+ var AggregateFuncs;
8
+ (function (AggregateFuncs) {
9
+ AggregateFuncs["AVG"] = "avg";
10
+ AggregateFuncs["SUM"] = "sum";
11
+ AggregateFuncs["COUNT"] = "count";
12
+ AggregateFuncs["MAX"] = "max";
13
+ AggregateFuncs["MIN"] = "min";
14
+ })(AggregateFuncs || (AggregateFuncs = {}));
15
+ const AGG_REGEXP = /(avg|sum|count|max|min|group_by)_(.*)/;
16
+ /**
17
+ * @internal
18
+ * Builds a WHERE clause from a Filter.
19
+ */
20
+ class AggregateBuilder {
21
+ // eslint-disable-next-line @typescript-eslint/no-shadow
22
+ static convertToAggregateResponse(aggregates) {
23
+ return aggregates.map(({ _id, ...response }) => {
24
+ return { ...this.extractResponse(_id), ...this.extractResponse(response) };
25
+ });
26
+ }
27
+ // eslint-disable-next-line @typescript-eslint/no-shadow
28
+ static extractResponse(response) {
29
+ if (!response) {
30
+ return {};
31
+ }
32
+ return Object.keys(response).reduce((agg, resultField) => {
33
+ const matchResult = AGG_REGEXP.exec(resultField);
34
+ if (!matchResult) {
35
+ throw new Error('Unknown aggregate column encountered.');
36
+ }
37
+ const [matchedFunc, matchedFieldName] = matchResult.slice(1);
38
+ const aggFunc = (0, camel_case_1.camelCase)(matchedFunc.toLowerCase());
39
+ const fieldName = matchedFieldName;
40
+ const aggResult = agg[aggFunc] || {};
41
+ return {
42
+ ...agg,
43
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
44
+ [aggFunc]: { ...aggResult, [fieldName]: response[resultField] }
45
+ };
46
+ }, {});
47
+ }
48
+ /**
49
+ * Builds a aggregate SELECT clause from a aggregate.
50
+ * @param aggregate - the aggregates to select.
51
+ */
52
+ build(aggregate) {
53
+ const aggSelect = {
54
+ ...this.createAggSelect(AggregateFuncs.COUNT, aggregate.count),
55
+ ...this.createAggSelect(AggregateFuncs.SUM, aggregate.sum),
56
+ ...this.createAggSelect(AggregateFuncs.AVG, aggregate.avg),
57
+ ...this.createAggSelect(AggregateFuncs.MAX, aggregate.max),
58
+ ...this.createAggSelect(AggregateFuncs.MIN, aggregate.min)
59
+ };
60
+ if (!Object.keys(aggSelect).length) {
61
+ throw new common_1.BadRequestException('No aggregate fields found.');
62
+ }
63
+ return { ...aggSelect, _id: this.createGroupBySelect(aggregate.groupBy) };
64
+ }
65
+ createAggSelect(func, fields) {
66
+ if (!fields) {
67
+ return {};
68
+ }
69
+ return fields.reduce((agg, field) => {
70
+ const aggAlias = `${func}_${field}`;
71
+ const fieldAlias = `$${(0, helpers_1.getSchemaKey)(String(field))}`;
72
+ if (func === 'count') {
73
+ return {
74
+ ...agg,
75
+ [aggAlias]: {
76
+ $sum: {
77
+ $cond: {
78
+ if: { $in: [{ $type: fieldAlias }, ['missing', 'null']] },
79
+ then: 0,
80
+ else: 1
81
+ }
82
+ }
83
+ }
84
+ };
85
+ }
86
+ return { ...agg, [aggAlias]: { [`$${func}`]: fieldAlias } };
87
+ }, {});
88
+ }
89
+ createGroupBySelect(fields) {
90
+ if (!fields) {
91
+ return null;
92
+ }
93
+ return fields.reduce((id, field) => {
94
+ const aggAlias = this.getGroupByAlias(field);
95
+ const fieldAlias = `$${(0, helpers_1.getSchemaKey)(String(field))}`;
96
+ return { ...id, [aggAlias]: fieldAlias };
97
+ }, {});
98
+ }
99
+ getGroupBySelects(fields) {
100
+ if (!fields) {
101
+ return undefined;
102
+ }
103
+ // append _id so it pulls the sort from the _id field
104
+ return (fields ?? []).map((f) => `_id.${this.getGroupByAlias(f)}`);
105
+ }
106
+ getGroupByAlias(field) {
107
+ return `group_by_${field}`;
108
+ }
109
+ }
110
+ exports.AggregateBuilder = AggregateBuilder;
111
+ //# sourceMappingURL=aggregate.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.builder.js","sourceRoot":"","sources":["../../../../../packages/query-typegoose/src/query/aggregate.builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { CommonFieldComparisonBetweenType, FilterComparisonOperators } from '@ptc-org/nestjs-query-core';
2
+ import { mongoose, ReturnModelType } from '@typegoose/typegoose';
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare type EntityComparisonField<Entity, F extends keyof Entity> = Entity[F] | Entity[F][] | CommonFieldComparisonBetweenType<Entity[F]> | true | false | null;
7
+ /**
8
+ * @internal
9
+ * Builder to create SQL Comparisons. (=, !=, \>, etc...)
10
+ */
11
+ export declare class ComparisonBuilder<Entity> {
12
+ readonly Model: ReturnModelType<new () => Entity>;
13
+ readonly comparisonMap: Record<string, string>;
14
+ static DEFAULT_COMPARISON_MAP: Record<string, string>;
15
+ constructor(Model: ReturnModelType<new () => Entity>, comparisonMap?: Record<string, string>);
16
+ /**
17
+ * Creates a valid SQL fragment with parameters.
18
+ *
19
+ * @param field - the property in Entity to create the comparison for.
20
+ * @param cmp - the FilterComparisonOperator (eq, neq, gt, etc...)
21
+ * @param val - the value to compare to.
22
+ */
23
+ build<F extends keyof Entity>(field: F, cmp: FilterComparisonOperators<Entity[F]>, val: EntityComparisonField<Entity, F>): mongoose.FilterQuery<Entity>;
24
+ private betweenComparison;
25
+ private isBetweenVal;
26
+ private likeComparison;
27
+ private convertQueryValue;
28
+ private convertToObjectId;
29
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ComparisonBuilder = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const typegoose_1 = require("@typegoose/typegoose");
7
+ const lodash_escaperegexp_1 = (0, tslib_1.__importDefault)(require("lodash.escaperegexp"));
8
+ const helpers_1 = require("./helpers");
9
+ /**
10
+ * @internal
11
+ * Builder to create SQL Comparisons. (=, !=, \>, etc...)
12
+ */
13
+ class ComparisonBuilder {
14
+ constructor(Model, comparisonMap = ComparisonBuilder.DEFAULT_COMPARISON_MAP) {
15
+ this.Model = Model;
16
+ this.comparisonMap = comparisonMap;
17
+ }
18
+ /**
19
+ * Creates a valid SQL fragment with parameters.
20
+ *
21
+ * @param field - the property in Entity to create the comparison for.
22
+ * @param cmp - the FilterComparisonOperator (eq, neq, gt, etc...)
23
+ * @param val - the value to compare to.
24
+ */
25
+ build(field, cmp, val) {
26
+ const schemaKey = (0, helpers_1.getSchemaKey)(`${String(field)}`);
27
+ const normalizedCmp = cmp.toLowerCase();
28
+ let querySelector;
29
+ if (this.comparisonMap[normalizedCmp]) {
30
+ // comparison operator (e.b. =, !=, >, <)
31
+ querySelector = {
32
+ [this.comparisonMap[normalizedCmp]]: this.convertQueryValue(field, val)
33
+ };
34
+ }
35
+ if (normalizedCmp.includes('like')) {
36
+ querySelector = this.likeComparison(normalizedCmp, val);
37
+ }
38
+ if (normalizedCmp.includes('between')) {
39
+ querySelector = this.betweenComparison(normalizedCmp, field, val);
40
+ }
41
+ if (!querySelector) {
42
+ throw new common_1.BadRequestException(`unknown operator ${JSON.stringify(cmp)}`);
43
+ }
44
+ return { [schemaKey]: querySelector };
45
+ }
46
+ betweenComparison(cmp, field, val) {
47
+ if (!this.isBetweenVal(val)) {
48
+ throw new Error(`Invalid value for ${cmp} expected {lower: val, upper: val} got ${JSON.stringify(val)}`);
49
+ }
50
+ if (cmp === 'notbetween') {
51
+ return { $lt: this.convertQueryValue(field, val.lower), $gt: this.convertQueryValue(field, val.upper) };
52
+ }
53
+ return { $gte: this.convertQueryValue(field, val.lower), $lte: this.convertQueryValue(field, val.upper) };
54
+ }
55
+ isBetweenVal(val) {
56
+ return val !== null && typeof val === 'object' && 'lower' in val && 'upper' in val;
57
+ }
58
+ likeComparison(cmp, val) {
59
+ const regExpStr = (0, lodash_escaperegexp_1.default)(`${String(val)}`).replace(/%/g, '.*');
60
+ const regExp = new RegExp(regExpStr, cmp.includes('ilike') ? 'i' : undefined);
61
+ if (cmp.startsWith('not')) {
62
+ return { $not: { $regex: regExp } };
63
+ }
64
+ return { $regex: regExp };
65
+ }
66
+ convertQueryValue(field, val) {
67
+ const schemaType = this.Model.schema.path((0, helpers_1.getSchemaKey)(field));
68
+ if (!schemaType) {
69
+ throw new common_1.BadRequestException(`unknown comparison field ${String(field)}`);
70
+ }
71
+ if (schemaType instanceof typegoose_1.mongoose.Schema.Types.ObjectId) {
72
+ return this.convertToObjectId(val);
73
+ }
74
+ return val;
75
+ }
76
+ convertToObjectId(val) {
77
+ if (Array.isArray(val)) {
78
+ return val.map((v) => this.convertToObjectId(v));
79
+ }
80
+ if (typeof val === 'string' || typeof val === 'number') {
81
+ if (typegoose_1.mongoose.Types.ObjectId.isValid(val)) {
82
+ return new typegoose_1.mongoose.Types.ObjectId(val);
83
+ }
84
+ }
85
+ return val;
86
+ }
87
+ }
88
+ exports.ComparisonBuilder = ComparisonBuilder;
89
+ ComparisonBuilder.DEFAULT_COMPARISON_MAP = {
90
+ eq: '$eq',
91
+ neq: '$ne',
92
+ gt: '$gt',
93
+ gte: '$gte',
94
+ lt: '$lt',
95
+ lte: '$lte',
96
+ in: '$in',
97
+ notin: '$nin',
98
+ is: '$eq',
99
+ isnot: '$ne'
100
+ };
101
+ //# sourceMappingURL=comparison.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.builder.js","sourceRoot":"","sources":["../../../../../packages/query-typegoose/src/query/comparison.builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { AggregateQuery, Filter, Query, SortField } from '@ptc-org/nestjs-query-core';
2
+ import { DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';
3
+ import { AggregateBuilder, TypegooseGroupAndAggregate } from './aggregate.builder';
4
+ import { WhereBuilder } from './where.builder';
5
+ declare type TypegooseSort = Record<string, 1 | -1>;
6
+ declare type TypegooseQuery<Entity> = {
7
+ filterQuery: mongoose.FilterQuery<new () => Entity>;
8
+ options: {
9
+ limit?: number;
10
+ skip?: number;
11
+ sort?: TypegooseSort;
12
+ };
13
+ };
14
+ declare type TypegooseAggregateQuery<Entity> = TypegooseQuery<Entity> & {
15
+ aggregate: TypegooseGroupAndAggregate;
16
+ };
17
+ /**
18
+ * @internal
19
+ *
20
+ * Class that will convert a Query into a `typeorm` Query Builder.
21
+ */
22
+ export declare class FilterQueryBuilder<Entity> {
23
+ readonly Model: ReturnModelType<new () => Entity>;
24
+ readonly whereBuilder: WhereBuilder<Entity>;
25
+ readonly aggregateBuilder: AggregateBuilder<Entity>;
26
+ constructor(Model: ReturnModelType<new () => Entity>, whereBuilder?: WhereBuilder<Entity>, aggregateBuilder?: AggregateBuilder<Entity>);
27
+ buildQuery({ filter, paging, sorting }: Query<Entity>): TypegooseQuery<Entity>;
28
+ buildAggregateQuery(aggregate: AggregateQuery<DocumentType<Entity>>, filter?: Filter<Entity>): TypegooseAggregateQuery<Entity>;
29
+ buildIdAggregateQuery(id: unknown | unknown[], filter: Filter<Entity>, aggregate: AggregateQuery<Entity>): TypegooseAggregateQuery<Entity>;
30
+ buildIdFilterQuery(id: unknown | unknown[], filter?: Filter<Entity>): mongoose.FilterQuery<new () => Entity>;
31
+ /**
32
+ * Applies the filter from a Query to a `typeorm` QueryBuilder.
33
+ *
34
+ * @param filter - the filter.
35
+ */
36
+ buildFilterQuery(filter?: Filter<Entity>): mongoose.FilterQuery<new () => Entity>;
37
+ /**
38
+ * Applies the ORDER BY clause to a `typeorm` QueryBuilder.
39
+ * @param sorts - an array of SortFields to create the ORDER BY clause.
40
+ */
41
+ buildSorting(sorts?: SortField<Entity>[]): TypegooseSort | undefined;
42
+ private buildAggregateSorting;
43
+ }
44
+ export {};
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FilterQueryBuilder = void 0;
4
+ const nestjs_query_core_1 = require("@ptc-org/nestjs-query-core");
5
+ const aggregate_builder_1 = require("./aggregate.builder");
6
+ const helpers_1 = require("./helpers");
7
+ const where_builder_1 = require("./where.builder");
8
+ const TYPEGOOSE_SORT_DIRECTION = {
9
+ [nestjs_query_core_1.SortDirection.ASC]: 1,
10
+ [nestjs_query_core_1.SortDirection.DESC]: -1
11
+ };
12
+ /**
13
+ * @internal
14
+ *
15
+ * Class that will convert a Query into a `typeorm` Query Builder.
16
+ */
17
+ class FilterQueryBuilder {
18
+ constructor(Model, whereBuilder = new where_builder_1.WhereBuilder(Model), aggregateBuilder = new aggregate_builder_1.AggregateBuilder()) {
19
+ this.Model = Model;
20
+ this.whereBuilder = whereBuilder;
21
+ this.aggregateBuilder = aggregateBuilder;
22
+ }
23
+ buildQuery({ filter, paging, sorting }) {
24
+ return {
25
+ filterQuery: this.buildFilterQuery(filter),
26
+ options: { limit: paging?.limit, skip: paging?.offset, sort: this.buildSorting(sorting) }
27
+ };
28
+ }
29
+ buildAggregateQuery(aggregate, filter) {
30
+ return {
31
+ filterQuery: this.buildFilterQuery(filter),
32
+ aggregate: this.aggregateBuilder.build(aggregate),
33
+ options: { sort: this.buildAggregateSorting(aggregate) }
34
+ };
35
+ }
36
+ buildIdAggregateQuery(id, filter, aggregate) {
37
+ return {
38
+ filterQuery: this.buildIdFilterQuery(id, filter),
39
+ aggregate: this.aggregateBuilder.build(aggregate),
40
+ options: { sort: this.buildAggregateSorting(aggregate) }
41
+ };
42
+ }
43
+ buildIdFilterQuery(id, filter) {
44
+ return {
45
+ ...this.buildFilterQuery(filter),
46
+ _id: Array.isArray(id) ? { $in: id } : id
47
+ };
48
+ }
49
+ /**
50
+ * Applies the filter from a Query to a `typeorm` QueryBuilder.
51
+ *
52
+ * @param filter - the filter.
53
+ */
54
+ buildFilterQuery(filter) {
55
+ if (!filter) {
56
+ return {};
57
+ }
58
+ return this.whereBuilder.build(filter);
59
+ }
60
+ /**
61
+ * Applies the ORDER BY clause to a `typeorm` QueryBuilder.
62
+ * @param sorts - an array of SortFields to create the ORDER BY clause.
63
+ */
64
+ buildSorting(sorts) {
65
+ if (!sorts) {
66
+ return undefined;
67
+ }
68
+ return sorts.reduce((sort, sortField) => {
69
+ const field = (0, helpers_1.getSchemaKey)(sortField.field.toString());
70
+ const direction = TYPEGOOSE_SORT_DIRECTION[sortField.direction];
71
+ return { ...sort, [field]: direction };
72
+ }, {});
73
+ }
74
+ buildAggregateSorting(aggregate) {
75
+ const aggregateGroupBy = this.aggregateBuilder.getGroupBySelects(aggregate.groupBy);
76
+ if (!aggregateGroupBy) {
77
+ return undefined;
78
+ }
79
+ return aggregateGroupBy.reduce((sort, sortField) => {
80
+ return { ...sort, [(0, helpers_1.getSchemaKey)(sortField)]: TYPEGOOSE_SORT_DIRECTION[nestjs_query_core_1.SortDirection.ASC] };
81
+ }, {});
82
+ }
83
+ }
84
+ exports.FilterQueryBuilder = FilterQueryBuilder;
85
+ //# sourceMappingURL=filter-query.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-query.builder.js","sourceRoot":"","sources":["../../../../../packages/query-typegoose/src/query/filter-query.builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getSchemaKey(key: string): string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSchemaKey = void 0;
4
+ function getSchemaKey(key) {
5
+ return key === 'id' ? '_id' : key;
6
+ }
7
+ exports.getSchemaKey = getSchemaKey;
8
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../packages/query-typegoose/src/query/helpers.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;AACnC,CAAC;AAFD,oCAEC"}
@@ -0,0 +1,4 @@
1
+ export * from './aggregate.builder';
2
+ export * from './comparison.builder';
3
+ export * from './filter-query.builder';
4
+ export * from './where.builder';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ (0, tslib_1.__exportStar)(require("./aggregate.builder"), exports);
5
+ (0, tslib_1.__exportStar)(require("./comparison.builder"), exports);
6
+ (0, tslib_1.__exportStar)(require("./filter-query.builder"), exports);
7
+ (0, tslib_1.__exportStar)(require("./where.builder"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/query-typegoose/src/query/index.ts"],"names":[],"mappings":";;;AAAA,mEAAmC;AACnC,oEAAoC;AACpC,sEAAsC;AACtC,+DAA+B"}
@@ -0,0 +1,24 @@
1
+ import { Filter } from '@ptc-org/nestjs-query-core';
2
+ import { mongoose, ReturnModelType } from '@typegoose/typegoose';
3
+ import { ComparisonBuilder } from './comparison.builder';
4
+ /**
5
+ * @internal
6
+ * Builds a WHERE clause from a Filter.
7
+ */
8
+ export declare class WhereBuilder<Entity> {
9
+ readonly Model: ReturnModelType<new () => Entity>;
10
+ readonly comparisonBuilder: ComparisonBuilder<Entity>;
11
+ constructor(Model: ReturnModelType<new () => Entity>, comparisonBuilder?: ComparisonBuilder<Entity>);
12
+ /**
13
+ * Builds a WHERE clause from a Filter.
14
+ * @param filter - the filter to build the WHERE clause from.
15
+ */
16
+ build(filter: Filter<Entity>): mongoose.FilterQuery<new () => Entity>;
17
+ /**
18
+ * Creates field comparisons from a filter. This method will ignore and/or properties.
19
+ * @param filter - the filter with fields to create comparisons for.
20
+ */
21
+ private filterFields;
22
+ private getField;
23
+ private withFilterComparison;
24
+ }