mongodb-dynamic-api 2.8.3 → 2.9.0

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 (64) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/package.json +2 -2
  3. package/src/builders/route-decorators/route-decorators.builder.d.ts +2 -1
  4. package/src/builders/route-decorators/route-decorators.builder.js +7 -7
  5. package/src/builders/route-decorators/route-decorators.builder.js.map +1 -1
  6. package/src/guards/base-policies.guard.d.ts +2 -0
  7. package/src/guards/base-policies.guard.js +3 -0
  8. package/src/guards/base-policies.guard.js.map +1 -1
  9. package/src/helpers/swagger-config.helper.js +4 -0
  10. package/src/helpers/swagger-config.helper.js.map +1 -1
  11. package/src/index.d.ts +1 -0
  12. package/src/index.js +1 -0
  13. package/src/index.js.map +1 -1
  14. package/src/interfaces/dynamic-api-route-config.interface.d.ts +3 -0
  15. package/src/interfaces/dynamic-api-route-dtos-bundle.type.d.ts +1 -0
  16. package/src/interfaces/dynamic-api-service-before-save-callback.interface.d.ts +11 -0
  17. package/src/interfaces/dynamic-api-service-before-save-callback.interface.js +3 -0
  18. package/src/interfaces/dynamic-api-service-before-save-callback.interface.js.map +1 -0
  19. package/src/interfaces/dynamic-api-service-callback.interface.d.ts +2 -0
  20. package/src/interfaces/dynamic-api-swagger-options.type.d.ts +1 -0
  21. package/src/interfaces/index.d.ts +1 -0
  22. package/src/interfaces/index.js +1 -0
  23. package/src/interfaces/index.js.map +1 -1
  24. package/src/mixins/create-policies-guard.mixin.d.ts +2 -1
  25. package/src/mixins/create-policies-guard.mixin.js +2 -1
  26. package/src/mixins/create-policies-guard.mixin.js.map +1 -1
  27. package/src/routes/aggregate/aggregate-controller.interface.d.ts +1 -1
  28. package/src/routes/aggregate/aggregate-controller.mixin.d.ts +1 -1
  29. package/src/routes/aggregate/aggregate-controller.mixin.js +11 -10
  30. package/src/routes/aggregate/aggregate-controller.mixin.js.map +1 -1
  31. package/src/routes/aggregate/aggregate-gateway.interface.d.ts +1 -1
  32. package/src/routes/aggregate/aggregate-gateway.mixin.js +3 -3
  33. package/src/routes/aggregate/aggregate-gateway.mixin.js.map +1 -1
  34. package/src/routes/aggregate/aggregate-service.interface.d.ts +7 -2
  35. package/src/routes/aggregate/base-aggregate.service.d.ts +6 -1
  36. package/src/routes/aggregate/base-aggregate.service.js +25 -3
  37. package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
  38. package/src/routes/create-one/base-create-one.service.d.ts +2 -3
  39. package/src/routes/create-one/base-create-one.service.js +5 -1
  40. package/src/routes/create-one/base-create-one.service.js.map +1 -1
  41. package/src/routes/create-one/create-one.helper.d.ts +2 -2
  42. package/src/routes/create-one/create-one.helper.js +2 -1
  43. package/src/routes/create-one/create-one.helper.js.map +1 -1
  44. package/src/routes/create-one/create-one.module.js +1 -1
  45. package/src/routes/create-one/create-one.module.js.map +1 -1
  46. package/src/routes/update-one/base-update-one.service.d.ts +2 -1
  47. package/src/routes/update-one/base-update-one.service.js +12 -4
  48. package/src/routes/update-one/base-update-one.service.js.map +1 -1
  49. package/src/routes/update-one/update-one.helper.d.ts +2 -2
  50. package/src/routes/update-one/update-one.helper.js +2 -1
  51. package/src/routes/update-one/update-one.helper.js.map +1 -1
  52. package/src/routes/update-one/update-one.module.js +1 -1
  53. package/src/routes/update-one/update-one.module.js.map +1 -1
  54. package/src/services/base/base.service.d.ts +3 -0
  55. package/src/services/base/base.service.js +18 -0
  56. package/src/services/base/base.service.js.map +1 -1
  57. package/src/utils/deep-patial.d.ts +3 -0
  58. package/src/utils/deep-patial.js +3 -0
  59. package/src/utils/deep-patial.js.map +1 -0
  60. package/src/utils/index.d.ts +1 -0
  61. package/src/utils/index.js +18 -0
  62. package/src/utils/index.js.map +1 -0
  63. package/src/version.json +1 -1
  64. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  Changelog
2
2
 
3
+ ## [2.9.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v2.8.3...v2.9.0) (2025-02-16)
4
+
5
+
6
+ ### api
7
+
8
+ * **api:** add aggregate route ([e4b1a7ba](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e4b1a7ba61819bf20f531b619a5f46ce753dcb0b))
9
+ * **api:** add before save callback ([f5ba7b5a](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5ba7b5aed41804ef39894b3d333300c65f95e8b))
10
+
11
+
12
+ ### swagger
13
+
14
+ * **swagger:** add the possibility to write json file to another path ([a41356e8](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a41356e81da07d7abd5c8eec46855b38ba2aea44))
15
+
3
16
  ## [2.8.3](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v2.8.2...v2.8.3) (2024-09-07)
4
17
 
5
18
  ## [2.8.2](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v2.8.1...v2.8.2) (2024-09-01)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongodb-dynamic-api",
3
- "version": "2.8.3",
3
+ "version": "2.9.0",
4
4
  "description": "Auto generated CRUD API for MongoDB using NestJS",
5
5
  "readmeFilename": "README.md",
6
6
  "main": "index.js",
@@ -57,7 +57,7 @@
57
57
  "class-validator": "^0.14.1",
58
58
  "dotenv": "^16.4.5",
59
59
  "lodash": "^4.17.21",
60
- "mongodb-pipeline-builder": "^4.0.0",
60
+ "mongodb-pipeline-builder": "^4.0.2",
61
61
  "mongoose": "^8.1.1",
62
62
  "passport": "^0.7.0",
63
63
  "passport-jwt": "^4.0.1",
@@ -9,13 +9,14 @@ declare class RouteDecoratorsBuilder<Entity extends BaseEntity> implements Dynam
9
9
  private readonly description;
10
10
  private readonly isPublic;
11
11
  private readonly dTOs;
12
+ private readonly isArrayResponse;
12
13
  private readonly responseRouteTypeIsArray;
13
14
  private readonly bodyRouteTypeIsOptional;
14
15
  constructor(routeType: RouteType, entity: Type<Entity>, subPath: string | undefined, version: string | undefined, description: string | undefined, isPublic: boolean | undefined, dTOs?: {
15
16
  param?: Type;
16
17
  body?: Type;
17
18
  presenter?: Type;
18
- });
19
+ }, isArrayResponse?: boolean);
19
20
  build(): any[];
20
21
  private getRouteDecorators;
21
22
  private getApiDecorators;
@@ -8,7 +8,7 @@ const decorators_1 = require("../../decorators");
8
8
  const dynamic_api_module_1 = require("../../dynamic-api.module");
9
9
  const helpers_1 = require("../../helpers");
10
10
  class RouteDecoratorsBuilder {
11
- constructor(routeType, entity, subPath, version, description, isPublic, dTOs = {}) {
11
+ constructor(routeType, entity, subPath, version, description, isPublic, dTOs = {}, isArrayResponse = false) {
12
12
  this.routeType = routeType;
13
13
  this.entity = entity;
14
14
  this.subPath = subPath;
@@ -16,11 +16,11 @@ class RouteDecoratorsBuilder {
16
16
  this.description = description;
17
17
  this.isPublic = isPublic;
18
18
  this.dTOs = dTOs;
19
+ this.isArrayResponse = isArrayResponse;
19
20
  this.responseRouteTypeIsArray = [
20
21
  'GetMany',
21
22
  'CreateMany',
22
23
  'DuplicateMany',
23
- 'Aggregate',
24
24
  ];
25
25
  this.bodyRouteTypeIsOptional = [
26
26
  'DuplicateOne',
@@ -67,22 +67,22 @@ class RouteDecoratorsBuilder {
67
67
  routeDecorators.push((0, common_1.Patch)(subPath));
68
68
  break;
69
69
  case 'UpdateOne':
70
- routeDecorators.push((0, common_1.Patch)(`${addSubPath()}:${paramKey}`));
70
+ routeDecorators.push((0, common_1.Patch)(`:${paramKey}${addSubPath(false)}`));
71
71
  break;
72
72
  case 'ReplaceOne':
73
- routeDecorators.push((0, common_1.Put)(`${addSubPath()}:${paramKey}`));
73
+ routeDecorators.push((0, common_1.Put)(`:${paramKey}${addSubPath(false)}`));
74
74
  break;
75
75
  case 'DuplicateMany':
76
76
  routeDecorators.push((0, common_1.Post)(`duplicate${addSubPath(false)}`));
77
77
  break;
78
78
  case 'DuplicateOne':
79
- routeDecorators.push((0, common_1.Post)(`duplicate${addSubPath(false)}/:${paramKey}`));
79
+ routeDecorators.push((0, common_1.Post)(`duplicate/:${paramKey}${addSubPath(false)}`));
80
80
  break;
81
81
  case 'DeleteMany':
82
82
  routeDecorators.push((0, common_1.Delete)(subPath));
83
83
  break;
84
84
  case 'DeleteOne':
85
- routeDecorators.push((0, common_1.Delete)(`${addSubPath()}:${paramKey}`));
85
+ routeDecorators.push((0, common_1.Delete)(`:${paramKey}${addSubPath(false)}`));
86
86
  break;
87
87
  case 'Aggregate':
88
88
  routeDecorators.push((0, common_1.Get)(subPath));
@@ -102,7 +102,7 @@ class RouteDecoratorsBuilder {
102
102
  }),
103
103
  (0, swagger_1.ApiResponse)({
104
104
  type: this.dTOs.presenter ?? this.entity,
105
- isArray: this.responseRouteTypeIsArray.includes(this.routeType),
105
+ isArray: this.responseRouteTypeIsArray.includes(this.routeType) || this.isArrayResponse,
106
106
  }),
107
107
  ...(this.dTOs.body ? [
108
108
  (0, swagger_1.ApiBody)({
@@ -1 +1 @@
1
- {"version":3,"file":"route-decorators.builder.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/builders/route-decorators/route-decorators.builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route-decorators.builder.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/builders/route-decorators/route-decorators.builder.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
25
  import { CanActivate, ExecutionContext, Type } from '@nestjs/common';
26
+ import { PipelineStage } from 'mongodb-pipeline-builder';
26
27
  import { Model } from 'mongoose';
27
28
  import { AbilityPredicate, RouteType } from '../interfaces';
28
29
  import { BaseEntity } from '../models';
@@ -32,6 +33,7 @@ export declare abstract class BasePoliciesGuard<Entity extends BaseEntity> exten
32
33
  protected routeType: RouteType;
33
34
  protected entity: Type<Entity>;
34
35
  protected abilityPredicate: AbilityPredicate<Entity> | undefined;
36
+ protected queryToPipeline?: (query: unknown) => PipelineStage[];
35
37
  protected constructor(model: Model<Entity>);
36
38
  canActivate(context: ExecutionContext): Promise<boolean>;
37
39
  }
@@ -18,6 +18,9 @@ class BasePoliciesGuard extends services_1.BaseService {
18
18
  if (params?.id) {
19
19
  await this.findOneDocumentWithAbilityPredicate(params.id, query);
20
20
  }
21
+ else if (this.routeType === 'Aggregate' && query && this.queryToPipeline) {
22
+ await this.aggregateDocumentsWithAbilityPredicate(this.queryToPipeline(query));
23
+ }
21
24
  else {
22
25
  await this.findManyDocumentsWithAbilityPredicate(query);
23
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":";;;AAAA,2CAAyF;AAIzF,0CAA0C;AAE1C,MAAsB,iBAA6C,SAAQ,sBAAmB;IAO5F,YAAyC,KAAoB;QAC3D,KAAK,CAAC,KAAK,CAAC,CAAC;QAD0B,UAAK,GAAL,KAAK,CAAe;IAE7D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAElE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,2BAAkB,CAAC,eAAe,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAEjB,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,mCAAmC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA9BD,8CA8BC"}
1
+ {"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":";;;AAAA,2CAAyF;AAKzF,0CAA0C;AAE1C,MAAsB,iBAA6C,SAAQ,sBAAmB;IAS5F,YAAyC,KAAoB;QAC3D,KAAK,CAAC,KAAK,CAAC,CAAC;QAD0B,UAAK,GAAL,KAAK,CAAe;IAE7D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAElE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,2BAAkB,CAAC,eAAe,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAEjB,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,mCAAmC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3E,MAAM,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAlCD,8CAkCC"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.enableDynamicAPISwagger = void 0;
4
4
  const swagger_1 = require("@nestjs/swagger");
5
+ const fs = require("node:fs");
5
6
  const version_json_1 = require("../version.json");
6
7
  function buildExtraConfig(config, swaggerConfig) {
7
8
  Object.keys(swaggerConfig).forEach((key) => {
@@ -106,6 +107,9 @@ function enableDynamicAPISwagger(app, options) {
106
107
  buildExtraConfig(config, swaggerExtraConfig);
107
108
  }
108
109
  const document = swagger_1.SwaggerModule.createDocument(app, config.build(), swaggerDocumentOptions);
110
+ if (options?.jsonFilePath) {
111
+ fs.writeFileSync(options?.jsonFilePath, JSON.stringify(document, null, 2));
112
+ }
109
113
  swagger_1.SwaggerModule.setup(path, app, document);
110
114
  }
111
115
  exports.enableDynamicAPISwagger = enableDynamicAPISwagger;
@@ -1 +1 @@
1
- {"version":3,"file":"swagger-config.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/swagger-config.helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swagger-config.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/swagger-config.helper.ts"],"names":[],"mappings":"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"}
package/src/index.d.ts CHANGED
@@ -10,4 +10,5 @@ export * from './mixins';
10
10
  export * from './models';
11
11
  export * from './routes';
12
12
  export * from './services';
13
+ export * from './utils';
13
14
  export * from './dynamic-api.module';
package/src/index.js CHANGED
@@ -26,5 +26,6 @@ __exportStar(require("./mixins"), exports);
26
26
  __exportStar(require("./models"), exports);
27
27
  __exportStar(require("./routes"), exports);
28
28
  __exportStar(require("./services"), exports);
29
+ __exportStar(require("./utils"), exports);
29
30
  __exportStar(require("./dynamic-api.module"), exports);
30
31
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB;AACzB,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,6CAA2B;AAC3B,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB;AACzB,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,uDAAqC"}
@@ -3,6 +3,7 @@ import { BaseEntity } from '../models';
3
3
  import { AbilityPredicate } from './dynamic-api-ability.interface';
4
4
  import { DTOsBundle } from './dynamic-api-route-dtos-bundle.type';
5
5
  import { RouteType } from './dynamic-api-route-type.type';
6
+ import { DynamicApiServiceBeforeSaveCallback } from './dynamic-api-service-before-save-callback.interface';
6
7
  import { DynamicApiServiceCallback } from './dynamic-api-service-callback.interface';
7
8
  import { DynamicApiWebSocketOptions } from './dynamic-api-web-socket.interface';
8
9
  interface DynamicAPIRouteConfig<Entity extends BaseEntity> {
@@ -14,8 +15,10 @@ interface DynamicAPIRouteConfig<Entity extends BaseEntity> {
14
15
  dTOs?: DTOsBundle;
15
16
  validationPipeOptions?: ValidationPipeOptions;
16
17
  abilityPredicate?: AbilityPredicate<Entity>;
18
+ beforeSaveCallback?: DynamicApiServiceBeforeSaveCallback<Entity>;
17
19
  callback?: DynamicApiServiceCallback<Entity>;
18
20
  webSocket?: DynamicApiWebSocketOptions;
19
21
  eventName?: string;
22
+ isArrayResponse?: boolean;
20
23
  }
21
24
  export { DynamicAPIRouteConfig };
@@ -7,6 +7,7 @@ interface Mappable<Entity> {
7
7
  fromDeleteResult?: <Presenter = any>(result: DeleteResult) => Presenter;
8
8
  fromEntity?: <Presenter = any>(entity: Entity) => Presenter;
9
9
  fromEntities?: <Presenter = any>(entities: Entity[]) => Presenter[];
10
+ fromAggregate?: <Presenter = any>(entities: Entity[], count: number, totalPage: number) => Presenter;
10
11
  }
11
12
  interface Aggregatable<Query> {
12
13
  toPipeline?: (query: Query) => PipelineStage[];
@@ -0,0 +1,11 @@
1
+ import { BaseEntity } from '../models';
2
+ import { DynamicApiCallbackMethods } from './dynamic-api-service-callback.interface';
3
+ type DynamicApiServiceBeforeSaveCreateContext<Entity extends BaseEntity> = {
4
+ toCreate: Partial<Entity>;
5
+ };
6
+ type DynamicApiServiceBeforeSaveUpdateContext<Entity extends BaseEntity> = {
7
+ id: string;
8
+ update: Partial<Entity>;
9
+ };
10
+ type DynamicApiServiceBeforeSaveCallback<Entity extends BaseEntity, Context = Record<string, unknown>> = (entity: Entity | undefined, context: Context, methods: DynamicApiCallbackMethods) => Promise<Partial<Entity>>;
11
+ export type { DynamicApiServiceBeforeSaveCallback, DynamicApiServiceBeforeSaveCreateContext, DynamicApiServiceBeforeSaveUpdateContext, };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=dynamic-api-service-before-save-callback.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-api-service-before-save-callback.interface.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/dynamic-api-service-before-save-callback.interface.ts"],"names":[],"mappings":""}
@@ -23,6 +23,7 @@
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
25
  import { Type } from '@nestjs/common';
26
+ import { PipelineStage } from 'mongodb-pipeline-builder';
26
27
  import { FilterQuery, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose';
27
28
  import { BaseEntity } from '../models';
28
29
  import { DeleteResult, UpdateResult } from './dynamic-api-route-response.type';
@@ -35,6 +36,7 @@ type DynamicApiCallbackMethods = {
35
36
  updateOneDocument<T>(entity: Type<T>, query: FilterQuery<T>, update: UpdateQuery<T> | UpdateWithAggregationPipeline): Promise<UpdateResult>;
36
37
  deleteManyDocuments<T>(entity: Type<T>, ids: string[]): Promise<DeleteResult>;
37
38
  deleteOneDocument<T>(entity: Type<T>, id: string): Promise<DeleteResult>;
39
+ aggregateDocuments<T>(entity: Type<T>, pipeline: PipelineStage[]): Promise<T[]>;
38
40
  };
39
41
  type DynamicApiServiceCallback<Entity extends BaseEntity> = (entity: Entity, methods: DynamicApiCallbackMethods) => Promise<void>;
40
42
  type DynamicApiResetPasswordCallbackMethods<Entity extends BaseEntity, UpdateBy = 'userId'> = {
@@ -63,6 +63,7 @@ type DynamicAPISwaggerOptions = {
63
63
  description?: string;
64
64
  version?: string;
65
65
  path?: string;
66
+ jsonFilePath?: string;
66
67
  swaggerExtraConfig?: DynamicAPISwaggerExtraConfig;
67
68
  swaggerDocumentOptions?: SwaggerDocumentOptions;
68
69
  };
@@ -12,6 +12,7 @@ export * from './dynamic-api-route-module.type';
12
12
  export * from './dynamic-api-route-response.type';
13
13
  export * from './dynamic-api-route-type.type';
14
14
  export * from './dynamic-api-schema-options.interface';
15
+ export * from './dynamic-api-service-before-save-callback.interface';
15
16
  export * from './dynamic-api-service-callback.interface';
16
17
  export * from './dynamic-api-service-provider.interface';
17
18
  export * from './dynamic-api-swagger-options.type';
@@ -28,6 +28,7 @@ __exportStar(require("./dynamic-api-route-module.type"), exports);
28
28
  __exportStar(require("./dynamic-api-route-response.type"), exports);
29
29
  __exportStar(require("./dynamic-api-route-type.type"), exports);
30
30
  __exportStar(require("./dynamic-api-schema-options.interface"), exports);
31
+ __exportStar(require("./dynamic-api-service-before-save-callback.interface"), exports);
31
32
  __exportStar(require("./dynamic-api-service-callback.interface"), exports);
32
33
  __exportStar(require("./dynamic-api-service-provider.interface"), exports);
33
34
  __exportStar(require("./dynamic-api-swagger-options.type"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6EAA2D;AAC3D,4EAA0D;AAC1D,wEAAsD;AACtD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,uEAAqD;AACrD,kEAAgD;AAChD,oEAAkD;AAClD,gEAA8C;AAC9C,yEAAuD;AACvD,2EAAyD;AACzD,2EAAyD;AACzD,qEAAmD;AACnD,qEAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6EAA2D;AAC3D,4EAA0D;AAC1D,wEAAsD;AACtD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,uEAAqD;AACrD,kEAAgD;AAChD,oEAAkD;AAClD,gEAA8C;AAC9C,yEAAuD;AACvD,uFAAqE;AACrE,2EAAyD;AACzD,2EAAyD;AACzD,qEAAmD;AACnD,qEAAmD"}
@@ -1,5 +1,6 @@
1
1
  import { Type } from '@nestjs/common';
2
+ import { PipelineStage } from 'mongodb-pipeline-builder';
2
3
  import { AbilityPredicate, PoliciesGuardConstructor, RouteType } from '../interfaces';
3
4
  import { BaseEntity } from '../models';
4
- declare function CreatePoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, displayedName: string, version: string | undefined, abilityPredicate: AbilityPredicate<Entity> | undefined): PoliciesGuardConstructor<Entity>;
5
+ declare function CreatePoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, displayedName: string, version: string | undefined, abilityPredicate: AbilityPredicate<Entity> | undefined, queryToPipeline?: (query: unknown) => PipelineStage[]): PoliciesGuardConstructor<Entity>;
5
6
  export { CreatePoliciesGuardMixin };
@@ -19,7 +19,7 @@ const mongoose_2 = require("mongoose");
19
19
  const dynamic_api_module_1 = require("../dynamic-api.module");
20
20
  const guards_1 = require("../guards");
21
21
  const helpers_1 = require("../helpers");
22
- function CreatePoliciesGuardMixin(entity, routeType, displayedName, version, abilityPredicate) {
22
+ function CreatePoliciesGuardMixin(entity, routeType, displayedName, version, abilityPredicate, queryToPipeline) {
23
23
  let RoutePoliciesGuard = class RoutePoliciesGuard extends guards_1.BasePoliciesGuard {
24
24
  constructor(model) {
25
25
  super(model);
@@ -27,6 +27,7 @@ function CreatePoliciesGuardMixin(entity, routeType, displayedName, version, abi
27
27
  this.routeType = routeType;
28
28
  this.entity = entity;
29
29
  this.abilityPredicate = abilityPredicate;
30
+ this.queryToPipeline = queryToPipeline;
30
31
  }
31
32
  };
32
33
  RoutePoliciesGuard = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"create-policies-guard.mixin.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/mixins/create-policies-guard.mixin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkD;AAClD,+CAA+C;AAC/C,uCAAiC;AACjC,8DAAyD;AACzD,sCAA8C;AAC9C,wCAAyC;AASzC,SAAS,wBAAwB,CAC/B,MAAoB,EACpB,SAAoB,EACpB,aAAqB,EACrB,OAA2B,EAC3B,gBAAsD;IAEtD,IACM,kBAAkB,GADxB,MACM,kBAAmB,SAAQ,0BAAyB;QAKxD,YAKE,KAAuC;YAEvC,KAAK,CAAC,KAAK,CAAC,CAAC;YAFM,UAAK,GAAL,KAAK,CAAe;YAT/B,cAAS,GAAG,SAAS,CAAC;YACtB,WAAM,GAAG,MAAM,CAAC;YAChB,qBAAgB,GAAyC,gBAAgB,CAAC;QAUpF,CAAC;KACF,CAAA;IAdK,kBAAkB;QADvB,IAAA,mBAAU,GAAE;QAOR,WAAA,IAAA,sBAAW,EACV,MAAM,CAAC,IAAI,EACX,qCAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC7C,CAAA;yCACyB,gBAAK;OAV7B,kBAAkB,CAcvB;IAED,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,MAAM,EAAE;QAChD,KAAK,EAAE,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE;QAC3E,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAEQ,4DAAwB"}
1
+ {"version":3,"file":"create-policies-guard.mixin.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/mixins/create-policies-guard.mixin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkD;AAClD,+CAA+C;AAE/C,uCAAiC;AACjC,8DAAyD;AACzD,sCAA8C;AAC9C,wCAAyC;AASzC,SAAS,wBAAwB,CAC/B,MAAoB,EACpB,SAAoB,EACpB,aAAqB,EACrB,OAA2B,EAC3B,gBAAsD,EACtD,eAAqD;IAErD,IACM,kBAAkB,GADxB,MACM,kBAAmB,SAAQ,0BAAyB;QAMxD,YAKE,KAAuC;YAEvC,KAAK,CAAC,KAAK,CAAC,CAAC;YAFM,UAAK,GAAL,KAAK,CAAe;YAV/B,cAAS,GAAG,SAAS,CAAC;YACtB,WAAM,GAAG,MAAM,CAAC;YAChB,qBAAgB,GAAyC,gBAAgB,CAAC;YAC1E,oBAAe,GAAG,eAAe,CAAC;QAU5C,CAAC;KACF,CAAA;IAfK,kBAAkB;QADvB,IAAA,mBAAU,GAAE;QAQR,WAAA,IAAA,sBAAW,EACV,MAAM,CAAC,IAAI,EACX,qCAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC7C,CAAA;yCACyB,gBAAK;OAX7B,kBAAkB,CAevB;IAED,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,MAAM,EAAE;QAChD,KAAK,EAAE,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE;QAC3E,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAEQ,4DAAwB"}
@@ -1,7 +1,7 @@
1
1
  import { BaseEntity } from '../../models';
2
2
  import { AggregateService } from './aggregate-service.interface';
3
3
  interface AggregateController<Entity extends BaseEntity, Query = any, Response = any> {
4
- aggregate(query: Query): Promise<(Entity | Response)[]>;
4
+ aggregate(query: Query): Promise<Entity[] | Response[] | Response>;
5
5
  }
6
6
  type AggregateControllerConstructor<Entity extends BaseEntity> = new (service: AggregateService<Entity>) => AggregateController<Entity>;
7
7
  export type { AggregateController, AggregateControllerConstructor };
@@ -2,5 +2,5 @@ import { Type } from '@nestjs/common';
2
2
  import { DynamicApiControllerOptions, DynamicAPIRouteConfig } from '../../interfaces';
3
3
  import { BaseEntity } from '../../models';
4
4
  import { AggregateControllerConstructor } from './aggregate-controller.interface';
5
- declare function AggregateControllerMixin<Entity extends BaseEntity>(entity: Type<Entity>, controllerOptions: DynamicApiControllerOptions<Entity>, { dTOs, ...routeConfig }: DynamicAPIRouteConfig<Entity>, version?: string): AggregateControllerConstructor<Entity>;
5
+ declare function AggregateControllerMixin<Entity extends BaseEntity>(entity: Type<Entity>, controllerOptions: DynamicApiControllerOptions<Entity>, { dTOs, isArrayResponse, ...routeConfig }: DynamicAPIRouteConfig<Entity>, version?: string): AggregateControllerConstructor<Entity>;
6
6
  export { AggregateControllerMixin };
@@ -14,12 +14,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.AggregateControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
- const lodash_1 = require("lodash");
18
17
  const builders_1 = require("../../builders");
19
18
  const helpers_1 = require("../../helpers");
20
19
  const mixins_1 = require("../../mixins");
21
20
  const aggregate_presenter_mixin_1 = require("./aggregate-presenter.mixin");
22
- function AggregateControllerMixin(entity, controllerOptions, { dTOs, ...routeConfig }, version) {
21
+ function AggregateControllerMixin(entity, controllerOptions, { dTOs, isArrayResponse, ...routeConfig }, version) {
23
22
  const { routeType, displayedName, description, isPublic, abilityPredicate, } = (0, helpers_1.getMixinData)(entity, controllerOptions, routeConfig);
24
23
  if (!dTOs?.query) {
25
24
  throw new common_1.BadRequestException('Query DTO is required');
@@ -40,8 +39,9 @@ function AggregateControllerMixin(entity, controllerOptions, { dTOs, ...routeCon
40
39
  });
41
40
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, routeConfig.subPath, version, description, isPublic, {
42
41
  presenter: AggregatePresenter,
43
- });
44
- class AggregatePoliciesGuard extends (0, mixins_1.CreatePoliciesGuardMixin)(entity, routeType, displayedName, version, abilityPredicate) {
42
+ }, isArrayResponse);
43
+ const toPipeline = AggregateQuery.toPipeline;
44
+ class AggregatePoliciesGuard extends (0, mixins_1.CreatePoliciesGuardMixin)(entity, routeType, displayedName, version, abilityPredicate, toPipeline) {
45
45
  }
46
46
  class BaseAggregateController {
47
47
  constructor(service) {
@@ -49,16 +49,17 @@ function AggregateControllerMixin(entity, controllerOptions, { dTOs, ...routeCon
49
49
  this.entity = entity;
50
50
  }
51
51
  async aggregate(query) {
52
- if ((0, lodash_1.isEmpty)(query)) {
53
- throw new common_1.BadRequestException('Invalid query');
54
- }
55
52
  const toPipeline = AggregateQuery.toPipeline;
56
53
  if (!toPipeline) {
57
54
  throw new common_1.BadRequestException('Query DTO must have toPipeline static method');
58
55
  }
59
- const list = await this.service.aggregate(toPipeline(query));
60
- const fromEntities = AggregatePresenter.fromEntities;
61
- return fromEntities ? fromEntities(list) : list;
56
+ const pipelineBuilt = toPipeline(query);
57
+ if (!pipelineBuilt.length) {
58
+ throw new common_1.BadRequestException('Invalid pipeline, no stages found');
59
+ }
60
+ const { list, count, totalPage } = await this.service.aggregate(pipelineBuilt);
61
+ const fromAggregate = AggregatePresenter.fromAggregate;
62
+ return fromAggregate ? fromAggregate(list, count, totalPage) : list;
62
63
  }
63
64
  }
64
65
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate-controller.mixin.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/aggregate-controller.mixin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregate-controller.mixin.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/aggregate-controller.mixin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA6E;AAC7E,6CAAwD;AACxD,2CAAmG;AAEnG,yCAAwD;AAGxD,2EAAsE;AAGtE,SAAS,wBAAwB,CAC/B,MAAoB,EACpB,iBAAsD,EACtD,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,WAAW,EAAiC,EACxE,OAAgB;IAEhB,MAAM,EACJ,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,EACR,gBAAgB,GACjB,GAAG,IAAA,sBAAY,EACd,MAAM,EACN,iBAAiB,EACjB,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,4BAAmB,CAAC,uBAAuB,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,cAAe,SAAQ,IAAI,CAAC,KAAK;KAAG;IAE1C,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE;QAC5C,KAAK,EAAE,YAAY,aAAa,GAAG,IAAA,0BAAgB,EAAC,OAAO,CAAC,OAAO;QACnE,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,kBAAmB,SAAQ,IAAA,mDAAuB,EAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC;KAAG;IAEpF,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,MAAM,EAAE;QAChD,KAAK,EAAE,IAAI,EAAE,SAAS;YACpB,CAAC,CAAC,GAAG,SAAS,GAAG,aAAa,GAAG,IAAA,0BAAgB,EAAC,OAAO,CAAC,WAAW;YACrE,CAAC,CAAC,GAAG,aAAa,GAAG,IAAA,0BAAgB,EAAC,OAAO,CAAC,WAAW;QAC3D,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,IAAI,iCAAsB,CACvD,SAAS,EACT,MAAM,EACN,WAAW,CAAC,OAAO,EACnB,OAAO,EACP,WAAW,EACX,QAAQ,EACR;QACE,SAAS,EAAE,kBAAkB;KAC9B,EACD,eAAe,CAChB,CAAC;IAEF,MAAM,UAAU,GACd,cACD,CAAC,UAAU,CAAC;IAEb,MAAM,sBAAuB,SAAQ,IAAA,iCAAwB,EAC3D,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,UAAU,CACX;KAAG;IAEJ,MAAM,uBAAuB;QAG3B,YACqB,OAAiC;YAAjC,YAAO,GAAP,OAAO,CAA0B;YAHnC,WAAM,GAAG,MAAM,CAAC;QAIhC,CAAC;QAIE,AAAN,KAAK,CAAC,SAAS,CAAU,KAAqB;YAC5C,MAAM,UAAU,GACd,cACD,CAAC,UAAU,CAAC;YAEb,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,4BAAmB,CAAC,8CAA8C,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAExC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,4BAAmB,CAAC,mCAAmC,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAE/E,MAAM,aAAa,GACjB,kBACD,CAAC,aAAa,CAAC;YAEhB,OAAO,aAAa,CAAC,CAAC,CAAC,aAAa,CAAqB,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1F,CAAC;KACF;IAvBO;QAFL,IAAA,+BAAqB,EAAC,sBAAsB,CAAC;QAC7C,IAAA,kBAAS,EAAC,sBAAsB,CAAC;QACjB,WAAA,IAAA,cAAK,GAAE,CAAA;;yCAAQ,cAAc;;4DAsB7C;IAGH,MAAM,CAAC,cAAc,CAAC,uBAAuB,EAAE,MAAM,EAAE;QACrD,KAAK,EAAE,OAAO,IAAA,qBAAW,EAAC,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE;QAC9E,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAEQ,4DAAwB"}
@@ -3,7 +3,7 @@ import { ExtendedSocket, GatewayResponse } from '../../interfaces';
3
3
  import { BaseEntity } from '../../models';
4
4
  import { AggregateService } from './aggregate-service.interface';
5
5
  interface AggregateGateway<Entity extends BaseEntity, Data = any, Response = any> {
6
- aggregate(socket: ExtendedSocket, body: Data): GatewayResponse<(Entity | Response)[]>;
6
+ aggregate(socket: ExtendedSocket, body: Data): GatewayResponse<Entity[] | Response[] | Response>;
7
7
  }
8
8
  type AggregateGatewayConstructor<Entity extends BaseEntity> = new (service: AggregateService<Entity>, jwtService: JwtService) => AggregateGateway<Entity>;
9
9
  export type { AggregateGateway, AggregateGatewayConstructor };
@@ -55,11 +55,11 @@ function AggregateGatewayMixin(entity, controllerOptions, { dTOs, ...routeConfig
55
55
  throw new websockets_1.WsException('Query DTO must have toPipeline static method');
56
56
  }
57
57
  this.addUserToSocket(socket, isPublic);
58
- const list = await this.service.aggregate(toPipeline(body));
59
- const fromEntities = AggregateResponse.fromEntities;
58
+ const { list, count, totalPage } = await this.service.aggregate(toPipeline(body));
59
+ const fromAggregate = AggregateResponse.fromAggregate;
60
60
  return {
61
61
  event,
62
- data: fromEntities ? fromEntities(list) : list,
62
+ data: fromAggregate ? fromAggregate(list, count, totalPage) : list,
63
63
  };
64
64
  }
65
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate-gateway.mixin.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/aggregate-gateway.mixin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregate-gateway.mixin.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/aggregate-gateway.mixin.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import { PipelineStage } from 'mongodb-pipeline-builder';
2
2
  import { BaseEntity } from '../../models';
3
+ type AggregateServiceResponse<Entity extends BaseEntity> = {
4
+ list: Entity[];
5
+ count: number;
6
+ totalPage: number;
7
+ };
3
8
  interface AggregateService<Entity extends BaseEntity> {
4
- aggregate(pipeline: PipelineStage[]): Promise<Entity[]>;
9
+ aggregate(pipeline: PipelineStage[]): Promise<AggregateServiceResponse<Entity>>;
5
10
  }
6
- export type { AggregateService };
11
+ export type { AggregateService, AggregateServiceResponse };
@@ -34,5 +34,10 @@ export declare abstract class BaseAggregateService<Entity extends BaseEntity> ex
34
34
  protected readonly entity: Type<Entity>;
35
35
  protected readonly callback: DynamicApiServiceCallback<Entity> | undefined;
36
36
  protected constructor(model: Model<Entity>);
37
- aggregate(pipeline: PipelineStage[]): Promise<Entity[]>;
37
+ aggregate(pipeline: PipelineStage[]): Promise<{
38
+ list: Entity[];
39
+ count: number;
40
+ totalPage: number;
41
+ }>;
42
+ private withPagination;
38
43
  }
@@ -10,18 +10,40 @@ class BaseAggregateService extends services_1.BaseService {
10
10
  }
11
11
  async aggregate(pipeline) {
12
12
  try {
13
- const result = await (0, mongodb_pipeline_builder_1.GetResult)(this.model, pipeline);
14
- const documents = result.GetDocs();
13
+ let documents;
14
+ let count;
15
+ let totalPage;
16
+ if (this.withPagination(pipeline)) {
17
+ const pagingResult = await (0, mongodb_pipeline_builder_1.GetPagingResult)(this.model, pipeline);
18
+ documents = pagingResult.GetDocs();
19
+ count = pagingResult.GetCount();
20
+ totalPage = pagingResult.GetTotalPageNumber();
21
+ }
22
+ else {
23
+ const result = await (0, mongodb_pipeline_builder_1.GetResult)(this.model, pipeline);
24
+ documents = result.GetDocs();
25
+ count = result.GetCount();
26
+ totalPage = 1;
27
+ }
15
28
  if (this.callback && documents.length) {
16
29
  await Promise.all(documents.map((document) => this.callback(document, this.callbackMethods)));
17
30
  }
18
- return documents.map((d) => this.buildInstance(d));
31
+ return { list: documents.map((d) => this.buildInstance(d)), count, totalPage };
19
32
  }
20
33
  catch (error) {
21
34
  this.handleMongoErrors(error, false);
22
35
  this.handleDuplicateKeyError(error);
23
36
  }
24
37
  }
38
+ withPagination(pipeline) {
39
+ const firstStageFacet = pipeline[0].$facet;
40
+ if (!firstStageFacet) {
41
+ return false;
42
+ }
43
+ const hasValidDocs = Array.isArray(firstStageFacet.docs) && firstStageFacet.docs.length > 0;
44
+ const hasValidCount = Array.isArray(firstStageFacet.count) && firstStageFacet.count.length > 0;
45
+ return hasValidDocs && hasValidCount;
46
+ }
25
47
  }
26
48
  exports.BaseAggregateService = BaseAggregateService;
27
49
  //# sourceMappingURL=base-aggregate.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-aggregate.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/base-aggregate.service.ts"],"names":[],"mappings":";;;AACA,uEAAoE;AAIpE,6CAA6C;AAG7C,MAAsB,oBACpB,SAAQ,sBAAmB;IAM3B,YAAyC,KAAoB;QAC3D,KAAK,CAAC,KAAK,CAAC,CAAC;QAD0B,UAAK,GAAL,KAAK,CAAe;IAE7D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAyB;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAS,EAAS,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAEnC,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CACX,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAC5D,CACF,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF;AA9BD,oDA8BC"}
1
+ {"version":3,"file":"base-aggregate.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/routes/aggregate/base-aggregate.service.ts"],"names":[],"mappings":";;;AACA,uEAAqF;AAIrF,6CAA6C;AAG7C,MAAsB,oBACpB,SAAQ,sBAAmB;IAM3B,YAAyC,KAAoB;QAC3D,KAAK,CAAC,KAAK,CAAC,CAAC;QAD0B,UAAK,GAAL,KAAK,CAAe;IAE7D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAyB;QACvC,IAAI,CAAC;YACH,IAAI,SAAmB,CAAC;YACxB,IAAI,KAAa,CAAC;YAClB,IAAI,SAAiB,CAAC;YAEtB,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,YAAY,GAAG,MAAM,IAAA,0CAAe,EAAS,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACzE,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;gBACnC,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAChC,SAAS,GAAG,YAAY,CAAC,kBAAkB,EAAE,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAS,EAAS,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC7D,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC7B,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,SAAS,GAAG,CAAC,CAAC;YAChB,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CACX,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAC5D,CACF,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACjF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,QAAyB;QAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5F,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAE/F,OAAO,YAAY,IAAI,aAAa,CAAC;IACvC,CAAC;CACF;AAvDD,oDAuDC"}
@@ -22,15 +22,14 @@
22
22
  /// <reference types="mongoose/types/validation" />
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
- import { Type } from '@nestjs/common';
26
25
  import { Model } from 'mongoose';
27
- import { DynamicApiServiceCallback } from '../../interfaces';
26
+ import { DynamicApiServiceBeforeSaveCallback, DynamicApiServiceBeforeSaveCreateContext, DynamicApiServiceCallback } from '../../interfaces';
28
27
  import { BaseEntity } from '../../models';
29
28
  import { BaseService } from '../../services';
30
29
  import { CreateOneService } from './create-one-service.interface';
31
30
  export declare abstract class BaseCreateOneService<Entity extends BaseEntity> extends BaseService<Entity> implements CreateOneService<Entity> {
32
31
  protected readonly model: Model<Entity>;
33
- protected readonly entity: Type<Entity>;
32
+ protected readonly beforeSaveCallback: DynamicApiServiceBeforeSaveCallback<Entity, DynamicApiServiceBeforeSaveCreateContext<Entity>> | undefined;
34
33
  protected readonly callback: DynamicApiServiceCallback<Entity> | undefined;
35
34
  protected constructor(model: Model<Entity>);
36
35
  createOne(partial: Partial<Entity>): Promise<Entity>;