mongodb-dynamic-api 4.15.0 → 4.17.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 (228) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +2 -1
  3. package/package.json +1 -1
  4. package/src/decorators/entity-exists.decorator.d.ts +10 -0
  5. package/src/decorators/entity-exists.decorator.js +37 -0
  6. package/src/decorators/entity-exists.decorator.js.map +1 -0
  7. package/src/decorators/index.d.ts +2 -0
  8. package/src/decorators/index.js +2 -0
  9. package/src/decorators/index.js.map +1 -1
  10. package/src/decorators/is-unique.decorator.d.ts +10 -0
  11. package/src/decorators/is-unique.decorator.js +48 -0
  12. package/src/decorators/is-unique.decorator.js.map +1 -0
  13. package/src/dynamic-api.module.d.ts +1 -1
  14. package/src/dynamic-api.module.js +4 -3
  15. package/src/dynamic-api.module.js.map +1 -1
  16. package/src/gateways/base.gateway.js +13 -19
  17. package/src/gateways/base.gateway.js.map +1 -1
  18. package/src/helpers/event-registry.store.d.ts +29 -0
  19. package/src/helpers/event-registry.store.js +45 -0
  20. package/src/helpers/event-registry.store.js.map +1 -0
  21. package/src/helpers/index.d.ts +1 -0
  22. package/src/helpers/index.js +1 -0
  23. package/src/helpers/index.js.map +1 -1
  24. package/src/helpers/mixin-data.helper.d.ts +2 -2
  25. package/src/helpers/mixin-data.helper.js +14 -1
  26. package/src/helpers/mixin-data.helper.js.map +1 -1
  27. package/src/helpers/resolve-broadcast.helper.d.ts +8 -0
  28. package/src/helpers/resolve-broadcast.helper.js +25 -0
  29. package/src/helpers/resolve-broadcast.helper.js.map +1 -0
  30. package/src/helpers/socket-config.helper.js +14 -0
  31. package/src/helpers/socket-config.helper.js.map +1 -1
  32. package/src/index.d.ts +1 -0
  33. package/src/index.js +1 -0
  34. package/src/index.js.map +1 -1
  35. package/src/interfaces/dynamic-api-global-state.interface.d.ts +2 -0
  36. package/src/interfaces/dynamic-api-options.interface.d.ts +2 -0
  37. package/src/interfaces/dynamic-api-options.interface.js.map +1 -1
  38. package/src/interfaces/dynamic-api-route-config.interface.d.ts +2 -1
  39. package/src/interfaces/dynamic-api-route-config.interface.js.map +1 -1
  40. package/src/interfaces/dynamic-api-service-callback.interface.d.ts +14 -1
  41. package/src/interfaces/dynamic-api-web-socket.interface.d.ts +1 -0
  42. package/src/modules/auth/mixins/auth-controller.mixin.js +49 -0
  43. package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
  44. package/src/modules/auth/mixins/auth-gateway.mixin.js +49 -0
  45. package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
  46. package/src/predicates/admin.predicate.d.ts +9 -0
  47. package/src/predicates/admin.predicate.js +17 -0
  48. package/src/predicates/admin.predicate.js.map +1 -0
  49. package/src/predicates/composition.predicate.d.ts +6 -0
  50. package/src/predicates/composition.predicate.js +15 -0
  51. package/src/predicates/composition.predicate.js.map +1 -0
  52. package/src/predicates/group-member.predicate.d.ts +8 -0
  53. package/src/predicates/group-member.predicate.js +19 -0
  54. package/src/predicates/group-member.predicate.js.map +1 -0
  55. package/src/predicates/index.d.ts +6 -0
  56. package/src/predicates/index.js +23 -0
  57. package/src/predicates/index.js.map +1 -0
  58. package/src/predicates/ownership.predicate.d.ts +8 -0
  59. package/src/predicates/ownership.predicate.js +14 -0
  60. package/src/predicates/ownership.predicate.js.map +1 -0
  61. package/src/predicates/soft-delete.predicate.d.ts +7 -0
  62. package/src/predicates/soft-delete.predicate.js +8 -0
  63. package/src/predicates/soft-delete.predicate.js.map +1 -0
  64. package/src/predicates/visibility.predicate.d.ts +7 -0
  65. package/src/predicates/visibility.predicate.js +8 -0
  66. package/src/predicates/visibility.predicate.js.map +1 -0
  67. package/src/routes/aggregate/aggregate.helper.d.ts +2 -2
  68. package/src/routes/aggregate/aggregate.helper.js +3 -2
  69. package/src/routes/aggregate/aggregate.helper.js.map +1 -1
  70. package/src/routes/aggregate/aggregate.module.js +1 -1
  71. package/src/routes/aggregate/aggregate.module.js.map +1 -1
  72. package/src/routes/aggregate/base-aggregate.service.d.ts +2 -1
  73. package/src/routes/aggregate/base-aggregate.service.js +2 -2
  74. package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
  75. package/src/routes/create-many/base-create-many.service.d.ts +2 -1
  76. package/src/routes/create-many/base-create-many.service.js +2 -2
  77. package/src/routes/create-many/base-create-many.service.js.map +1 -1
  78. package/src/routes/create-many/create-many-controller.mixin.js +1 -1
  79. package/src/routes/create-many/create-many-controller.mixin.js.map +1 -1
  80. package/src/routes/create-many/create-many-gateway.mixin.js +1 -1
  81. package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
  82. package/src/routes/create-many/create-many.helper.d.ts +2 -2
  83. package/src/routes/create-many/create-many.helper.js +3 -2
  84. package/src/routes/create-many/create-many.helper.js.map +1 -1
  85. package/src/routes/create-many/create-many.module.js +1 -1
  86. package/src/routes/create-many/create-many.module.js.map +1 -1
  87. package/src/routes/create-one/base-create-one.service.d.ts +2 -1
  88. package/src/routes/create-one/base-create-one.service.js +1 -3
  89. package/src/routes/create-one/base-create-one.service.js.map +1 -1
  90. package/src/routes/create-one/create-one-controller.mixin.js +1 -1
  91. package/src/routes/create-one/create-one-controller.mixin.js.map +1 -1
  92. package/src/routes/create-one/create-one-gateway.mixin.js +1 -1
  93. package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
  94. package/src/routes/create-one/create-one.helper.d.ts +2 -2
  95. package/src/routes/create-one/create-one.helper.js +3 -2
  96. package/src/routes/create-one/create-one.helper.js.map +1 -1
  97. package/src/routes/create-one/create-one.module.js +1 -1
  98. package/src/routes/create-one/create-one.module.js.map +1 -1
  99. package/src/routes/delete-many/base-delete-many.service.d.ts +2 -1
  100. package/src/routes/delete-many/base-delete-many.service.js +2 -2
  101. package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
  102. package/src/routes/delete-many/delete-many-controller.mixin.js +1 -1
  103. package/src/routes/delete-many/delete-many-controller.mixin.js.map +1 -1
  104. package/src/routes/delete-many/delete-many-gateway.mixin.js +1 -1
  105. package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
  106. package/src/routes/delete-many/delete-many.helper.d.ts +2 -2
  107. package/src/routes/delete-many/delete-many.helper.js +3 -2
  108. package/src/routes/delete-many/delete-many.helper.js.map +1 -1
  109. package/src/routes/delete-many/delete-many.module.js +1 -1
  110. package/src/routes/delete-many/delete-many.module.js.map +1 -1
  111. package/src/routes/delete-one/base-delete-one.service.d.ts +2 -1
  112. package/src/routes/delete-one/base-delete-one.service.js +2 -2
  113. package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
  114. package/src/routes/delete-one/delete-one-controller.mixin.js +1 -1
  115. package/src/routes/delete-one/delete-one-controller.mixin.js.map +1 -1
  116. package/src/routes/delete-one/delete-one-gateway.mixin.js +1 -1
  117. package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
  118. package/src/routes/delete-one/delete-one.helper.d.ts +2 -2
  119. package/src/routes/delete-one/delete-one.helper.js +3 -2
  120. package/src/routes/delete-one/delete-one.helper.js.map +1 -1
  121. package/src/routes/delete-one/delete-one.module.js +1 -1
  122. package/src/routes/delete-one/delete-one.module.js.map +1 -1
  123. package/src/routes/duplicate-many/base-duplicate-many.service.d.ts +2 -1
  124. package/src/routes/duplicate-many/base-duplicate-many.service.js +2 -2
  125. package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
  126. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +1 -1
  127. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js.map +1 -1
  128. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +1 -1
  129. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
  130. package/src/routes/duplicate-many/duplicate-many.helper.d.ts +2 -2
  131. package/src/routes/duplicate-many/duplicate-many.helper.js +3 -2
  132. package/src/routes/duplicate-many/duplicate-many.helper.js.map +1 -1
  133. package/src/routes/duplicate-many/duplicate-many.module.js +1 -1
  134. package/src/routes/duplicate-many/duplicate-many.module.js.map +1 -1
  135. package/src/routes/duplicate-one/base-duplicate-one.service.d.ts +2 -1
  136. package/src/routes/duplicate-one/base-duplicate-one.service.js +1 -3
  137. package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
  138. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +1 -1
  139. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js.map +1 -1
  140. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +1 -1
  141. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
  142. package/src/routes/duplicate-one/duplicate-one.helper.d.ts +2 -2
  143. package/src/routes/duplicate-one/duplicate-one.helper.js +3 -2
  144. package/src/routes/duplicate-one/duplicate-one.helper.js.map +1 -1
  145. package/src/routes/duplicate-one/duplicate-one.module.js +1 -1
  146. package/src/routes/duplicate-one/duplicate-one.module.js.map +1 -1
  147. package/src/routes/get-many/base-get-many.service.d.ts +2 -1
  148. package/src/routes/get-many/base-get-many.service.js +2 -2
  149. package/src/routes/get-many/base-get-many.service.js.map +1 -1
  150. package/src/routes/get-many/get-many.helper.d.ts +2 -2
  151. package/src/routes/get-many/get-many.helper.js +3 -2
  152. package/src/routes/get-many/get-many.helper.js.map +1 -1
  153. package/src/routes/get-many/get-many.module.js +1 -1
  154. package/src/routes/get-many/get-many.module.js.map +1 -1
  155. package/src/routes/get-one/base-get-one.service.d.ts +2 -1
  156. package/src/routes/get-one/base-get-one.service.js +1 -3
  157. package/src/routes/get-one/base-get-one.service.js.map +1 -1
  158. package/src/routes/get-one/get-one.helper.d.ts +2 -2
  159. package/src/routes/get-one/get-one.helper.js +3 -2
  160. package/src/routes/get-one/get-one.helper.js.map +1 -1
  161. package/src/routes/get-one/get-one.module.js +1 -1
  162. package/src/routes/get-one/get-one.module.js.map +1 -1
  163. package/src/routes/replace-one/base-replace-one.service.d.ts +2 -1
  164. package/src/routes/replace-one/base-replace-one.service.js +1 -3
  165. package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
  166. package/src/routes/replace-one/replace-one-controller.mixin.js +1 -1
  167. package/src/routes/replace-one/replace-one-controller.mixin.js.map +1 -1
  168. package/src/routes/replace-one/replace-one-gateway.mixin.js +1 -1
  169. package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
  170. package/src/routes/replace-one/replace-one.helper.d.ts +2 -2
  171. package/src/routes/replace-one/replace-one.helper.js +3 -2
  172. package/src/routes/replace-one/replace-one.helper.js.map +1 -1
  173. package/src/routes/replace-one/replace-one.module.js +1 -1
  174. package/src/routes/replace-one/replace-one.module.js.map +1 -1
  175. package/src/routes/update-many/base-update-many.service.d.ts +2 -1
  176. package/src/routes/update-many/base-update-many.service.js +2 -2
  177. package/src/routes/update-many/base-update-many.service.js.map +1 -1
  178. package/src/routes/update-many/update-many-controller.mixin.js +1 -1
  179. package/src/routes/update-many/update-many-controller.mixin.js.map +1 -1
  180. package/src/routes/update-many/update-many-gateway.mixin.js +1 -1
  181. package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
  182. package/src/routes/update-many/update-many.helper.d.ts +2 -2
  183. package/src/routes/update-many/update-many.helper.js +3 -2
  184. package/src/routes/update-many/update-many.helper.js.map +1 -1
  185. package/src/routes/update-many/update-many.module.js +1 -1
  186. package/src/routes/update-many/update-many.module.js.map +1 -1
  187. package/src/routes/update-one/base-update-one.service.d.ts +2 -1
  188. package/src/routes/update-one/base-update-one.service.js +1 -3
  189. package/src/routes/update-one/base-update-one.service.js.map +1 -1
  190. package/src/routes/update-one/update-one-controller.mixin.js +1 -1
  191. package/src/routes/update-one/update-one-controller.mixin.js.map +1 -1
  192. package/src/routes/update-one/update-one-gateway.mixin.js +1 -1
  193. package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
  194. package/src/routes/update-one/update-one.helper.d.ts +2 -2
  195. package/src/routes/update-one/update-one.helper.js +3 -2
  196. package/src/routes/update-one/update-one.helper.js.map +1 -1
  197. package/src/routes/update-one/update-one.module.js +1 -1
  198. package/src/routes/update-one/update-one.module.js.map +1 -1
  199. package/src/services/base/base.service.d.ts +3 -1
  200. package/src/services/base/base.service.js +32 -0
  201. package/src/services/base/base.service.js.map +1 -1
  202. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.d.ts +1 -0
  203. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js +17 -15
  204. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js.map +1 -1
  205. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +1 -0
  206. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
  207. package/src/version.json +1 -1
  208. package/test/for-feature/ability-predicates.e2e-spec.d.ts +1 -0
  209. package/test/for-feature/ability-predicates.e2e-spec.js +188 -0
  210. package/test/for-feature/ability-predicates.e2e-spec.js.map +1 -0
  211. package/test/for-feature/after-save-callback-reliability.e2e-spec.d.ts +1 -0
  212. package/test/for-feature/after-save-callback-reliability.e2e-spec.js +139 -0
  213. package/test/for-feature/after-save-callback-reliability.e2e-spec.js.map +1 -0
  214. package/test/for-feature/broadcast-event-registry.e2e-spec.d.ts +1 -0
  215. package/test/for-feature/broadcast-event-registry.e2e-spec.js +122 -0
  216. package/test/for-feature/broadcast-event-registry.e2e-spec.js.map +1 -0
  217. package/test/for-feature/db-aware-validators.e2e-spec.d.ts +1 -0
  218. package/test/for-feature/db-aware-validators.e2e-spec.js +121 -0
  219. package/test/for-feature/db-aware-validators.e2e-spec.js.map +1 -0
  220. package/test/for-feature/raw-update-callback-methods.e2e-spec.js +8 -6
  221. package/test/for-feature/raw-update-callback-methods.e2e-spec.js.map +1 -1
  222. package/test/for-root/auth-api-basic.e2e-spec.js +2 -0
  223. package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -1
  224. package/test/for-root/initialization.e2e-spec.js +2 -0
  225. package/test/for-root/initialization.e2e-spec.js.map +1 -1
  226. package/test/for-root/websockets-auth-basic.e2e-spec.js +1 -0
  227. package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -1
  228. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,69 @@
1
1
  Changelog
2
2
 
3
+ ## [4.17.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.17.0) (2026-08-12)
4
+
5
+ ### routes
6
+
7
+ * **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
8
+
9
+ ### callbacks
10
+
11
+ * **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
12
+ * **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
13
+ * **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
14
+
15
+ ### predicates
16
+
17
+ * **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
18
+
19
+ ### websockets
20
+
21
+ * **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
22
+
23
+ ### broadcast
24
+
25
+ * **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
26
+ * **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
27
+ * **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
28
+ * **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
29
+
30
+ ### decorators
31
+
32
+ * **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
33
+ * **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
34
+
35
+ ## [4.16.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.16.0) (2026-08-12)
36
+
37
+ ### routes
38
+
39
+ * **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
40
+
41
+ ### callbacks
42
+
43
+ * **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
44
+ * **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
45
+ * **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
46
+
47
+ ### predicates
48
+
49
+ * **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
50
+
51
+ ### websockets
52
+
53
+ * **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
54
+
55
+ ### broadcast
56
+
57
+ * **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
58
+ * **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
59
+ * **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
60
+ * **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
61
+
62
+ ### decorators
63
+
64
+ * **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
65
+ * **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
66
+
3
67
  ## [4.15.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.14.1...v4.15.0) (2026-05-31)
4
68
 
5
69
  ### auth
package/README.md CHANGED
@@ -259,7 +259,7 @@ Register `UsersModule` in `AppModule`, run `npm run start:dev` — your API is l
259
259
  | 🔐 **Authentication** | Dual-token JWT, 8 endpoints, cookie mode, revocation, OTP ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authentication.md) |
260
260
  | 🛡️ **Authorization** | Ability predicates, `filter` vs `throw` mode | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authorization.md) |
261
261
  | ⚡ **Caching** | Global cache, auto-purge endpoint, `disableCache` option ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/caching.md) |
262
- | ✅ **Validation** | `class-validator`, global + per-route `ValidationPipe` | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/validation.md) |
262
+ | ✅ **Validation** | `class-validator`, global + per-route `ValidationPipe`, DB-aware `@IsUnique`/`@EntityExists` ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/validation.md) |
263
263
  | 📡 **WebSockets** | Socket.IO, room-targeted broadcast, `onConnection`, debug ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/websockets.md) |
264
264
  | 🟢 **Presence** | Online/offline tracking, InMemory & Redis adapters ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/presence.md) |
265
265
  | 🔁 **Callbacks** | `beforeSave`, `afterSave`, `beforeDelete`, typed contexts ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/callbacks.md) |
@@ -267,6 +267,7 @@ Register `UsersModule` in `AppModule`, run `npm run start:dev` — your API is l
267
267
  | 📚 **Swagger UI** | Auto-generated OpenAPI docs, visibility decorators | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/swagger-ui.md) |
268
268
  | 🗂️ **Route Config** | DTOs, cascade delete, predicates, subPath, interceptors ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/route-config.md) |
269
269
  | 🎛️ **Controller Config** | `forFeature` options, `customRoutes`, `extraProviders` ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/controller-config.md) |
270
+ | 🐞 **Debugging** | `MONGODB_DYNAMIC_API_LOGGER` levels, WS debug mode, where each log comes from ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/debugging.md) |
270
271
 
271
272
  > [!NOTE]
272
273
  > **Key reminders:**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongodb-dynamic-api",
3
- "version": "4.15.0",
3
+ "version": "4.17.0",
4
4
  "description": "Auto generated CRUD API for MongoDB using NestJS",
5
5
  "readmeFilename": "README.md",
6
6
  "main": "index.js",
@@ -0,0 +1,10 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { ValidationOptions } from 'class-validator';
3
+ import { FilterQuery } from 'mongoose';
4
+ import { BaseEntity } from '../models';
5
+ interface EntityExistsOptions<Entity extends BaseEntity> {
6
+ field?: keyof Entity;
7
+ filter?: (value: unknown, dto: unknown) => FilterQuery<Entity>;
8
+ }
9
+ declare function EntityExists<Entity extends BaseEntity>(entity: Type<Entity>, options?: EntityExistsOptions<Entity>, validationOptions?: ValidationOptions): PropertyDecorator;
10
+ export { EntityExists, EntityExistsOptions };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityExists = EntityExists;
4
+ const class_validator_1 = require("class-validator");
5
+ const services_1 = require("../services");
6
+ function EntityExists(entity, options = {}, validationOptions) {
7
+ return (object, propertyName) => {
8
+ (0, class_validator_1.registerDecorator)({
9
+ name: 'entityExists',
10
+ target: object.constructor,
11
+ propertyName: propertyName,
12
+ options: validationOptions,
13
+ constraints: [entity, options],
14
+ validator: {
15
+ async validate(value, args) {
16
+ if (value === undefined || value === null || value === '') {
17
+ return true;
18
+ }
19
+ const [targetEntity, opts] = args.constraints;
20
+ const field = String(opts.field ?? '_id');
21
+ const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
22
+ const filter = {
23
+ [field]: value,
24
+ ...opts.filter?.(value, args.object),
25
+ };
26
+ const existing = await model.exists(filter);
27
+ return !!existing;
28
+ },
29
+ defaultMessage(args) {
30
+ const [targetEntity] = args.constraints;
31
+ return `Referenced ${targetEntity.name} does not exist`;
32
+ },
33
+ },
34
+ });
35
+ };
36
+ }
37
+ //# sourceMappingURL=entity-exists.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-exists.decorator.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/entity-exists.decorator.ts"],"names":[],"mappings":";;AAwGS,oCAAY;AAvGrB,qDAA4F;AAG5F,0CAA2D;AA4D3D,SAAS,YAAY,CACnB,MAAoB,EACpB,UAAuC,EAAE,EACzC,iBAAqC;IAErC,OAAO,CAAC,MAAc,EAAE,YAA6B,EAAE,EAAE;QACvD,IAAA,mCAAiB,EAAC;YAChB,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAsB;YACpC,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAC9B,SAAS,EAAE;gBACT,KAAK,CAAC,QAAQ,CAAC,KAAc,EAAE,IAAyB;oBACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;wBAC1D,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,GACxB,IAAI,CAAC,WAA0D,CAAC;oBAClE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAG,MAAM,uCAA4B,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;oBAE9E,MAAM,MAAM,GAAG;wBACb,CAAC,KAAK,CAAC,EAAE,KAAK;wBACd,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;qBACd,CAAC;oBAEzB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5C,OAAO,CAAC,CAAC,QAAQ,CAAC;gBACpB,CAAC;gBACD,cAAc,CAAC,IAAyB;oBACtC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,WAA6B,CAAC;oBAC1D,OAAO,cAAc,YAAY,CAAC,IAAI,iBAAiB,CAAC;gBAC1D,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1,6 +1,8 @@
1
1
  export * from './api-endpoint-visibility.decorator';
2
2
  export * from './derived-field.decorator';
3
3
  export * from './disable-cache.decorator';
4
+ export * from './entity-exists.decorator';
5
+ export * from './is-unique.decorator';
4
6
  export * from './protected-field.decorator';
5
7
  export * from './public.decorator';
6
8
  export * from './schema-options.decorator';
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./api-endpoint-visibility.decorator"), exports);
18
18
  __exportStar(require("./derived-field.decorator"), exports);
19
19
  __exportStar(require("./disable-cache.decorator"), exports);
20
+ __exportStar(require("./entity-exists.decorator"), exports);
21
+ __exportStar(require("./is-unique.decorator"), exports);
20
22
  __exportStar(require("./protected-field.decorator"), exports);
21
23
  __exportStar(require("./public.decorator"), exports);
22
24
  __exportStar(require("./schema-options.decorator"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,4DAA0C;AAC1C,4DAA0C;AAC1C,8DAA4C;AAC5C,qDAAmC;AACnC,6DAA2C;AAC3C,6DAA2C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,4DAA0C;AAC1C,4DAA0C;AAC1C,4DAA0C;AAC1C,wDAAsC;AACtC,8DAA4C;AAC5C,qDAAmC;AACnC,6DAA2C;AAC3C,6DAA2C"}
@@ -0,0 +1,10 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { ValidationOptions } from 'class-validator';
3
+ import { BaseEntity } from '../models';
4
+ interface IsUniqueOptions<Entity extends BaseEntity> {
5
+ field?: keyof Entity;
6
+ caseInsensitive?: boolean;
7
+ ignoreId?: string;
8
+ }
9
+ declare function IsUnique<Entity extends BaseEntity>(entity: Type<Entity>, options?: IsUniqueOptions<Entity>, validationOptions?: ValidationOptions): PropertyDecorator;
10
+ export { IsUnique, IsUniqueOptions };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IsUnique = IsUnique;
4
+ const class_validator_1 = require("class-validator");
5
+ const services_1 = require("../services");
6
+ function escapeRegExp(value) {
7
+ return value.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
8
+ }
9
+ function IsUnique(entity, options = {}, validationOptions) {
10
+ return (object, propertyName) => {
11
+ (0, class_validator_1.registerDecorator)({
12
+ name: 'isUnique',
13
+ target: object.constructor,
14
+ propertyName: propertyName,
15
+ options: validationOptions,
16
+ constraints: [entity, options, propertyName],
17
+ validator: {
18
+ async validate(value, args) {
19
+ if (value === undefined || value === null || value === '') {
20
+ return true;
21
+ }
22
+ const [targetEntity, opts, defaultField] = args.constraints;
23
+ const field = String(opts.field ?? defaultField);
24
+ const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
25
+ const filter = {
26
+ [field]: opts.caseInsensitive && typeof value === 'string'
27
+ ? { $regex: `^${escapeRegExp(value)}$`, $options: 'i' }
28
+ : value,
29
+ };
30
+ if (opts.ignoreId) {
31
+ const currentId = args.object[opts.ignoreId];
32
+ if (currentId) {
33
+ Object.assign(filter, { _id: { $ne: currentId } });
34
+ }
35
+ }
36
+ const existing = await model.exists(filter);
37
+ return !existing;
38
+ },
39
+ defaultMessage(args) {
40
+ const [targetEntity, opts, defaultField] = args.constraints;
41
+ const field = String(opts.field ?? defaultField);
42
+ return `${field} must be unique for ${targetEntity.name}`;
43
+ },
44
+ },
45
+ });
46
+ };
47
+ }
48
+ //# sourceMappingURL=is-unique.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-unique.decorator.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/is-unique.decorator.ts"],"names":[],"mappings":";;AAgHS,4BAAQ;AA/GjB,qDAA4F;AAG5F,0CAA2D;AAwB3D,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAA,KAAK,CAAC,CAAC;AAC/D,CAAC;AAgCD,SAAS,QAAQ,CACf,MAAoB,EACpB,UAAmC,EAAE,EACrC,iBAAqC;IAErC,OAAO,CAAC,MAAc,EAAE,YAA6B,EAAE,EAAE;QACvD,IAAA,mCAAiB,EAAC;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAsB;YACpC,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,YAAsB,CAAC;YACtD,SAAS,EAAE;gBACT,KAAK,CAAC,QAAQ,CAAC,KAAc,EAAE,IAAyB;oBACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;wBAC1D,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,GACtC,IAAI,CAAC,WAA8D,CAAC;oBACtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,uCAA4B,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;oBAE9E,MAAM,MAAM,GAAG;wBACb,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,IAAI,OAAO,KAAK,KAAK,QAAQ;4BACxD,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;4BACvD,CAAC,CAAC,KAAK;qBACa,CAAC;oBAEzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAClB,MAAM,SAAS,GAAI,IAAI,CAAC,MAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC1E,IAAI,SAAS,EAAE,CAAC;4BACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5C,OAAO,CAAC,QAAQ,CAAC;gBACnB,CAAC;gBACD,cAAc,CAAC,IAAyB;oBACtC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,GACtC,IAAI,CAAC,WAA8D,CAAC;oBACtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;oBACjD,OAAO,GAAG,KAAK,uBAAuB,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC5D,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -4,7 +4,7 @@ import { BaseEntity } from './models';
4
4
  import { DynamicApiGlobalStateService } from './services';
5
5
  export declare class DynamicApiModule {
6
6
  static readonly state: DynamicApiGlobalStateService;
7
- static forRoot<Entity extends BaseEntity = any>(uri: string, { useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions, }?: DynamicApiForRootOptions<Entity>): DynamicModule;
7
+ static forRoot<Entity extends BaseEntity = any>(uri: string, { useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, }?: DynamicApiForRootOptions<Entity>): DynamicModule;
8
8
  static forFeature<Entity extends BaseEntity>({ entity, controllerOptions, routes, webSocket: featureWebSocket, extraImports, extraProviders, extraControllers, customRoutes, }: DynamicApiForFeatureOptions<Entity>): Promise<DynamicModule>;
9
9
  private static buildStateFromOptions;
10
10
  private static setDefaultRoutes;
@@ -22,13 +22,13 @@ const modules_1 = require("./modules");
22
22
  const routes_1 = require("./routes");
23
23
  const services_1 = require("./services");
24
24
  let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
25
- static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, routesConfig, webSocket, broadcastGatewayOptions, } = {}) {
25
+ static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, } = {}) {
26
26
  if (!uri) {
27
27
  throw new Error('You must provide a valid mongodb uri in the forRoot method to use MongoDB Dynamic API');
28
28
  }
29
29
  this.state.set([
30
30
  'partial',
31
- this.buildStateFromOptions(uri, useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions),
31
+ this.buildStateFromOptions(uri, useGlobalCache, cacheOptions, { useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError }),
32
32
  ]);
33
33
  return {
34
34
  module: DynamicApiModule_1,
@@ -141,12 +141,13 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
141
141
  });
142
142
  });
143
143
  }
144
- static buildStateFromOptions(uri, useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions) {
144
+ static buildStateFromOptions(uri, useGlobalCache, cacheOptions, { useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, }) {
145
145
  const routesConfigState = this.state.get('routesConfig');
146
146
  return {
147
147
  uri,
148
148
  initialized: true,
149
149
  isGlobalCacheEnabled: useGlobalCache,
150
+ ...(onAfterSaveError ? { onAfterSaveError } : {}),
150
151
  ...(cacheOptions?.excludePaths ? { cacheExcludedPaths: cacheOptions?.excludePaths } : {}),
151
152
  ...(useAuth?.userEntity ? {
152
153
  isAuthEnabled: true,
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":"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"}
@@ -42,30 +42,24 @@ class BaseGateway {
42
42
  body.ids.length);
43
43
  }
44
44
  broadcastIfNeeded(socket, event, data, broadcastConfig) {
45
- if (!broadcastConfig) {
45
+ const resolved = (0, helpers_1.resolveBroadcast)(event, data, broadcastConfig, socket.user);
46
+ if (!resolved) {
46
47
  return;
47
48
  }
48
- const { enabled, eventName, rooms } = broadcastConfig;
49
- if (typeof enabled === 'boolean' && !enabled) {
50
- return;
51
- }
52
- const broadcastData = typeof enabled === 'function'
53
- ? data.filter((item) => enabled(item, socket.user))
54
- : data;
55
- if (!broadcastData.length) {
56
- return;
57
- }
58
- const broadcastEvent = eventName || event;
59
- const resolvedRooms = (0, helpers_1.resolveRooms)(rooms, broadcastData, socket.user);
49
+ const { event: broadcastEvent, rooms, data: broadcastData } = resolved;
60
50
  if (helpers_1.DynamicApiWsConfigStore.debug) {
61
- this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${resolvedRooms ? JSON.stringify(resolvedRooms) : 'all'}, items=${broadcastData.length}`);
51
+ this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${rooms ? JSON.stringify(rooms) : 'all'}, items=${broadcastData.length}`);
62
52
  }
63
- if (resolvedRooms) {
64
- const nsp = socket.nsp;
65
- nsp.to(resolvedRooms).emit(broadcastEvent, broadcastData);
53
+ try {
54
+ if (rooms) {
55
+ socket.nsp.to(rooms).emit(broadcastEvent, broadcastData);
56
+ }
57
+ else {
58
+ socket.broadcast.emit(broadcastEvent, broadcastData);
59
+ }
66
60
  }
67
- else {
68
- socket.broadcast.emit(broadcastEvent, broadcastData);
61
+ catch (error) {
62
+ this.logger.error(`[WS] Failed to emit "${broadcastEvent}": ${error.message}`, error.stack);
69
63
  }
70
64
  }
71
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.gateway.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/gateways/base.gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.gateway.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/gateways/base.gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { RouteType } from '../interfaces';
2
+ type BroadcastChannel = 'http' | 'ws';
3
+ interface BroadcastEventDescriptor {
4
+ event: string;
5
+ routeType: RouteType | 'Auth';
6
+ entityName: string;
7
+ displayedName: string;
8
+ channels: BroadcastChannel[];
9
+ hasRoomTargeting: boolean;
10
+ hasAbilityPredicate: boolean;
11
+ isCustomEventName: boolean;
12
+ }
13
+ interface EventCollision {
14
+ event: string;
15
+ registrations: Pick<BroadcastEventDescriptor, 'routeType' | 'entityName'>[];
16
+ }
17
+ type BroadcastEventRegistration = Omit<BroadcastEventDescriptor, 'channels'> & {
18
+ channel: BroadcastChannel;
19
+ };
20
+ declare class DynamicApiEventRegistryStore {
21
+ private static readonly logger;
22
+ private static readonly registry;
23
+ private static readonly _collisions;
24
+ static register({ channel, ...descriptor }: BroadcastEventRegistration): void;
25
+ static getAll(): BroadcastEventDescriptor[];
26
+ static getCollisions(): EventCollision[];
27
+ static reset(): void;
28
+ }
29
+ export { DynamicApiEventRegistryStore, BroadcastEventDescriptor, BroadcastEventRegistration, EventCollision, BroadcastChannel };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DynamicApiEventRegistryStore = void 0;
4
+ const logger_1 = require("../logger");
5
+ class DynamicApiEventRegistryStore {
6
+ static register({ channel, ...descriptor }) {
7
+ const existing = DynamicApiEventRegistryStore.registry.get(descriptor.event);
8
+ if (!existing) {
9
+ DynamicApiEventRegistryStore.registry.set(descriptor.event, { ...descriptor, channels: [channel] });
10
+ return;
11
+ }
12
+ const isSameSource = existing.routeType === descriptor.routeType && existing.entityName === descriptor.entityName;
13
+ if (!isSameSource) {
14
+ DynamicApiEventRegistryStore.logger.warn(`[Broadcast Registry] Event name collision on "${descriptor.event}": already registered by `
15
+ + `${existing.routeType}/${existing.entityName}, now also requested by ${descriptor.routeType}/${descriptor.entityName}. `
16
+ + 'Set a unique "eventName" on one of the routes to avoid client-side ambiguity.');
17
+ DynamicApiEventRegistryStore._collisions.push({
18
+ event: descriptor.event,
19
+ registrations: [
20
+ { routeType: existing.routeType, entityName: existing.entityName },
21
+ { routeType: descriptor.routeType, entityName: descriptor.entityName },
22
+ ],
23
+ });
24
+ return;
25
+ }
26
+ if (!existing.channels.includes(channel)) {
27
+ existing.channels.push(channel);
28
+ }
29
+ }
30
+ static getAll() {
31
+ return Array.from(DynamicApiEventRegistryStore.registry.values());
32
+ }
33
+ static getCollisions() {
34
+ return [...DynamicApiEventRegistryStore._collisions];
35
+ }
36
+ static reset() {
37
+ DynamicApiEventRegistryStore.registry.clear();
38
+ DynamicApiEventRegistryStore._collisions.length = 0;
39
+ }
40
+ }
41
+ exports.DynamicApiEventRegistryStore = DynamicApiEventRegistryStore;
42
+ DynamicApiEventRegistryStore.logger = new logger_1.MongoDBDynamicApiLogger(DynamicApiEventRegistryStore.name);
43
+ DynamicApiEventRegistryStore.registry = new Map();
44
+ DynamicApiEventRegistryStore._collisions = [];
45
+ //# sourceMappingURL=event-registry.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-registry.store.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/event-registry.store.ts"],"names":[],"mappings":";;;AAAA,sCAAoD;AAiCpD,MAAM,4BAA4B;IAKhC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAA8B;QACpE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,4BAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,CAAC;QAElH,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,4BAA4B,CAAC,MAAM,CAAC,IAAI,CACtC,iDAAiD,UAAU,CAAC,KAAK,2BAA2B;kBAC1F,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,2BAA2B,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,UAAU,IAAI;kBACxH,+EAA+E,CAClF,CAAC;YAEF,4BAA4B,CAAC,WAAW,CAAC,IAAI,CAAC;gBAC5C,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,aAAa,EAAE;oBACb,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE;oBAClE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE;iBACvE;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,OAAO,CAAC,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAGD,MAAM,CAAC,KAAK;QACV,4BAA4B,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC9C,4BAA4B,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;;AAGM,oEAA4B;AAnDX,mCAAM,GAAG,IAAI,gCAAuB,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;AACxE,qCAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;AACvD,wCAAW,GAAqB,EAAE,CAAC"}
@@ -4,6 +4,7 @@ export * from './from-user.helper';
4
4
  export * from './lodash.helper';
5
5
  export * from './mixin-data.helper';
6
6
  export * from './repository.helper';
7
+ export * from './resolve-broadcast.helper';
7
8
  export * from './resolve-rooms.helper';
8
9
  export * from './route-decorators.helper';
9
10
  export * from './route-description.helper';
@@ -20,6 +20,7 @@ __exportStar(require("./from-user.helper"), exports);
20
20
  __exportStar(require("./lodash.helper"), exports);
21
21
  __exportStar(require("./mixin-data.helper"), exports);
22
22
  __exportStar(require("./repository.helper"), exports);
23
+ __exportStar(require("./resolve-broadcast.helper"), exports);
23
24
  __exportStar(require("./resolve-rooms.helper"), exports);
24
25
  __exportStar(require("./route-decorators.helper"), exports);
25
26
  __exportStar(require("./route-description.helper"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,kDAAgC;AAChC,sDAAoC;AACpC,sDAAoC;AACpC,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,kDAAgC;AAChC,sDAAoC;AACpC,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
@@ -1,7 +1,7 @@
1
1
  import { Type } from '@nestjs/common';
2
- import { AbilityPredicate, DynamicApiControllerOptions, DynamicAPIRouteConfig, PredicateBehavior, RouteType } from '../interfaces';
2
+ import { AbilityPredicate, BroadcastConfig, 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, predicateBehavior, 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, broadcastConfig?: BroadcastConfig<Entity>): {
5
5
  routeType: RouteType;
6
6
  displayedName: string;
7
7
  description: string;
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMixinData = getMixinData;
4
4
  const lodash_helper_1 = require("./lodash.helper");
5
+ const event_registry_store_1 = require("./event-registry.store");
5
6
  const controller_ability_predicates_helper_1 = require("./controller-ability-predicates.helper");
6
7
  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, predicateBehavior, eventName, }, isGateway = false) {
8
+ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }, isGateway = false, broadcastConfig) {
8
9
  const displayedName = (0, format_helper_1.getDisplayedName)(apiTag, entity.name, subPath);
9
10
  let isPublic;
10
11
  if (typeof isPublicRoute === 'boolean') {
@@ -28,6 +29,18 @@ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCac
28
29
  }
29
30
  const abilityPredicate = routeAbilityPredicate ?? (0, controller_ability_predicates_helper_1.getPredicateFromControllerAbilityPredicates)(controllerAbilityPredicates, routeType);
30
31
  const event = eventName ?? (0, lodash_helper_1.kebabCase)(`${routeType}/${displayedName}`);
32
+ if (broadcastConfig) {
33
+ event_registry_store_1.DynamicApiEventRegistryStore.register({
34
+ event: broadcastConfig.eventName || event,
35
+ routeType,
36
+ entityName: entity.name,
37
+ displayedName,
38
+ channel: isGateway ? 'ws' : 'http',
39
+ hasRoomTargeting: !!broadcastConfig.rooms,
40
+ hasAbilityPredicate: typeof broadcastConfig.enabled === 'function',
41
+ isCustomEventName: !!broadcastConfig.eventName,
42
+ });
43
+ }
31
44
  return {
32
45
  routeType,
33
46
  displayedName,
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;AAkGS,oCAAY;AAjGrB,mDAA4C;AAC5C,iEAAsE;AAUtE,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,EACjB,eAAyC;IAWzC,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,IAAI,eAAe,EAAE,CAAC;QACpB,mDAA4B,CAAC,QAAQ,CAAC;YACpC,KAAK,EAAE,eAAe,CAAC,SAAS,IAAI,KAAK;YACzC,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,aAAa;YACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YAClC,gBAAgB,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK;YACzC,mBAAmB,EAAE,OAAO,eAAe,CAAC,OAAO,KAAK,UAAU;YAClE,iBAAiB,EAAE,CAAC,CAAC,eAAe,CAAC,SAAS;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS;QACT,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { BroadcastConfig } from '../interfaces';
2
+ interface ResolvedBroadcast<T extends object> {
3
+ event: string;
4
+ rooms?: string[];
5
+ data: T[];
6
+ }
7
+ declare function resolveBroadcast<T extends object, User = unknown>(event: string, data: T[], broadcastConfig: BroadcastConfig<T, User> | undefined, user?: User): ResolvedBroadcast<T> | undefined;
8
+ export { resolveBroadcast, ResolvedBroadcast };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBroadcast = resolveBroadcast;
4
+ const resolve_rooms_helper_1 = require("./resolve-rooms.helper");
5
+ function resolveBroadcast(event, data, broadcastConfig, user) {
6
+ if (!broadcastConfig || !data?.length) {
7
+ return undefined;
8
+ }
9
+ const { enabled, eventName, rooms } = broadcastConfig;
10
+ if (typeof enabled === 'boolean' && !enabled) {
11
+ return undefined;
12
+ }
13
+ const broadcastData = typeof enabled === 'function'
14
+ ? data.filter((item) => enabled(item, user))
15
+ : data;
16
+ if (!broadcastData.length) {
17
+ return undefined;
18
+ }
19
+ return {
20
+ event: eventName || event,
21
+ rooms: (0, resolve_rooms_helper_1.resolveRooms)(rooms, broadcastData, user),
22
+ data: broadcastData,
23
+ };
24
+ }
25
+ //# sourceMappingURL=resolve-broadcast.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-broadcast.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/resolve-broadcast.helper.ts"],"names":[],"mappings":";;AAkDS,4CAAgB;AAlDzB,iEAAsD;AAmBtD,SAAS,gBAAgB,CACvB,KAAa,EACb,IAAS,EACT,eAAqD,EACrD,IAAW;IAEX,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC;IAEtD,IAAI,OAAO,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,UAAU;QACjD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,OAA8C,CAAC,IAAI,EAAE,IAAY,CAAC,CAAC;QAC5F,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS,IAAI,KAAK;QACzB,KAAK,EAAE,IAAA,mCAAY,EAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;QAC/C,IAAI,EAAE,aAAa;KACpB,CAAC;AACJ,CAAC"}