mongodb-dynamic-api 4.7.0 → 4.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 (123) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +1 -0
  3. package/package.json +2 -1
  4. package/src/guards/base-policies.guard.d.ts +3 -1
  5. package/src/guards/base-policies.guard.js +2 -2
  6. package/src/guards/base-policies.guard.js.map +1 -1
  7. package/src/helpers/mixin-data.helper.d.ts +3 -2
  8. package/src/helpers/mixin-data.helper.js +2 -1
  9. package/src/helpers/mixin-data.helper.js.map +1 -1
  10. package/src/index.d.ts +2 -0
  11. package/src/index.js +2 -0
  12. package/src/index.js.map +1 -1
  13. package/src/interfaces/dynamic-api-ability.interface.d.ts +2 -1
  14. package/src/interfaces/dynamic-api-cascade-config.interface.d.ts +9 -0
  15. package/src/interfaces/dynamic-api-cascade-config.interface.js +3 -0
  16. package/src/interfaces/dynamic-api-cascade-config.interface.js.map +1 -0
  17. package/src/interfaces/dynamic-api-presence.interface.d.ts +22 -0
  18. package/src/interfaces/dynamic-api-presence.interface.js +6 -0
  19. package/src/interfaces/dynamic-api-presence.interface.js.map +1 -0
  20. package/src/interfaces/dynamic-api-route-config.interface.d.ts +6 -2
  21. package/src/interfaces/dynamic-api-service-before-save-callback.interface.d.ts +4 -1
  22. package/src/interfaces/dynamic-api-service-callback.interface.d.ts +26 -1
  23. package/src/interfaces/index.d.ts +2 -0
  24. package/src/interfaces/index.js +2 -0
  25. package/src/interfaces/index.js.map +1 -1
  26. package/src/mixins/policies-guard.mixin.d.ts +9 -3
  27. package/src/mixins/policies-guard.mixin.js +5 -2
  28. package/src/mixins/policies-guard.mixin.js.map +1 -1
  29. package/src/modules/presence/adapters/in-memory-presence.adapter.d.ts +10 -0
  30. package/src/modules/presence/adapters/in-memory-presence.adapter.js +64 -0
  31. package/src/modules/presence/adapters/in-memory-presence.adapter.js.map +1 -0
  32. package/src/modules/presence/adapters/redis-presence.adapter.d.ts +17 -0
  33. package/src/modules/presence/adapters/redis-presence.adapter.js +80 -0
  34. package/src/modules/presence/adapters/redis-presence.adapter.js.map +1 -0
  35. package/src/modules/presence/index.d.ts +5 -0
  36. package/src/modules/presence/index.js +22 -0
  37. package/src/modules/presence/index.js.map +1 -0
  38. package/src/modules/presence/presence.controller.d.ts +6 -0
  39. package/src/modules/presence/presence.controller.js +55 -0
  40. package/src/modules/presence/presence.controller.js.map +1 -0
  41. package/src/modules/presence/presence.gateway.d.ts +13 -0
  42. package/src/modules/presence/presence.gateway.js +79 -0
  43. package/src/modules/presence/presence.gateway.js.map +1 -0
  44. package/src/modules/presence/presence.module.d.ts +5 -0
  45. package/src/modules/presence/presence.module.js +50 -0
  46. package/src/modules/presence/presence.module.js.map +1 -0
  47. package/src/routes/aggregate/aggregate-controller.mixin.js +2 -2
  48. package/src/routes/aggregate/aggregate-controller.mixin.js.map +1 -1
  49. package/src/routes/aggregate/aggregate-gateway.mixin.js +2 -2
  50. package/src/routes/aggregate/aggregate-gateway.mixin.js.map +1 -1
  51. package/src/routes/aggregate/aggregate.helper.d.ts +2 -2
  52. package/src/routes/aggregate/aggregate.helper.js +3 -1
  53. package/src/routes/aggregate/aggregate.helper.js.map +1 -1
  54. package/src/routes/aggregate/aggregate.module.js +1 -1
  55. package/src/routes/aggregate/aggregate.module.js.map +1 -1
  56. package/src/routes/aggregate/base-aggregate.service.d.ts +3 -1
  57. package/src/routes/aggregate/base-aggregate.service.js +6 -1
  58. package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
  59. package/src/routes/create-many/create-many-gateway.mixin.js +1 -1
  60. package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
  61. package/src/routes/create-one/create-one-gateway.mixin.js +1 -1
  62. package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
  63. package/src/routes/delete-many/base-delete-many.service.d.ts +3 -1
  64. package/src/routes/delete-many/base-delete-many.service.js +22 -9
  65. package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
  66. package/src/routes/delete-many/delete-many-gateway.mixin.js +1 -1
  67. package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
  68. package/src/routes/delete-many/delete-many.helper.d.ts +2 -2
  69. package/src/routes/delete-many/delete-many.helper.js +3 -1
  70. package/src/routes/delete-many/delete-many.helper.js.map +1 -1
  71. package/src/routes/delete-many/delete-many.module.js +1 -1
  72. package/src/routes/delete-many/delete-many.module.js.map +1 -1
  73. package/src/routes/delete-one/base-delete-one.service.d.ts +4 -1
  74. package/src/routes/delete-one/base-delete-one.service.js +30 -9
  75. package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
  76. package/src/routes/delete-one/delete-one-gateway.mixin.js +1 -1
  77. package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
  78. package/src/routes/delete-one/delete-one.helper.d.ts +2 -2
  79. package/src/routes/delete-one/delete-one.helper.js +3 -1
  80. package/src/routes/delete-one/delete-one.helper.js.map +1 -1
  81. package/src/routes/delete-one/delete-one.module.js +1 -1
  82. package/src/routes/delete-one/delete-one.module.js.map +1 -1
  83. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +1 -1
  84. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
  85. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +1 -1
  86. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
  87. package/src/routes/get-many/base-get-many.service.d.ts +3 -1
  88. package/src/routes/get-many/base-get-many.service.js +5 -1
  89. package/src/routes/get-many/base-get-many.service.js.map +1 -1
  90. package/src/routes/get-many/get-many-controller.mixin.js +2 -2
  91. package/src/routes/get-many/get-many-controller.mixin.js.map +1 -1
  92. package/src/routes/get-many/get-many-gateway.mixin.js +2 -2
  93. package/src/routes/get-many/get-many-gateway.mixin.js.map +1 -1
  94. package/src/routes/get-many/get-many.helper.d.ts +2 -2
  95. package/src/routes/get-many/get-many.helper.js +3 -1
  96. package/src/routes/get-many/get-many.helper.js.map +1 -1
  97. package/src/routes/get-many/get-many.module.js +1 -1
  98. package/src/routes/get-many/get-many.module.js.map +1 -1
  99. package/src/routes/get-one/get-one-gateway.mixin.js +1 -1
  100. package/src/routes/get-one/get-one-gateway.mixin.js.map +1 -1
  101. package/src/routes/replace-one/replace-one-gateway.mixin.js +1 -1
  102. package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
  103. package/src/routes/update-many/update-many-gateway.mixin.js +1 -1
  104. package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
  105. package/src/routes/update-one/update-one-gateway.mixin.js +1 -1
  106. package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
  107. package/src/services/base/base.service.d.ts +5 -1
  108. package/src/services/base/base.service.js +36 -0
  109. package/src/services/base/base.service.js.map +1 -1
  110. package/src/version.json +1 -1
  111. package/test/for-feature/ability-predicate-filter.e2e-spec.d.ts +1 -0
  112. package/test/for-feature/ability-predicate-filter.e2e-spec.js +106 -0
  113. package/test/for-feature/ability-predicate-filter.e2e-spec.js.map +1 -0
  114. package/test/for-feature/cascade-and-before-delete.e2e-spec.d.ts +1 -0
  115. package/test/for-feature/cascade-and-before-delete.e2e-spec.js +304 -0
  116. package/test/for-feature/cascade-and-before-delete.e2e-spec.js.map +1 -0
  117. package/test/for-feature/presence.e2e-spec.d.ts +1 -0
  118. package/test/for-feature/presence.e2e-spec.js +169 -0
  119. package/test/for-feature/presence.e2e-spec.js.map +1 -0
  120. package/test/for-feature/raw-update-callback-methods.e2e-spec.d.ts +1 -0
  121. package/test/for-feature/raw-update-callback-methods.e2e-spec.js +263 -0
  122. package/test/for-feature/raw-update-callback-methods.e2e-spec.js.map +1 -0
  123. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  Changelog
2
2
 
3
+ ## [4.9.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.8.0...v4.9.0) (2026-05-25)
4
+
5
+ ### presence
6
+
7
+ * **presence:** add @Public() to PresenceController and fix e2e race conditions ([6245e6d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/6245e6d265d6a086d3aa6813df3c1cd71fa7303d))
8
+ * **presence:** add DynamicApiPresenceModule with pluggable adapters ([5957c54](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5957c54b62664f5861123468f50068861aff7b78))
9
+ * **presence:** break circular dependency by moving presence out of modules barrel ([51fad6a](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/51fad6a7fe8b7dd3472bbd27fd25ff6f70a80267))
10
+ * **presence:** replace String(err) with JSON.stringify in gateway error handler ([8dcaa04](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/8dcaa04499ef0dbacb988b9a0acddbf463ac68be))
11
+
12
+ ## [4.8.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.7.0...v4.8.0) (2026-05-24)
13
+
14
+ ### cascade
15
+
16
+ * **cascade:** add cascade delete and beforeDeleteCallback hook ([d4f3122](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d4f312268114c901a36467ad6a8f9348e3d11f95))
17
+
18
+ ### callbacks
19
+
20
+ * **callbacks:** add rawUpdateOneDocument and rawUpdateManyDocuments to CallbackMethods ([c0b3dfa](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/c0b3dfab500b983e506daaed7680b806e1ed64c8))
21
+
22
+ ### get-many,aggregate
23
+
24
+ * **get-many,aggregate:** add predicateBehavior 'filter' option ([0d5d478](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/0d5d478fb4227a658d908ec967c9ba23cb8da235))
25
+
3
26
  ## [4.7.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.6.1...v4.7.0) (2026-05-24)
4
27
 
5
28
  ### interfaces
package/README.md CHANGED
@@ -895,6 +895,7 @@ Explore advanced features and configurations:
895
895
  | 🔐 **Authentication** | JWT dual-token auth (8 endpoints) — access + refresh tokens, cookie mode, server-side revocation | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authentication.md) |
896
896
  | 🛡️ **Authorization** | Role-based access control | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authorization.md) |
897
897
  | 📡 **WebSockets** | Socket.IO integration for routes | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/websockets.md) |
898
+ | 🟢 **Presence** | Real-time online/offline tracking for WebSocket users | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/presence.md) |
898
899
  | 🗂️ **Route Configuration** | All route options: DTOs, interceptors, etc. | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/route-config.md) |
899
900
  | 🔁 **Callbacks** | beforeSave / afterSave hooks, typed contexts, user access, audit trails | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/callbacks.md) |
900
901
  | 🎛️ **Controller Configuration** | All `controllerOptions` and `forFeature` options | [View Guide](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/controller-config.md) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongodb-dynamic-api",
3
- "version": "4.7.0",
3
+ "version": "4.9.0",
4
4
  "description": "Auto generated CRUD API for MongoDB using NestJS",
5
5
  "readmeFilename": "README.md",
6
6
  "main": "index.js",
@@ -57,6 +57,7 @@
57
57
  "class-validator": "^0.14.1",
58
58
  "cookie-parser": "^1.4.7",
59
59
  "dotenv": "^16.4.5",
60
+ "ioredis": "^5.10.1",
60
61
  "mongodb-pipeline-builder": "^4.0.2",
61
62
  "mongoose": "^8.9.5",
62
63
  "passport": "^0.7.0",
@@ -1,7 +1,7 @@
1
1
  import { CanActivate, ExecutionContext, Type } from '@nestjs/common';
2
2
  import { PipelineStage } from 'mongodb-pipeline-builder';
3
3
  import { Model } from 'mongoose';
4
- import { AbilityPredicate, RouteType } from '../interfaces';
4
+ import { AbilityPredicate, PredicateBehavior, RouteType } from '../interfaces';
5
5
  import { BaseEntity } from '../models';
6
6
  import { BaseService } from '../services';
7
7
  declare abstract class BasePoliciesGuard<Entity extends BaseEntity> extends BaseService<Entity> implements CanActivate {
@@ -9,6 +9,7 @@ declare abstract class BasePoliciesGuard<Entity extends BaseEntity> extends Base
9
9
  protected routeType: RouteType;
10
10
  protected entity: Type<Entity>;
11
11
  protected abilityPredicate: AbilityPredicate<Entity> | undefined;
12
+ protected predicateBehavior: PredicateBehavior | undefined;
12
13
  protected queryToPipeline?: (query: unknown) => PipelineStage[];
13
14
  protected constructor(model: Model<Entity>);
14
15
  canActivate(context: ExecutionContext): Promise<boolean>;
@@ -17,6 +18,7 @@ declare abstract class BaseSocketPoliciesGuard<Entity extends BaseEntity> extend
17
18
  protected readonly model: Model<Entity>;
18
19
  protected routeType: RouteType;
19
20
  protected abilityPredicate: AbilityPredicate<Entity> | undefined;
21
+ protected predicateBehavior: PredicateBehavior | undefined;
20
22
  protected entity: Type<Entity>;
21
23
  protected queryToPipeline?: (query: unknown) => PipelineStage[];
22
24
  protected isPublic: boolean | undefined;
@@ -12,7 +12,7 @@ class BasePoliciesGuard extends services_1.BaseService {
12
12
  }
13
13
  async canActivate(context) {
14
14
  const { user, query, params } = context.switchToHttp().getRequest();
15
- if (this.abilityPredicate) {
15
+ if (this.abilityPredicate && this.predicateBehavior !== 'filter') {
16
16
  if (!user) {
17
17
  throw new common_1.ForbiddenException('Access Denied');
18
18
  }
@@ -57,7 +57,7 @@ class BaseSocketPoliciesGuard extends services_1.BaseService {
57
57
  this.logger.warn('No user data in socket');
58
58
  throw new websockets_1.WsException('Access Denied');
59
59
  }
60
- if (this.abilityPredicate) {
60
+ if (this.abilityPredicate && this.predicateBehavior !== 'filter') {
61
61
  try {
62
62
  this.user = socket.user;
63
63
  const { id } = data || {};
@@ -1 +1 @@
1
- {"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { Type } from '@nestjs/common';
2
- import { AbilityPredicate, DynamicApiControllerOptions, DynamicAPIRouteConfig, RouteType } from '../interfaces';
2
+ import { AbilityPredicate, DynamicApiControllerOptions, DynamicAPIRouteConfig, PredicateBehavior, RouteType } from '../interfaces';
3
3
  import { BaseEntity } from '../models';
4
- declare function getMixinData<Entity extends BaseEntity>(entity: Type<Entity>, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }: DynamicApiControllerOptions<Entity>, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, eventName, }: DynamicAPIRouteConfig<Entity>, isGateway?: boolean): {
4
+ declare function getMixinData<Entity extends BaseEntity>(entity: Type<Entity>, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }: DynamicApiControllerOptions<Entity>, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }: DynamicAPIRouteConfig<Entity>, isGateway?: boolean): {
5
5
  routeType: RouteType;
6
6
  displayedName: string;
7
7
  description: string;
8
8
  isPublic: boolean;
9
9
  disableCache: boolean;
10
10
  abilityPredicate: AbilityPredicate<Entity>;
11
+ predicateBehavior: PredicateBehavior | undefined;
11
12
  event: string;
12
13
  };
13
14
  export { getMixinData };
@@ -4,7 +4,7 @@ exports.getMixinData = getMixinData;
4
4
  const lodash_helper_1 = require("./lodash.helper");
5
5
  const controller_ability_predicates_helper_1 = require("./controller-ability-predicates.helper");
6
6
  const format_helper_1 = require("./format.helper");
7
- function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, eventName, }, isGateway = false) {
7
+ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }, isGateway = false) {
8
8
  const displayedName = (0, format_helper_1.getDisplayedName)(apiTag, entity.name, subPath);
9
9
  let isPublic;
10
10
  if (typeof isPublicRoute === 'boolean') {
@@ -35,6 +35,7 @@ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCac
35
35
  isPublic,
36
36
  disableCache,
37
37
  abilityPredicate,
38
+ predicateBehavior,
38
39
  event,
39
40
  };
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;AA8ES,oCAAY;AA7ErB,mDAA4C;AAQ5C,iGAAqG;AACrG,mDAAmD;AAGnD,SAAS,YAAY,CACnB,MAAoB,EACpB,EACE,MAAM,EACN,QAAQ,EAAE,kBAAkB,EAC5B,YAAY,EAAE,sBAAsB,EACpC,iBAAiB,EAAE,2BAA2B,GACV,EACtC,EACE,IAAI,EAAE,SAAS,EACf,OAAO,EACP,WAAW,EACX,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAAE,qBAAqB,EACvC,SAAS,GACqB,EAChC,SAAS,GAAG,KAAK;IAUjB,MAAM,aAAa,GAAG,IAAA,gCAAgB,EAAC,MAAM,EAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,QAAiB,CAAC;IACtB,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,QAAQ,GAAG,aAAa,CAAC;IAC3B,CAAC;SAAM,IAAI,OAAO,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACnD,QAAQ,GAAG,kBAAkB,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,YAAqB,CAAC;IAC1B,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,YAAY,GAAG,iBAAiB,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACvD,YAAY,GAAG,sBAAsB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,gBAAgB,GAAG,qBAAqB,IAAI,IAAA,kFAA2C,EAC3F,2BAA2B,EAC3B,SAAS,CACV,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,IAAA,yBAAS,EAAC,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC;IAEtE,OAAO;QACL,SAAS;QACT,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,KAAK;KACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;AAkFS,oCAAY;AAjFrB,mDAA4C;AAS5C,iGAAqG;AACrG,mDAAmD;AAGnD,SAAS,YAAY,CACnB,MAAoB,EACpB,EACE,MAAM,EACN,QAAQ,EAAE,kBAAkB,EAC5B,YAAY,EAAE,sBAAsB,EACpC,iBAAiB,EAAE,2BAA2B,GACV,EACtC,EACE,IAAI,EAAE,SAAS,EACf,OAAO,EACP,WAAW,EACX,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAAE,qBAAqB,EACvC,iBAAiB,EACjB,SAAS,GACqB,EAChC,SAAS,GAAG,KAAK;IAWjB,MAAM,aAAa,GAAG,IAAA,gCAAgB,EAAC,MAAM,EAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,QAAiB,CAAC;IACtB,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,QAAQ,GAAG,aAAa,CAAC;IAC3B,CAAC;SAAM,IAAI,OAAO,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACnD,QAAQ,GAAG,kBAAkB,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,YAAqB,CAAC;IAC1B,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,YAAY,GAAG,iBAAiB,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACvD,YAAY,GAAG,sBAAsB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,gBAAgB,GAAG,qBAAqB,IAAI,IAAA,kFAA2C,EAC3F,2BAA2B,EAC3B,SAAS,CACV,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,IAAA,yBAAS,EAAC,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC;IAEtE,OAAO;QACL,SAAS;QACT,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
package/src/index.d.ts CHANGED
@@ -10,6 +10,8 @@ export * from './interfaces';
10
10
  export * from './logger';
11
11
  export * from './mixins';
12
12
  export * from './models';
13
+ export * from './modules';
14
+ export * from './modules/presence';
13
15
  export * from './routes';
14
16
  export * from './services';
15
17
  export * from './utils';
package/src/index.js CHANGED
@@ -27,6 +27,8 @@ __exportStar(require("./interfaces"), exports);
27
27
  __exportStar(require("./logger"), exports);
28
28
  __exportStar(require("./mixins"), exports);
29
29
  __exportStar(require("./models"), exports);
30
+ __exportStar(require("./modules"), exports);
31
+ __exportStar(require("./modules/presence"), exports);
30
32
  __exportStar(require("./routes"), exports);
31
33
  __exportStar(require("./services"), exports);
32
34
  __exportStar(require("./utils"), exports);
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,4CAA0B;AAC1B,6CAA2B;AAC3B,2CAAyB;AACzB,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,uDAAqC;AACrC,gFAAsG;AAAvE,iIAAA,uBAAuB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,4CAA0B;AAC1B,6CAA2B;AAC3B,2CAAyB;AACzB,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,qDAAmC;AACnC,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,uDAAqC;AACrC,gFAAsG;AAAvE,iIAAA,uBAAuB,OAAA"}
@@ -1,5 +1,6 @@
1
1
  import { BaseEntity } from '../models';
2
2
  import { RouteType } from './dynamic-api-route-type.type';
3
+ type PredicateBehavior = 'filter' | 'throw';
3
4
  type AbilityPredicate<Entity extends BaseEntity, User = any> = (entity: Entity, user: User) => boolean;
4
5
  type AuthAbilityPredicate<User = any, Body = unknown> = (user: User, body?: Body) => boolean;
5
6
  type BroadcastAbilityPredicate<ResponseData extends object, User = any> = (data: ResponseData, user: User) => boolean;
@@ -8,4 +9,4 @@ type ControllerAbilityPredicate<Entity extends BaseEntity> = {
8
9
  targets: RouteType[];
9
10
  predicate: AbilityPredicate<Entity>;
10
11
  };
11
- export { ControllerAbilityPredicate, AuthAbilityPredicate, AbilityPredicate, BroadcastAbilityPredicate, BroadcastRooms, };
12
+ export { PredicateBehavior, ControllerAbilityPredicate, AuthAbilityPredicate, AbilityPredicate, BroadcastAbilityPredicate, BroadcastRooms, };
@@ -0,0 +1,9 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { BaseEntity } from '../models';
3
+ interface CascadeConfig {
4
+ entity: Type<BaseEntity>;
5
+ foreignKey: string;
6
+ on: 'delete' | 'softDelete';
7
+ softDelete?: boolean;
8
+ }
9
+ export { CascadeConfig };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=dynamic-api-cascade-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-api-cascade-config.interface.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/dynamic-api-cascade-config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ declare const DYNAMIC_API_PRESENCE_ADAPTER: unique symbol;
2
+ interface PresenceAdapter {
3
+ setOnline(userId: string, socketId: string, room?: string): Promise<void>;
4
+ setOffline(userId: string, socketId: string): Promise<void>;
5
+ isOnline(userId: string): Promise<boolean>;
6
+ getOnlineUserIds(room?: string): Promise<string[]>;
7
+ getSocketCount(userId: string): Promise<number>;
8
+ }
9
+ interface PresenceRegisterOptions {
10
+ adapter: 'memory' | 'redis';
11
+ redisUrl?: string;
12
+ redisTtlSeconds?: number;
13
+ enableController?: boolean;
14
+ }
15
+ interface PresenceEventPayload {
16
+ userId: string;
17
+ }
18
+ interface PresenceResponse {
19
+ onlineUserIds: string[];
20
+ }
21
+ export type { PresenceAdapter, PresenceRegisterOptions, PresenceEventPayload, PresenceResponse, };
22
+ export { DYNAMIC_API_PRESENCE_ADAPTER };
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DYNAMIC_API_PRESENCE_ADAPTER = void 0;
4
+ const DYNAMIC_API_PRESENCE_ADAPTER = Symbol('DYNAMIC_API_PRESENCE_ADAPTER');
5
+ exports.DYNAMIC_API_PRESENCE_ADAPTER = DYNAMIC_API_PRESENCE_ADAPTER;
6
+ //# sourceMappingURL=dynamic-api-presence.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-api-presence.interface.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/dynamic-api-presence.interface.ts"],"names":[],"mappings":";;;AACA,MAAM,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC;AA4DnE,oEAA4B"}
@@ -1,10 +1,11 @@
1
1
  import { NestInterceptor, Type, ValidationPipeOptions } from '@nestjs/common';
2
2
  import { BaseEntity } from '../models';
3
- import { AbilityPredicate } from './dynamic-api-ability.interface';
3
+ import { AbilityPredicate, PredicateBehavior } from './dynamic-api-ability.interface';
4
4
  import { DynamicApiBroadcastConfig } from './dynamic-api-broadcast-config.interface';
5
+ import { CascadeConfig } from './dynamic-api-cascade-config.interface';
5
6
  import { DTOsBundle } from './dynamic-api-route-dtos-bundle.type';
6
7
  import { RouteType } from './dynamic-api-route-type.type';
7
- import { AnyBeforeSaveCallback } from './dynamic-api-service-before-save-callback.interface';
8
+ import { AnyBeforeDeleteCallback, AnyBeforeSaveCallback } from './dynamic-api-service-before-save-callback.interface';
8
9
  import { AfterSaveCallback } from './dynamic-api-service-callback.interface';
9
10
  import { DynamicApiWebSocketOptions } from './dynamic-api-web-socket.interface';
10
11
  type FromUserMap<Entity> = Partial<Record<keyof Entity, string | ((user: unknown) => unknown)>>;
@@ -18,7 +19,10 @@ interface DynamicApiRouteConfig<Entity extends BaseEntity> {
18
19
  dTOs?: DTOsBundle;
19
20
  validationPipeOptions?: ValidationPipeOptions;
20
21
  abilityPredicate?: AbilityPredicate<Entity>;
22
+ predicateBehavior?: PredicateBehavior;
21
23
  beforeSaveCallback?: AnyBeforeSaveCallback<Entity>;
24
+ beforeDeleteCallback?: AnyBeforeDeleteCallback<Entity>;
25
+ cascade?: CascadeConfig[];
22
26
  callback?: AfterSaveCallback<Entity>;
23
27
  webSocket?: DynamicApiWebSocketOptions;
24
28
  eventName?: string;
@@ -37,6 +37,9 @@ type BeforeSaveListCallback<Entity extends BaseEntity, Context = Record<string,
37
37
  type BeforeSaveDeleteCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = (entity: Entity | undefined, context: Context, methods: CallbackMethods, user?: User) => Promise<void>;
38
38
  type BeforeSaveDeleteManyCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = (entities: Entity[], context: Context, methods: CallbackMethods, user?: User) => Promise<void>;
39
39
  type AnyBeforeSaveCallback<Entity extends BaseEntity, User = unknown> = BeforeSaveCallback<Entity, unknown, User> | BeforeSaveListCallback<Entity, unknown, User> | BeforeSaveDeleteCallback<Entity, unknown, User> | BeforeSaveDeleteManyCallback<Entity, unknown, User>;
40
+ type BeforeDeleteCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = (entity: Entity | undefined, context: Context, methods: CallbackMethods, user?: User) => Promise<void>;
41
+ type BeforeDeleteManyCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = (entities: Entity[], context: Context, methods: CallbackMethods, user?: User) => Promise<void>;
42
+ type AnyBeforeDeleteCallback<Entity extends BaseEntity, User = unknown> = BeforeDeleteCallback<Entity, BeforeSaveDeleteContext, User> | BeforeDeleteManyCallback<Entity, BeforeSaveDeleteManyContext, User>;
40
43
  type DynamicApiServiceBeforeSaveCreateContext<Entity extends BaseEntity> = BeforeSaveCreateContext<Entity>;
41
44
  type DynamicApiServiceBeforeSaveCreateManyContext<Entity extends BaseEntity> = BeforeSaveCreateManyContext<Entity>;
42
45
  type DynamicApiServiceBeforeSaveUpdateContext<Entity extends BaseEntity> = BeforeSaveUpdateContext<Entity>;
@@ -50,4 +53,4 @@ type DynamicApiServiceBeforeSaveCallback<Entity extends BaseEntity, Context = Re
50
53
  type DynamicApiServiceBeforeSaveListCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = BeforeSaveListCallback<Entity, Context, User>;
51
54
  type DynamicApiServiceBeforeSaveDeleteCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = BeforeSaveDeleteCallback<Entity, Context, User>;
52
55
  type DynamicApiServiceBeforeSaveDeleteManyCallback<Entity extends BaseEntity, Context = Record<string, unknown>, User = unknown> = BeforeSaveDeleteManyCallback<Entity, Context, User>;
53
- export type { AnyBeforeSaveCallback, BeforeSaveCallback, BeforeSaveListCallback, BeforeSaveDeleteCallback, BeforeSaveDeleteManyCallback, BeforeSaveCreateContext, BeforeSaveCreateManyContext, BeforeSaveUpdateContext, BeforeSaveUpdateManyContext, BeforeSaveReplaceContext, BeforeSaveDeleteContext, BeforeSaveDeleteManyContext, BeforeSaveDuplicateContext, BeforeSaveDuplicateManyContext, DynamicApiServiceBeforeSaveCallback, DynamicApiServiceBeforeSaveListCallback, DynamicApiServiceBeforeSaveDeleteCallback, DynamicApiServiceBeforeSaveDeleteManyCallback, DynamicApiServiceBeforeSaveCreateContext, DynamicApiServiceBeforeSaveCreateManyContext, DynamicApiServiceBeforeSaveUpdateContext, DynamicApiServiceBeforeSaveUpdateManyContext, DynamicApiServiceBeforeSaveReplaceContext, DynamicApiServiceBeforeSaveDeleteContext, DynamicApiServiceBeforeSaveDeleteManyContext, DynamicApiServiceBeforeSaveDuplicateContext, DynamicApiServiceBeforeSaveDuplicateManyContext, };
56
+ export type { AnyBeforeDeleteCallback, BeforeDeleteCallback, BeforeDeleteManyCallback, AnyBeforeSaveCallback, BeforeSaveCallback, BeforeSaveListCallback, BeforeSaveDeleteCallback, BeforeSaveDeleteManyCallback, BeforeSaveCreateContext, BeforeSaveCreateManyContext, BeforeSaveUpdateContext, BeforeSaveUpdateManyContext, BeforeSaveReplaceContext, BeforeSaveDeleteContext, BeforeSaveDeleteManyContext, BeforeSaveDuplicateContext, BeforeSaveDuplicateManyContext, DynamicApiServiceBeforeSaveCallback, DynamicApiServiceBeforeSaveListCallback, DynamicApiServiceBeforeSaveDeleteCallback, DynamicApiServiceBeforeSaveDeleteManyCallback, DynamicApiServiceBeforeSaveCreateContext, DynamicApiServiceBeforeSaveCreateManyContext, DynamicApiServiceBeforeSaveUpdateContext, DynamicApiServiceBeforeSaveUpdateManyContext, DynamicApiServiceBeforeSaveReplaceContext, DynamicApiServiceBeforeSaveDeleteContext, DynamicApiServiceBeforeSaveDeleteManyContext, DynamicApiServiceBeforeSaveDuplicateContext, DynamicApiServiceBeforeSaveDuplicateManyContext, };
@@ -3,6 +3,29 @@ import { PipelineStage } from 'mongodb-pipeline-builder';
3
3
  import { FilterQuery, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose';
4
4
  import { BaseEntity } from '../models';
5
5
  import { DeleteResult, UpdateResult } from './dynamic-api-route-response.type';
6
+ type MongoUpdateOperators<T> = {
7
+ $set?: Partial<T>;
8
+ $unset?: Partial<Record<keyof T, '' | 1 | true>>;
9
+ $push?: Partial<{
10
+ [K in keyof T]: T[K] extends Array<infer U> ? U | {
11
+ $each: U[];
12
+ $position?: number;
13
+ $slice?: number;
14
+ $sort?: Record<string, 1 | -1>;
15
+ } : never;
16
+ }>;
17
+ $pull?: Partial<{
18
+ [K in keyof T]: T[K] extends Array<infer U> ? Partial<U> | FilterQuery<U> : never;
19
+ }>;
20
+ $inc?: Partial<Record<keyof T, number>>;
21
+ $addToSet?: Partial<{
22
+ [K in keyof T]: T[K] extends Array<infer U> ? U | {
23
+ $each: U[];
24
+ } : never;
25
+ }>;
26
+ $pop?: Partial<Record<keyof T, -1 | 1>>;
27
+ $rename?: Partial<Record<keyof T, string>>;
28
+ };
6
29
  type CallbackMethods = {
7
30
  findManyDocuments<T>(entity: Type<T>, query: FilterQuery<T>): Promise<T[]>;
8
31
  findOneDocument<T>(entity: Type<T>, query: FilterQuery<T>): Promise<T | undefined>;
@@ -10,6 +33,8 @@ type CallbackMethods = {
10
33
  createOneDocument<T>(entity: Type<T>, data: Partial<T>): Promise<T>;
11
34
  updateManyDocuments<T>(entity: Type<T>, query: FilterQuery<T>, update: UpdateQuery<T> | UpdateWithAggregationPipeline): Promise<UpdateResult>;
12
35
  updateOneDocument<T>(entity: Type<T>, query: FilterQuery<T>, update: UpdateQuery<T> | UpdateWithAggregationPipeline): Promise<UpdateResult>;
36
+ rawUpdateManyDocuments<T>(entity: Type<T>, filter: FilterQuery<T>, update: MongoUpdateOperators<T>): Promise<UpdateResult>;
37
+ rawUpdateOneDocument<T>(entity: Type<T>, filter: FilterQuery<T>, update: MongoUpdateOperators<T>): Promise<UpdateResult>;
13
38
  deleteManyDocuments<T>(entity: Type<T>, ids: string[]): Promise<DeleteResult>;
14
39
  deleteOneDocument<T>(entity: Type<T>, id: string): Promise<DeleteResult>;
15
40
  aggregateDocuments<T>(entity: Type<T>, pipeline: PipelineStage[]): Promise<T[]>;
@@ -25,4 +50,4 @@ type DynamicApiResetPasswordCallback<Entity extends BaseEntity> = (_: {
25
50
  resetPasswordToken: string;
26
51
  email: string;
27
52
  }, methods: DynamicApiResetPasswordCallbackMethods<Entity>) => Promise<void>;
28
- export type { AfterSaveCallback, DynamicApiServiceCallback, DynamicApiResetPasswordCallback, DynamicApiCallbackMethods, DynamicApiResetPasswordCallbackMethods, CallbackMethods, };
53
+ export type { AfterSaveCallback, DynamicApiServiceCallback, DynamicApiResetPasswordCallback, DynamicApiCallbackMethods, DynamicApiResetPasswordCallbackMethods, CallbackMethods, MongoUpdateOperators, };
@@ -4,6 +4,7 @@ export * from './dynamic-api-decorator-builder.interface';
4
4
  export * from './dynamic-api-cache-options.interface';
5
5
  export * from './dynamic-api-ability.interface';
6
6
  export * from './dynamic-api-broadcast-config.interface';
7
+ export * from './dynamic-api-cascade-config.interface';
7
8
  export * from './dynamic-api-entity-mappers.interface';
8
9
  export * from './dynamic-api-global-state.interface';
9
10
  export * from './dynamic-api-options.interface';
@@ -19,3 +20,4 @@ export * from './dynamic-api-service-callback.interface';
19
20
  export * from './dynamic-api-service-provider.interface';
20
21
  export * from './dynamic-api-swagger-options.type';
21
22
  export * from './dynamic-api-web-socket.interface';
23
+ export * from './dynamic-api-presence.interface';
@@ -20,6 +20,7 @@ __exportStar(require("./dynamic-api-decorator-builder.interface"), exports);
20
20
  __exportStar(require("./dynamic-api-cache-options.interface"), exports);
21
21
  __exportStar(require("./dynamic-api-ability.interface"), exports);
22
22
  __exportStar(require("./dynamic-api-broadcast-config.interface"), exports);
23
+ __exportStar(require("./dynamic-api-cascade-config.interface"), exports);
23
24
  __exportStar(require("./dynamic-api-entity-mappers.interface"), exports);
24
25
  __exportStar(require("./dynamic-api-global-state.interface"), exports);
25
26
  __exportStar(require("./dynamic-api-options.interface"), exports);
@@ -35,4 +36,5 @@ __exportStar(require("./dynamic-api-service-callback.interface"), exports);
35
36
  __exportStar(require("./dynamic-api-service-provider.interface"), exports);
36
37
  __exportStar(require("./dynamic-api-swagger-options.type"), exports);
37
38
  __exportStar(require("./dynamic-api-web-socket.interface"), exports);
39
+ __exportStar(require("./dynamic-api-presence.interface"), exports);
38
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6EAA2D;AAC3D,kEAAgD;AAChD,4EAA0D;AAC1D,wEAAsD;AACtD,kEAAgD;AAChD,2EAAyD;AACzD,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
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6EAA2D;AAC3D,kEAAgD;AAChD,4EAA0D;AAC1D,wEAAsD;AACtD,kEAAgD;AAChD,2EAAyD;AACzD,yEAAuD;AACvD,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;AACnD,mEAAiD"}
@@ -1,7 +1,13 @@
1
1
  import { Type } from '@nestjs/common';
2
2
  import { PipelineStage } from 'mongodb-pipeline-builder';
3
- import { AbilityPredicate, AuthAbilityPredicate, PoliciesGuardConstructor, RouteType } from '../interfaces';
3
+ import { AbilityPredicate, AuthAbilityPredicate, PoliciesGuardConstructor, PredicateBehavior, RouteType } from '../interfaces';
4
4
  import { BaseEntity } from '../models';
5
- declare function RoutePoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, displayedName: string, version: string | undefined, abilityPredicate: AbilityPredicate<Entity> | undefined, queryToPipeline?: (query: unknown) => PipelineStage[]): PoliciesGuardConstructor<Entity>;
6
- declare function SocketPoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, event: string, version: string | undefined, abilityPredicate: AuthAbilityPredicate | undefined, isPublic: boolean | undefined, queryToPipeline?: (query: unknown) => PipelineStage[]): PoliciesGuardConstructor<Entity>;
5
+ declare function RoutePoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, displayedName: string, version: string | undefined, abilityPredicate: AbilityPredicate<Entity> | undefined, queryToPipeline?: (query: unknown) => PipelineStage[], predicateBehavior?: PredicateBehavior): PoliciesGuardConstructor<Entity>;
6
+ interface SocketPoliciesGuardMixinOptions {
7
+ abilityPredicate?: AuthAbilityPredicate;
8
+ isPublic?: boolean;
9
+ queryToPipeline?: (query: unknown) => PipelineStage[];
10
+ predicateBehavior?: PredicateBehavior;
11
+ }
12
+ declare function SocketPoliciesGuardMixin<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, event: string, version: string | undefined, options?: SocketPoliciesGuardMixinOptions): PoliciesGuardConstructor<Entity>;
7
13
  export { RoutePoliciesGuardMixin, SocketPoliciesGuardMixin };
@@ -20,7 +20,7 @@ const mongoose_2 = require("mongoose");
20
20
  const dynamic_api_module_1 = require("../dynamic-api.module");
21
21
  const guards_1 = require("../guards");
22
22
  const helpers_1 = require("../helpers");
23
- function RoutePoliciesGuardMixin(entity, routeType, displayedName, version, abilityPredicate, queryToPipeline) {
23
+ function RoutePoliciesGuardMixin(entity, routeType, displayedName, version, abilityPredicate, queryToPipeline, predicateBehavior) {
24
24
  let RoutePoliciesGuard = class RoutePoliciesGuard extends guards_1.BasePoliciesGuard {
25
25
  constructor(model) {
26
26
  super(model);
@@ -28,6 +28,7 @@ function RoutePoliciesGuardMixin(entity, routeType, displayedName, version, abil
28
28
  this.routeType = routeType;
29
29
  this.entity = entity;
30
30
  this.abilityPredicate = abilityPredicate;
31
+ this.predicateBehavior = predicateBehavior;
31
32
  this.queryToPipeline = queryToPipeline;
32
33
  }
33
34
  };
@@ -42,7 +43,8 @@ function RoutePoliciesGuardMixin(entity, routeType, displayedName, version, abil
42
43
  });
43
44
  return RoutePoliciesGuard;
44
45
  }
45
- function SocketPoliciesGuardMixin(entity, routeType, event, version, abilityPredicate, isPublic, queryToPipeline) {
46
+ function SocketPoliciesGuardMixin(entity, routeType, event, version, options = {}) {
47
+ const { abilityPredicate, isPublic, queryToPipeline, predicateBehavior } = options;
46
48
  let SocketPoliciesGuard = class SocketPoliciesGuard extends guards_1.BaseSocketPoliciesGuard {
47
49
  constructor(model) {
48
50
  super(model);
@@ -50,6 +52,7 @@ function SocketPoliciesGuardMixin(entity, routeType, event, version, abilityPred
50
52
  this.routeType = routeType;
51
53
  this.entity = entity;
52
54
  this.abilityPredicate = abilityPredicate;
55
+ this.predicateBehavior = predicateBehavior;
53
56
  this.queryToPipeline = queryToPipeline;
54
57
  this.isPublic = isPublic;
55
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policies-guard.mixin.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/mixins/policies-guard.mixin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAuFS,0DAAuB;AAAE,4DAAwB;AAvF1D,2CAAkD;AAClD,+CAA+C;AAE/C,uCAAiC;AACjC,8DAAyD;AACzD,sCAAuE;AACvE,wCAAqD;AAUrD,SAAS,uBAAuB,CAC9B,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;AAGD,SAAS,wBAAwB,CAC/B,MAAoB,EACpB,SAAoB,EACpB,KAAa,EACb,OAA2B,EAC3B,gBAAkD,EAClD,QAA6B,EAC7B,eAAqD;IAErD,IACM,mBAAmB,GADzB,MACM,mBAAoB,SAAQ,gCAA+B;QAO/D,YAKE,KAAuC;YAEvC,KAAK,CAAC,KAAK,CAAC,CAAC;YAFM,UAAK,GAAL,KAAK,CAAe;YAX/B,cAAS,GAAG,SAAS,CAAC;YACtB,WAAM,GAAG,MAAM,CAAC;YAChB,qBAAgB,GAAG,gBAAgB,CAAC;YACpC,oBAAe,GAAG,eAAe,CAAC;YAClC,aAAQ,GAAG,QAAQ,CAAC;QAU9B,CAAC;KACF,CAAA;IAhBK,mBAAmB;QADxB,IAAA,mBAAU,GAAE;QASR,WAAA,IAAA,sBAAW,EACV,MAAM,CAAC,IAAI,EACX,qCAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC7C,CAAA;yCACyB,gBAAK;OAZ7B,mBAAmB,CAgBxB;IAED,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,EAAE;QACjD,KAAK,EAAE,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,EAAE;QACrF,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"policies-guard.mixin.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/mixins/policies-guard.mixin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAkGS,0DAAuB;AAAE,4DAAwB;AAlG1D,2CAAkD;AAClD,+CAA+C;AAE/C,uCAAiC;AACjC,8DAAyD;AACzD,sCAAuE;AACvE,wCAAqD;AAWrD,SAAS,uBAAuB,CAC9B,MAAoB,EACpB,SAAoB,EACpB,aAAqB,EACrB,OAA2B,EAC3B,gBAAsD,EACtD,eAAqD,EACrD,iBAAqC;IAErC,IACM,kBAAkB,GADxB,MACM,kBAAmB,SAAQ,0BAAyB;QAOxD,YAKE,KAAuC;YAEvC,KAAK,CAAC,KAAK,CAAC,CAAC;YAFM,UAAK,GAAL,KAAK,CAAe;YAX/B,cAAS,GAAG,SAAS,CAAC;YACtB,WAAM,GAAG,MAAM,CAAC;YAChB,qBAAgB,GAAyC,gBAAgB,CAAC;YAC1E,sBAAiB,GAAkC,iBAAiB,CAAC;YACrE,oBAAe,GAAG,eAAe,CAAC;QAU5C,CAAC;KACF,CAAA;IAhBK,kBAAkB;QADvB,IAAA,mBAAU,GAAE;QASR,WAAA,IAAA,sBAAW,EACV,MAAM,CAAC,IAAI,EACX,qCAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC7C,CAAA;yCACyB,gBAAK;OAZ7B,kBAAkB,CAgBvB;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;AAUD,SAAS,wBAAwB,CAC/B,MAAoB,EACpB,SAAoB,EACpB,KAAa,EACb,OAA2B,EAC3B,UAA2C,EAAE;IAE7C,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEnF,IACM,mBAAmB,GADzB,MACM,mBAAoB,SAAQ,gCAA+B;QAQ/D,YAKE,KAAuC;YAEvC,KAAK,CAAC,KAAK,CAAC,CAAC;YAFM,UAAK,GAAL,KAAK,CAAe;YAZ/B,cAAS,GAAG,SAAS,CAAC;YACtB,WAAM,GAAG,MAAM,CAAC;YAChB,qBAAgB,GAAG,gBAAgB,CAAC;YACpC,sBAAiB,GAAkC,iBAAiB,CAAC;YACrE,oBAAe,GAAG,eAAe,CAAC;YAClC,aAAQ,GAAG,QAAQ,CAAC;QAU9B,CAAC;KACF,CAAA;IAjBK,mBAAmB;QADxB,IAAA,mBAAU,GAAE;QAUR,WAAA,IAAA,sBAAW,EACV,MAAM,CAAC,IAAI,EACX,qCAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC7C,CAAA;yCACyB,gBAAK;OAb7B,mBAAmB,CAiBxB;IAED,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,EAAE;QACjD,KAAK,EAAE,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,EAAE;QACrF,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { PresenceAdapter } from '../../../interfaces';
2
+ export declare class InMemoryPresenceAdapter implements PresenceAdapter {
3
+ private readonly socketsByUser;
4
+ private readonly roomBySocket;
5
+ setOnline(userId: string, socketId: string, room?: string): Promise<void>;
6
+ setOffline(userId: string, socketId: string): Promise<void>;
7
+ isOnline(userId: string): Promise<boolean>;
8
+ getOnlineUserIds(room?: string): Promise<string[]>;
9
+ getSocketCount(userId: string): Promise<number>;
10
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.InMemoryPresenceAdapter = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let InMemoryPresenceAdapter = class InMemoryPresenceAdapter {
12
+ constructor() {
13
+ this.socketsByUser = new Map();
14
+ this.roomBySocket = new Map();
15
+ }
16
+ async setOnline(userId, socketId, room) {
17
+ if (!this.socketsByUser.has(userId)) {
18
+ this.socketsByUser.set(userId, new Set());
19
+ }
20
+ const sockets = this.socketsByUser.get(userId) ?? new Set();
21
+ sockets.add(socketId);
22
+ this.socketsByUser.set(userId, sockets);
23
+ if (room) {
24
+ this.roomBySocket.set(socketId, room);
25
+ }
26
+ }
27
+ async setOffline(userId, socketId) {
28
+ const sockets = this.socketsByUser.get(userId);
29
+ if (sockets) {
30
+ sockets.delete(socketId);
31
+ if (sockets.size === 0) {
32
+ this.socketsByUser.delete(userId);
33
+ }
34
+ }
35
+ this.roomBySocket.delete(socketId);
36
+ }
37
+ async isOnline(userId) {
38
+ const sockets = this.socketsByUser.get(userId);
39
+ return !!(sockets && sockets.size > 0);
40
+ }
41
+ async getOnlineUserIds(room) {
42
+ if (!room) {
43
+ return Array.from(this.socketsByUser.keys());
44
+ }
45
+ const result = [];
46
+ for (const [userId, sockets] of this.socketsByUser.entries()) {
47
+ for (const socketId of sockets) {
48
+ if (this.roomBySocket.get(socketId) === room) {
49
+ result.push(userId);
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ return result;
55
+ }
56
+ async getSocketCount(userId) {
57
+ return this.socketsByUser.get(userId)?.size ?? 0;
58
+ }
59
+ };
60
+ exports.InMemoryPresenceAdapter = InMemoryPresenceAdapter;
61
+ exports.InMemoryPresenceAdapter = InMemoryPresenceAdapter = __decorate([
62
+ (0, common_1.Injectable)()
63
+ ], InMemoryPresenceAdapter);
64
+ //# sourceMappingURL=in-memory-presence.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-presence.adapter.js","sourceRoot":"","sources":["../../../../../libs/dynamic-api/src/modules/presence/adapters/in-memory-presence.adapter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAarC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QAEY,kBAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;QAE/C,iBAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAwD5D,CAAC;IAtDC,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAAgB,EAAE,IAAa;QAC7D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAExC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAa;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC7C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AA5DY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CA4DnC"}
@@ -0,0 +1,17 @@
1
+ import { OnModuleDestroy } from '@nestjs/common';
2
+ import Redis from 'ioredis';
3
+ import { PresenceAdapter } from '../../../interfaces';
4
+ export declare const DEFAULT_REDIS_PRESENCE_TTL = 60;
5
+ export declare class RedisPresenceAdapter implements PresenceAdapter, OnModuleDestroy {
6
+ private readonly redis;
7
+ private readonly ttl;
8
+ constructor(redisUrlOrClient: string | Redis, ttlSeconds?: number);
9
+ onModuleDestroy(): Promise<void>;
10
+ private socketsKey;
11
+ private roomKey;
12
+ setOnline(userId: string, socketId: string, room?: string): Promise<void>;
13
+ setOffline(userId: string, socketId: string): Promise<void>;
14
+ isOnline(userId: string): Promise<boolean>;
15
+ getOnlineUserIds(room?: string): Promise<string[]>;
16
+ getSocketCount(userId: string): Promise<number>;
17
+ }