mongodb-dynamic-api 2.2.1 → 2.3.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 (52) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +3 -1
  3. package/src/decorators/api-endpoint-visibility.decorator.d.ts +3 -0
  4. package/src/decorators/api-endpoint-visibility.decorator.js +10 -0
  5. package/src/decorators/index.d.ts +1 -0
  6. package/src/decorators/index.js +1 -0
  7. package/src/dynamic-api.module.js +1 -4
  8. package/src/helpers/index.d.ts +2 -0
  9. package/src/helpers/index.js +2 -0
  10. package/src/interfaces/dynamic-api-service-callback.interface.d.ts +14 -27
  11. package/src/modules/auth/auth.helper.d.ts +3 -3
  12. package/src/modules/auth/auth.helper.js +4 -3
  13. package/src/modules/auth/auth.module.d.ts +1 -1
  14. package/src/modules/auth/auth.module.js +7 -3
  15. package/src/modules/auth/dtos/change-password.dto.d.ts +4 -0
  16. package/src/modules/auth/dtos/change-password.dto.js +29 -0
  17. package/src/modules/auth/dtos/reset-password.dto.d.ts +3 -0
  18. package/src/modules/auth/dtos/reset-password.dto.js +24 -0
  19. package/src/modules/auth/interfaces/auth-options.interface.d.ts +9 -2
  20. package/src/modules/auth/interfaces/auth-service.interface.d.ts +2 -1
  21. package/src/modules/auth/mixins/auth-controller.mixin.d.ts +2 -2
  22. package/src/modules/auth/mixins/auth-controller.mixin.js +28 -2
  23. package/src/modules/auth/services/base-auth.service.d.ts +6 -3
  24. package/src/modules/auth/services/base-auth.service.js +64 -6
  25. package/src/routes/create-many/base-create-many.service.js +1 -1
  26. package/src/routes/create-many/create-many-controller.mixin.js +1 -2
  27. package/src/routes/create-many/create-many.helper.js +1 -0
  28. package/src/routes/create-many/create-many.module.d.ts +1 -1
  29. package/src/routes/create-many/create-many.module.js +1 -1
  30. package/src/routes/create-one/base-create-one.service.js +1 -1
  31. package/src/routes/create-one/create-one-controller.mixin.js +1 -2
  32. package/src/routes/create-one/create-one.helper.js +1 -0
  33. package/src/routes/delete-many/delete-many-controller.mixin.js +1 -2
  34. package/src/routes/delete-one/delete-one-controller.mixin.js +1 -2
  35. package/src/routes/duplicate-many/base-duplicate-many.service.js +1 -1
  36. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +1 -2
  37. package/src/routes/duplicate-one/base-duplicate-one.service.js +1 -1
  38. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +1 -2
  39. package/src/routes/get-many/base-get-many.service.js +1 -1
  40. package/src/routes/get-many/get-many-controller.mixin.js +1 -2
  41. package/src/routes/get-one/base-get-one.service.js +1 -1
  42. package/src/routes/get-one/get-one-controller.mixin.js +1 -2
  43. package/src/routes/replace-one/base-replace-one.service.js +1 -1
  44. package/src/routes/replace-one/replace-one-controller.mixin.js +1 -2
  45. package/src/routes/update-many/base-update-many.service.js +1 -1
  46. package/src/routes/update-many/update-many-controller.mixin.js +1 -2
  47. package/src/routes/update-one/base-update-one.service.js +1 -1
  48. package/src/routes/update-one/update-one-controller.mixin.js +1 -2
  49. package/src/services/base/base.service.d.ts +6 -2
  50. package/src/services/base/base.service.js +20 -1
  51. package/src/version.json +1 -1
  52. package/tsconfig.tsbuildinfo +1 -1
@@ -16,10 +16,9 @@ exports.DeleteManyControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function DeleteManyControllerMixin(entity, controllerOptions, routeConfig, version) {
22
- const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
21
+ const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
23
22
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
24
23
  presenter: RoutePresenter,
25
24
  });
@@ -16,10 +16,9 @@ exports.DeleteOneControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function DeleteOneControllerMixin(entity, controllerOptions, routeConfig, version) {
22
- const { routeType, description, isPublic, EntityParam, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
21
+ const { routeType, description, isPublic, EntityParam, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
23
22
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
24
23
  param: EntityParam,
25
24
  presenter: RoutePresenter,
@@ -33,7 +33,7 @@ class BaseDuplicateManyService extends services_1.BaseService {
33
33
  .lean()
34
34
  .exec();
35
35
  if (this.callback && documents.length) {
36
- await Promise.all(documents.map((document) => this.callback(document, this.model)));
36
+ await Promise.all(documents.map((document) => this.callback(document, this.callbackMethods)));
37
37
  }
38
38
  return documents.map((d) => this.buildInstance(d));
39
39
  }
@@ -16,11 +16,10 @@ exports.DuplicateManyControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function DuplicateManyControllerMixin(entity, controllerOptions, routeConfig, version) {
22
21
  var _a;
23
- const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
25
24
  body: RouteBody,
26
25
  presenter: RoutePresenter,
@@ -31,7 +31,7 @@ class BaseDuplicateOneService extends services_1.BaseService {
31
31
  });
32
32
  const document = await this.model.findOne({ _id }).lean().exec();
33
33
  if (this.callback) {
34
- await this.callback(document, this.model);
34
+ await this.callback(document, this.callbackMethods);
35
35
  }
36
36
  return this.buildInstance(document);
37
37
  }
@@ -17,11 +17,10 @@ const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const dtos_1 = require("../../dtos");
19
19
  const helpers_1 = require("../../helpers");
20
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
21
20
  const mixins_1 = require("../../mixins");
22
21
  function DuplicateOneControllerMixin(entity, controllerOptions, routeConfig, version) {
23
22
  var _a;
24
- const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
23
+ const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
25
24
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder('DuplicateOne', entity, version, description, isPublic, {
26
25
  param: dtos_1.EntityParam,
27
26
  body: RouteBody,
@@ -16,7 +16,7 @@ class BaseGetManyService extends services_1.BaseService {
16
16
  .lean()
17
17
  .exec();
18
18
  if (this.callback && documents.length) {
19
- await Promise.all(documents.map((document) => this.callback(document, this.model)));
19
+ await Promise.all(documents.map((document) => this.callback(document, this.callbackMethods)));
20
20
  }
21
21
  return documents.map((d) => this.buildInstance(d));
22
22
  }
@@ -17,10 +17,9 @@ const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const dtos_1 = require("../../dtos");
19
19
  const helpers_1 = require("../../helpers");
20
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
21
20
  const mixins_1 = require("../../mixins");
22
21
  function GetManyControllerMixin(entity, controllerOptions, routeConfig, version) {
23
- const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  class RouteQuery extends (routeConfig.dTOs?.query ?? dtos_1.EntityQuery) {
25
24
  }
26
25
  Object.defineProperty(RouteQuery, 'name', {
@@ -19,7 +19,7 @@ class BaseGetOneService extends services_1.BaseService {
19
19
  this.handleDocumentNotFound();
20
20
  }
21
21
  if (this.callback) {
22
- await this.callback(document, this.model);
22
+ await this.callback(document, this.callbackMethods);
23
23
  }
24
24
  return this.buildInstance(document);
25
25
  }
@@ -17,10 +17,9 @@ const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const dtos_1 = require("../../dtos");
19
19
  const helpers_1 = require("../../helpers");
20
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
21
20
  const mixins_1 = require("../../mixins");
22
21
  function GetOneControllerMixin(entity, controllerOptions, routeConfig, version) {
23
- const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
25
24
  param: dtos_1.EntityParam,
26
25
  presenter: RoutePresenter,
@@ -23,7 +23,7 @@ class BaseReplaceOneService extends services_1.BaseService {
23
23
  this.handleDocumentNotFound();
24
24
  }
25
25
  if (this.callback) {
26
- await this.callback(document, this.model);
26
+ await this.callback(document, this.callbackMethods);
27
27
  }
28
28
  return this.buildInstance(document);
29
29
  }
@@ -16,11 +16,10 @@ exports.ReplaceOneControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function ReplaceOneControllerMixin(entity, controllerOptions, routeConfig, version) {
22
21
  var _a;
23
- const { routeType, description, isPublic, EntityParam, RouteBody, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, EntityParam, RouteBody, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
25
24
  param: EntityParam,
26
25
  body: RouteBody,
@@ -22,7 +22,7 @@ class BaseUpdateManyService extends services_1.BaseService {
22
22
  .exec();
23
23
  const documents = await this.model.find({ _id: { $in: ids } }).lean().exec();
24
24
  if (this.callback && documents.length) {
25
- await Promise.all(documents.map((document) => this.callback(document, this.model)));
25
+ await Promise.all(documents.map((document) => this.callback(document, this.callbackMethods)));
26
26
  }
27
27
  return documents.map((d) => this.buildInstance(d));
28
28
  }
@@ -16,11 +16,10 @@ exports.UpdateManyControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function UpdateManyControllerMixin(entity, controllerOptions, routeConfig, version) {
22
21
  var _a;
23
- const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, RouteBody, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
25
24
  body: RouteBody,
26
25
  presenter: RoutePresenter,
@@ -20,7 +20,7 @@ class BaseUpdateOneService extends services_1.BaseService {
20
20
  this.handleDocumentNotFound();
21
21
  }
22
22
  if (this.callback) {
23
- await this.callback(document, this.model);
23
+ await this.callback(document, this.callbackMethods);
24
24
  }
25
25
  return this.buildInstance(document);
26
26
  }
@@ -16,11 +16,10 @@ exports.UpdateOneControllerMixin = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const builders_1 = require("../../builders");
18
18
  const helpers_1 = require("../../helpers");
19
- const controller_mixin_helper_1 = require("../../helpers/controller-mixin.helper");
20
19
  const mixins_1 = require("../../mixins");
21
20
  function UpdateOneControllerMixin(entity, controllerOptions, routeConfig, version) {
22
21
  var _a;
23
- const { routeType, description, isPublic, EntityParam, RouteBody, RoutePresenter, abilityPredicate, } = (0, controller_mixin_helper_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
22
+ const { routeType, description, isPublic, EntityParam, RouteBody, RoutePresenter, abilityPredicate, } = (0, helpers_1.getControllerMixinData)(entity, controllerOptions, routeConfig, version);
24
23
  const routeDecoratorsBuilder = new builders_1.RouteDecoratorsBuilder(routeType, entity, version, description, isPublic, {
25
24
  param: EntityParam,
26
25
  body: RouteBody,
@@ -24,17 +24,21 @@
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
25
  import { Type } from '@nestjs/common';
26
26
  import { FilterQuery, Model, Schema } from 'mongoose';
27
- import { AbilityPredicate } from '../../interfaces';
27
+ import { AbilityPredicate, DynamicApiCallbackMethods } from '../../interfaces';
28
28
  import { BaseEntity } from '../../models';
29
+ import { DynamicApiResetPasswordOptions } from '../../modules';
29
30
  export declare abstract class BaseService<Entity extends BaseEntity> {
30
31
  protected readonly model: Model<Entity>;
31
32
  abilityPredicate: AbilityPredicate<Entity> | undefined;
32
33
  user: unknown;
33
34
  protected readonly entity: Type<Entity>;
35
+ protected readonly passwordField: keyof Entity | undefined;
36
+ protected readonly resetPasswordOptions: DynamicApiResetPasswordOptions<Entity> | undefined;
37
+ protected readonly callbackMethods: DynamicApiCallbackMethods<Entity>;
34
38
  protected constructor(model: Model<Entity>);
35
39
  get isSoftDeletable(): boolean;
36
40
  findManyDocuments(conditions?: FilterQuery<Entity>): Promise<Entity[]>;
37
- findOneDocument(_id: string | Schema.Types.ObjectId, conditions?: FilterQuery<Entity>): Promise<Entity>;
41
+ findOneDocument(_id: string | Schema.Types.ObjectId | undefined, conditions?: FilterQuery<Entity>): Promise<Entity>;
38
42
  protected buildInstance(document: Entity): Entity;
39
43
  protected handleAbilityPredicate(document: Entity): void;
40
44
  protected handleDuplicateKeyError(error: any): void;
@@ -6,6 +6,25 @@ const builder_pattern_1 = require("builder-pattern");
6
6
  class BaseService {
7
7
  constructor(model) {
8
8
  this.model = model;
9
+ this.callbackMethods = {
10
+ findById: async (id) => {
11
+ const entity = await this.model.findOne({ _id: id }).lean().exec();
12
+ if (!entity) {
13
+ return;
14
+ }
15
+ return this.buildInstance(entity);
16
+ },
17
+ findAndUpdateById: async (id, update) => {
18
+ if (this.passwordField && typeof update[this.passwordField] !== 'undefined') {
19
+ throw new common_1.BadRequestException(`${this.passwordField} cannot be updated using this method because it is hashed. Use reset password process instead.`);
20
+ }
21
+ const updated = await this.model.findOneAndUpdate({ _id: id }, update, { new: true }).lean().exec();
22
+ if (!updated) {
23
+ this.handleDocumentNotFound();
24
+ }
25
+ return this.buildInstance(updated);
26
+ },
27
+ };
9
28
  }
10
29
  get isSoftDeletable() {
11
30
  const paths = Object.getOwnPropertyNames(this.model.schema.paths);
@@ -24,7 +43,7 @@ class BaseService {
24
43
  async findOneDocument(_id, conditions = {}) {
25
44
  const document = await this.model
26
45
  .findOne({
27
- _id,
46
+ ...(_id ? { _id } : {}),
28
47
  ...conditions,
29
48
  })
30
49
  .lean()
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "2.2.1"
2
+ "version": "2.3.0"
3
3
  }