mongodb-dynamic-api 4.15.0 → 4.18.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 (255) hide show
  1. package/CHANGELOG.md +89 -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 +46 -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 +57 -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 +17 -23
  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 +4 -0
  22. package/src/helpers/index.js +4 -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/mongoose-cast-error.helper.d.ts +2 -0
  28. package/src/helpers/mongoose-cast-error.helper.js +8 -0
  29. package/src/helpers/mongoose-cast-error.helper.js.map +1 -0
  30. package/src/helpers/predicate-identifier.helper.d.ts +3 -0
  31. package/src/helpers/predicate-identifier.helper.js +34 -0
  32. package/src/helpers/predicate-identifier.helper.js.map +1 -0
  33. package/src/helpers/resolve-broadcast.helper.d.ts +8 -0
  34. package/src/helpers/resolve-broadcast.helper.js +25 -0
  35. package/src/helpers/resolve-broadcast.helper.js.map +1 -0
  36. package/src/helpers/socket-config.helper.js +14 -0
  37. package/src/helpers/socket-config.helper.js.map +1 -1
  38. package/src/helpers/strip-business-validators.helper.d.ts +3 -0
  39. package/src/helpers/strip-business-validators.helper.js +17 -0
  40. package/src/helpers/strip-business-validators.helper.js.map +1 -0
  41. package/src/index.d.ts +1 -0
  42. package/src/index.js +1 -0
  43. package/src/index.js.map +1 -1
  44. package/src/interceptors/index.d.ts +1 -0
  45. package/src/interceptors/index.js +1 -0
  46. package/src/interceptors/index.js.map +1 -1
  47. package/src/interceptors/merge-id-param.interceptor.d.ts +6 -0
  48. package/src/interceptors/merge-id-param.interceptor.js +24 -0
  49. package/src/interceptors/merge-id-param.interceptor.js.map +1 -0
  50. package/src/interfaces/dynamic-api-global-state.interface.d.ts +2 -0
  51. package/src/interfaces/dynamic-api-options.interface.d.ts +2 -0
  52. package/src/interfaces/dynamic-api-options.interface.js.map +1 -1
  53. package/src/interfaces/dynamic-api-route-config.interface.d.ts +2 -1
  54. package/src/interfaces/dynamic-api-route-config.interface.js.map +1 -1
  55. package/src/interfaces/dynamic-api-service-callback.interface.d.ts +14 -1
  56. package/src/interfaces/dynamic-api-web-socket.interface.d.ts +1 -0
  57. package/src/modules/auth/mixins/auth-controller.mixin.js +52 -1
  58. package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
  59. package/src/modules/auth/mixins/auth-gateway.mixin.js +52 -1
  60. package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
  61. package/src/predicates/admin.predicate.d.ts +9 -0
  62. package/src/predicates/admin.predicate.js +17 -0
  63. package/src/predicates/admin.predicate.js.map +1 -0
  64. package/src/predicates/composition.predicate.d.ts +6 -0
  65. package/src/predicates/composition.predicate.js +15 -0
  66. package/src/predicates/composition.predicate.js.map +1 -0
  67. package/src/predicates/group-member.predicate.d.ts +9 -0
  68. package/src/predicates/group-member.predicate.js +21 -0
  69. package/src/predicates/group-member.predicate.js.map +1 -0
  70. package/src/predicates/index.d.ts +6 -0
  71. package/src/predicates/index.js +23 -0
  72. package/src/predicates/index.js.map +1 -0
  73. package/src/predicates/ownership.predicate.d.ts +9 -0
  74. package/src/predicates/ownership.predicate.js +16 -0
  75. package/src/predicates/ownership.predicate.js.map +1 -0
  76. package/src/predicates/soft-delete.predicate.d.ts +7 -0
  77. package/src/predicates/soft-delete.predicate.js +8 -0
  78. package/src/predicates/soft-delete.predicate.js.map +1 -0
  79. package/src/predicates/visibility.predicate.d.ts +7 -0
  80. package/src/predicates/visibility.predicate.js +8 -0
  81. package/src/predicates/visibility.predicate.js.map +1 -0
  82. package/src/routes/aggregate/aggregate.helper.d.ts +2 -2
  83. package/src/routes/aggregate/aggregate.helper.js +3 -2
  84. package/src/routes/aggregate/aggregate.helper.js.map +1 -1
  85. package/src/routes/aggregate/aggregate.module.js +1 -1
  86. package/src/routes/aggregate/aggregate.module.js.map +1 -1
  87. package/src/routes/aggregate/base-aggregate.service.d.ts +2 -1
  88. package/src/routes/aggregate/base-aggregate.service.js +2 -2
  89. package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
  90. package/src/routes/create-many/base-create-many.service.d.ts +2 -1
  91. package/src/routes/create-many/base-create-many.service.js +2 -2
  92. package/src/routes/create-many/base-create-many.service.js.map +1 -1
  93. package/src/routes/create-many/create-many-controller.mixin.js +1 -1
  94. package/src/routes/create-many/create-many-controller.mixin.js.map +1 -1
  95. package/src/routes/create-many/create-many-gateway.mixin.js +1 -1
  96. package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
  97. package/src/routes/create-many/create-many.helper.d.ts +2 -2
  98. package/src/routes/create-many/create-many.helper.js +3 -2
  99. package/src/routes/create-many/create-many.helper.js.map +1 -1
  100. package/src/routes/create-many/create-many.module.js +1 -1
  101. package/src/routes/create-many/create-many.module.js.map +1 -1
  102. package/src/routes/create-one/base-create-one.service.d.ts +2 -1
  103. package/src/routes/create-one/base-create-one.service.js +1 -3
  104. package/src/routes/create-one/base-create-one.service.js.map +1 -1
  105. package/src/routes/create-one/create-one-controller.mixin.js +1 -1
  106. package/src/routes/create-one/create-one-controller.mixin.js.map +1 -1
  107. package/src/routes/create-one/create-one-gateway.mixin.js +1 -1
  108. package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
  109. package/src/routes/create-one/create-one.helper.d.ts +2 -2
  110. package/src/routes/create-one/create-one.helper.js +3 -2
  111. package/src/routes/create-one/create-one.helper.js.map +1 -1
  112. package/src/routes/create-one/create-one.module.js +1 -1
  113. package/src/routes/create-one/create-one.module.js.map +1 -1
  114. package/src/routes/delete-many/base-delete-many.service.d.ts +2 -1
  115. package/src/routes/delete-many/base-delete-many.service.js +2 -2
  116. package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
  117. package/src/routes/delete-many/delete-many-controller.mixin.js +2 -2
  118. package/src/routes/delete-many/delete-many-controller.mixin.js.map +1 -1
  119. package/src/routes/delete-many/delete-many-gateway.mixin.js +1 -1
  120. package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
  121. package/src/routes/delete-many/delete-many.helper.d.ts +2 -2
  122. package/src/routes/delete-many/delete-many.helper.js +3 -2
  123. package/src/routes/delete-many/delete-many.helper.js.map +1 -1
  124. package/src/routes/delete-many/delete-many.module.js +1 -1
  125. package/src/routes/delete-many/delete-many.module.js.map +1 -1
  126. package/src/routes/delete-one/base-delete-one.service.d.ts +2 -1
  127. package/src/routes/delete-one/base-delete-one.service.js +2 -2
  128. package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
  129. package/src/routes/delete-one/delete-one-controller.mixin.js +1 -1
  130. package/src/routes/delete-one/delete-one-controller.mixin.js.map +1 -1
  131. package/src/routes/delete-one/delete-one-gateway.mixin.js +1 -1
  132. package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
  133. package/src/routes/delete-one/delete-one.helper.d.ts +2 -2
  134. package/src/routes/delete-one/delete-one.helper.js +3 -2
  135. package/src/routes/delete-one/delete-one.helper.js.map +1 -1
  136. package/src/routes/delete-one/delete-one.module.js +1 -1
  137. package/src/routes/delete-one/delete-one.module.js.map +1 -1
  138. package/src/routes/duplicate-many/base-duplicate-many.service.d.ts +2 -1
  139. package/src/routes/duplicate-many/base-duplicate-many.service.js +2 -2
  140. package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
  141. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +2 -2
  142. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js.map +1 -1
  143. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +1 -1
  144. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
  145. package/src/routes/duplicate-many/duplicate-many.helper.d.ts +2 -2
  146. package/src/routes/duplicate-many/duplicate-many.helper.js +3 -2
  147. package/src/routes/duplicate-many/duplicate-many.helper.js.map +1 -1
  148. package/src/routes/duplicate-many/duplicate-many.module.js +1 -1
  149. package/src/routes/duplicate-many/duplicate-many.module.js.map +1 -1
  150. package/src/routes/duplicate-one/base-duplicate-one.service.d.ts +2 -1
  151. package/src/routes/duplicate-one/base-duplicate-one.service.js +1 -3
  152. package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
  153. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +1 -1
  154. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js.map +1 -1
  155. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +1 -1
  156. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
  157. package/src/routes/duplicate-one/duplicate-one.helper.d.ts +2 -2
  158. package/src/routes/duplicate-one/duplicate-one.helper.js +3 -2
  159. package/src/routes/duplicate-one/duplicate-one.helper.js.map +1 -1
  160. package/src/routes/duplicate-one/duplicate-one.module.js +1 -1
  161. package/src/routes/duplicate-one/duplicate-one.module.js.map +1 -1
  162. package/src/routes/get-many/base-get-many.service.d.ts +2 -1
  163. package/src/routes/get-many/base-get-many.service.js +2 -2
  164. package/src/routes/get-many/base-get-many.service.js.map +1 -1
  165. package/src/routes/get-many/get-many.helper.d.ts +2 -2
  166. package/src/routes/get-many/get-many.helper.js +3 -2
  167. package/src/routes/get-many/get-many.helper.js.map +1 -1
  168. package/src/routes/get-many/get-many.module.js +1 -1
  169. package/src/routes/get-many/get-many.module.js.map +1 -1
  170. package/src/routes/get-one/base-get-one.service.d.ts +2 -1
  171. package/src/routes/get-one/base-get-one.service.js +1 -3
  172. package/src/routes/get-one/base-get-one.service.js.map +1 -1
  173. package/src/routes/get-one/get-one.helper.d.ts +2 -2
  174. package/src/routes/get-one/get-one.helper.js +3 -2
  175. package/src/routes/get-one/get-one.helper.js.map +1 -1
  176. package/src/routes/get-one/get-one.module.js +1 -1
  177. package/src/routes/get-one/get-one.module.js.map +1 -1
  178. package/src/routes/replace-one/base-replace-one.service.d.ts +2 -1
  179. package/src/routes/replace-one/base-replace-one.service.js +1 -3
  180. package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
  181. package/src/routes/replace-one/replace-one-controller.mixin.js +1 -1
  182. package/src/routes/replace-one/replace-one-controller.mixin.js.map +1 -1
  183. package/src/routes/replace-one/replace-one-gateway.mixin.js +1 -1
  184. package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
  185. package/src/routes/replace-one/replace-one.helper.d.ts +2 -2
  186. package/src/routes/replace-one/replace-one.helper.js +3 -2
  187. package/src/routes/replace-one/replace-one.helper.js.map +1 -1
  188. package/src/routes/replace-one/replace-one.module.js +1 -1
  189. package/src/routes/replace-one/replace-one.module.js.map +1 -1
  190. package/src/routes/update-many/base-update-many.service.d.ts +2 -1
  191. package/src/routes/update-many/base-update-many.service.js +2 -2
  192. package/src/routes/update-many/base-update-many.service.js.map +1 -1
  193. package/src/routes/update-many/update-many-controller.mixin.js +3 -3
  194. package/src/routes/update-many/update-many-controller.mixin.js.map +1 -1
  195. package/src/routes/update-many/update-many-gateway.mixin.js +1 -1
  196. package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
  197. package/src/routes/update-many/update-many.helper.d.ts +2 -2
  198. package/src/routes/update-many/update-many.helper.js +3 -2
  199. package/src/routes/update-many/update-many.helper.js.map +1 -1
  200. package/src/routes/update-many/update-many.module.js +1 -1
  201. package/src/routes/update-many/update-many.module.js.map +1 -1
  202. package/src/routes/update-one/base-update-one.service.d.ts +2 -1
  203. package/src/routes/update-one/base-update-one.service.js +1 -3
  204. package/src/routes/update-one/base-update-one.service.js.map +1 -1
  205. package/src/routes/update-one/update-one-controller.mixin.js +15 -5
  206. package/src/routes/update-one/update-one-controller.mixin.js.map +1 -1
  207. package/src/routes/update-one/update-one-gateway.mixin.js +1 -1
  208. package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
  209. package/src/routes/update-one/update-one.helper.d.ts +2 -2
  210. package/src/routes/update-one/update-one.helper.js +3 -2
  211. package/src/routes/update-one/update-one.helper.js.map +1 -1
  212. package/src/routes/update-one/update-one.module.js +1 -1
  213. package/src/routes/update-one/update-one.module.js.map +1 -1
  214. package/src/services/base/base.service.d.ts +3 -1
  215. package/src/services/base/base.service.js +32 -0
  216. package/src/services/base/base.service.js.map +1 -1
  217. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.d.ts +1 -0
  218. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js +19 -17
  219. package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js.map +1 -1
  220. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +1 -0
  221. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
  222. package/src/version.json +1 -1
  223. package/test/for-feature/ability-predicates.e2e-spec.d.ts +1 -0
  224. package/test/for-feature/ability-predicates.e2e-spec.js +216 -0
  225. package/test/for-feature/ability-predicates.e2e-spec.js.map +1 -0
  226. package/test/for-feature/after-save-callback-reliability.e2e-spec.d.ts +1 -0
  227. package/test/for-feature/after-save-callback-reliability.e2e-spec.js +139 -0
  228. package/test/for-feature/after-save-callback-reliability.e2e-spec.js.map +1 -0
  229. package/test/for-feature/broadcast-event-registry.e2e-spec.d.ts +1 -0
  230. package/test/for-feature/broadcast-event-registry.e2e-spec.js +122 -0
  231. package/test/for-feature/broadcast-event-registry.e2e-spec.js.map +1 -0
  232. package/test/for-feature/db-aware-validators.e2e-spec.d.ts +1 -0
  233. package/test/for-feature/db-aware-validators.e2e-spec.js +172 -0
  234. package/test/for-feature/db-aware-validators.e2e-spec.js.map +1 -0
  235. package/test/for-feature/http-broadcast.e2e-spec.js +56 -2
  236. package/test/for-feature/http-broadcast.e2e-spec.js.map +1 -1
  237. package/test/for-feature/raw-update-callback-methods.e2e-spec.js +8 -6
  238. package/test/for-feature/raw-update-callback-methods.e2e-spec.js.map +1 -1
  239. package/test/for-root/auth-api-basic.e2e-spec.js +2 -0
  240. package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -1
  241. package/test/for-root/auth-api-login.e2e-spec.js +29 -0
  242. package/test/for-root/auth-api-login.e2e-spec.js.map +1 -1
  243. package/test/for-root/initialization.e2e-spec.js +2 -0
  244. package/test/for-root/initialization.e2e-spec.js.map +1 -1
  245. package/test/for-root/websockets-auth-basic.e2e-spec.js +1 -0
  246. package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -1
  247. package/test/for-root/websockets-auth-login.e2e-spec.js +32 -0
  248. package/test/for-root/websockets-auth-login.e2e-spec.js.map +1 -1
  249. package/test/shared/entities/index.d.ts +1 -0
  250. package/test/shared/entities/index.js +1 -0
  251. package/test/shared/entities/index.js.map +1 -1
  252. package/test/shared/entities/unique-login-user.factory.d.ts +14 -0
  253. package/test/shared/entities/unique-login-user.factory.js +40 -0
  254. package/test/shared/entities/unique-login-user.factory.js.map +1 -0
  255. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,94 @@
1
1
  Changelog
2
2
 
3
+ ## [4.18.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.17.0...v4.18.0) (2026-08-13)
4
+
5
+ ### predicates
6
+
7
+ * **predicates:** coercion, fallback fields and custom compare for isOwner/isGroupMember ([dc391ef](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/dc391ef9e388ccbf12b97dcda71b7f28c1b2b9eb))
8
+ * **predicates:** guard identifiersMatch's String() fallback against plain objects ([9ac365b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9ac365b6d0d172499b0821497acbd09f31e363a1))
9
+ * **predicates:** narrow identifiersMatch's operands to a stringifiable type ([7c8030d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/7c8030d9310757f19b0b806e554050fbdfa3ad28))
10
+
11
+ ### routes
12
+
13
+ * **routes:** merge the :id route param into UpdateOne's body before validation ([26bbf26](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/26bbf261c2fd306c8d094b54feb28a7446dd5d50))
14
+ * **routes:** return 400 instead of 500 on invalid *Many input ([c92c708](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/c92c708cee36a5336c185eb881348b05e8af7ea5))
15
+
16
+ ### broadcast
17
+
18
+ * **broadcast:** catch a throwing resolveBroadcast() in broadcastFromHttp/broadcastIfNeeded ([582e7fb](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/582e7fbbe377a364c591b9895e96bf2fb2331ade))
19
+
20
+ ### validators
21
+
22
+ * **validators:** guard IsUnique/EntityExists against malformed ObjectIds ([8c5096e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/8c5096e70a3a63c59d9fb94784231f92e107745e))
23
+
24
+ ### auth
25
+
26
+ * **auth:** strip DB-aware business validators from the generated login DTO ([1794b47](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/1794b473d1a70d57814b7b45d6f7ebc39880865b))
27
+
28
+ ## [4.17.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.17.0) (2026-08-12)
29
+
30
+ ### routes
31
+
32
+ * **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
33
+
34
+ ### callbacks
35
+
36
+ * **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
37
+ * **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
38
+ * **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
39
+
40
+ ### predicates
41
+
42
+ * **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
43
+
44
+ ### websockets
45
+
46
+ * **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
47
+
48
+ ### broadcast
49
+
50
+ * **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
51
+ * **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
52
+ * **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
53
+ * **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
54
+
55
+ ### decorators
56
+
57
+ * **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
58
+ * **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
59
+
60
+ ## [4.16.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.16.0) (2026-08-12)
61
+
62
+ ### routes
63
+
64
+ * **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
65
+
66
+ ### callbacks
67
+
68
+ * **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
69
+ * **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
70
+ * **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
71
+
72
+ ### predicates
73
+
74
+ * **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
75
+
76
+ ### websockets
77
+
78
+ * **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
79
+
80
+ ### broadcast
81
+
82
+ * **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
83
+ * **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
84
+ * **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
85
+ * **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
86
+
87
+ ### decorators
88
+
89
+ * **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
90
+ * **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
91
+
3
92
  ## [4.15.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.14.1...v4.15.0) (2026-05-31)
4
93
 
5
94
  ### 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.18.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,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityExists = EntityExists;
4
+ const class_validator_1 = require("class-validator");
5
+ const mongoose_cast_error_helper_1 = require("../helpers/mongoose-cast-error.helper");
6
+ const services_1 = require("../services");
7
+ function EntityExists(entity, options = {}, validationOptions) {
8
+ return (object, propertyName) => {
9
+ (0, class_validator_1.registerDecorator)({
10
+ name: 'entityExists',
11
+ target: object.constructor,
12
+ propertyName: propertyName,
13
+ options: validationOptions,
14
+ constraints: [entity, options],
15
+ validator: {
16
+ async validate(value, args) {
17
+ if (value === undefined || value === null || value === '') {
18
+ return true;
19
+ }
20
+ const [targetEntity, opts] = args.constraints;
21
+ const field = String(opts.field ?? '_id');
22
+ const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
23
+ const filter = {
24
+ [field]: value,
25
+ ...opts.filter?.(value, args.object),
26
+ };
27
+ try {
28
+ const existing = await model.exists(filter);
29
+ return !!existing;
30
+ }
31
+ catch (error) {
32
+ if ((0, mongoose_cast_error_helper_1.isMongooseCastError)(error)) {
33
+ return false;
34
+ }
35
+ throw error;
36
+ }
37
+ },
38
+ defaultMessage(args) {
39
+ const [targetEntity] = args.constraints;
40
+ return `Referenced ${targetEntity.name} does not exist`;
41
+ },
42
+ },
43
+ });
44
+ };
45
+ }
46
+ //# 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":";;AAmHS,oCAAY;AAlHrB,qDAA4F;AAE5F,sFAA4E;AAE5E,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,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC5C,OAAO,CAAC,CAAC,QAAQ,CAAC;oBACpB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAGf,IAAI,IAAA,gDAAmB,EAAC,KAAK,CAAC,EAAE,CAAC;4BAC/B,OAAO,KAAK,CAAC;wBACf,CAAC;wBAED,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,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,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IsUnique = IsUnique;
4
+ const class_validator_1 = require("class-validator");
5
+ const mongoose_cast_error_helper_1 = require("../helpers/mongoose-cast-error.helper");
6
+ const services_1 = require("../services");
7
+ function escapeRegExp(value) {
8
+ return value.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
9
+ }
10
+ function IsUnique(entity, options = {}, validationOptions) {
11
+ return (object, propertyName) => {
12
+ (0, class_validator_1.registerDecorator)({
13
+ name: 'isUnique',
14
+ target: object.constructor,
15
+ propertyName: propertyName,
16
+ options: validationOptions,
17
+ constraints: [entity, options, propertyName],
18
+ validator: {
19
+ async validate(value, args) {
20
+ if (value === undefined || value === null || value === '') {
21
+ return true;
22
+ }
23
+ const [targetEntity, opts, defaultField] = args.constraints;
24
+ const field = String(opts.field ?? defaultField);
25
+ const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
26
+ const filter = {
27
+ [field]: opts.caseInsensitive && typeof value === 'string'
28
+ ? { $regex: `^${escapeRegExp(value)}$`, $options: 'i' }
29
+ : value,
30
+ };
31
+ if (opts.ignoreId) {
32
+ const currentId = args.object[opts.ignoreId];
33
+ if (currentId) {
34
+ Object.assign(filter, { _id: { $ne: currentId } });
35
+ }
36
+ }
37
+ try {
38
+ const existing = await model.exists(filter);
39
+ return !existing;
40
+ }
41
+ catch (error) {
42
+ if ((0, mongoose_cast_error_helper_1.isMongooseCastError)(error)) {
43
+ return false;
44
+ }
45
+ throw error;
46
+ }
47
+ },
48
+ defaultMessage(args) {
49
+ const [targetEntity, opts, defaultField] = args.constraints;
50
+ const field = String(opts.field ?? defaultField);
51
+ return `${field} must be unique for ${targetEntity.name}`;
52
+ },
53
+ },
54
+ });
55
+ };
56
+ }
57
+ //# 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":";;AA+HS,4BAAQ;AA9HjB,qDAA4F;AAE5F,sFAA4E;AAE5E,0CAA2D;AA4B3D,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,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC5C,OAAO,CAAC,QAAQ,CAAC;oBACnB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAGf,IAAI,IAAA,gDAAmB,EAAC,KAAK,CAAC,EAAE,CAAC;4BAC/B,OAAO,KAAK,CAAC;wBACf,CAAC;wBAED,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,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":";;;;;;;;;;AAAA,yDAAmE;AACnE,2CAAuD;AACvD,uCAAqE;AACrE,8EAAyE;AACzE,+CAAkD;AAElD,yCAA8D;AAC9D,qCAAkD;AAClD,uCAA2H;AAC3H,iDAA4D;AAC5D,6CAAuQ;AAEvQ,uCAAsF;AACtF,qCAA+T;AAC/T,yCAAsF;AAQ/E,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAc3B,MAAM,CAAC,OAAO,CACZ,GAAW,EACX,EACE,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,EAAE,EACjB,OAAO,EACP,YAAY,EACZ,SAAS,EACT,uBAAuB,MACa,EAAE;QAExC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACb,SAAS;YACT,IAAI,CAAC,qBAAqB,CACxB,GAAG,EACH,cAAc,EACd,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,SAAS,EACT,uBAAuB,CACxB;SACF,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,OAAO,EAAE;gBACP,gCAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACjD,2BAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;gBACzD,yBAAc,CAAC,OAAO,CACpB,GAAG,EACH,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CACrD;gBACD,GAAG,CACD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;oBACpB,oBAAU,CAAC,OAAO,CAAS,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;iBACtF,CAAC,CAAC,CAAC,EAAE,CACP;aACF;YACD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,gBAAS;oBAClB,MAAM,EAAE,CAAC,gBAAS,EAAE,qCAAwB,CAAC;oBAC7C,UAAU,EAAE,CACV,SAAoB,EACpB,KAA4B,EAC5B,EAAE;wBACF,OAAO,IAAI,+BAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBACtD,CAAC;iBACF;aACF;YACD,OAAO,EAAE,CAAC,gCAAsB,CAAC;SAClC,CAAC;IACJ,CAAC;IAQD,MAAM,CAAC,UAAU,CAA4B,EAC3C,MAAM,EACN,iBAAiB,EACjB,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,YAAY,GAAG,EAAE,GACmB;QACpC,MAAM,MAAM,GAAG,IAAA,+BAAqB,EAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,yBAAc,CAAC,UAAU,CAC9C,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CACjC,CAAC;QAEF,uCAA4B,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC,CAAC;YACpG,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,uCAA4B,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,EAAE;gBAC1E,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBAED,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC7B,CAAC;gBAED,MAAM,EACJ,OAAO,EAAE,iBAAiB,EAC1B,qBAAqB,EAAE,+BAA+B,EACtD,YAAY,EAAE,sBAAsB,GACrC,GAAG,iBAAiB,CAAC;gBAGtB,MAAM,sBAAsB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAC9D,IAAA,oCAA2B,EACzB,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,+BAA+B,CAChC,CACF,CAAC;gBAGF,MAAM,mBAAmB,GAAG,YAAY;qBACrC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;qBAC5B,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;oBACnB,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS;wBACrC,CAAC,CAAC,IAAA,qCAA2B,EAAC,WAAW,CAAC,SAAS,CAAC;wBACpD,CAAC,CAAC,kBAAgB,CAAC,KAAK,CAAC,GAAG,CAAiB,gBAAgB,CAAC,IAAI,IAAI,CAAC;oBAEzE,OAAO,IAAA,iCAAwB,EAC7B,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,+BAA+B,EAC/B,SAAS,IAAI,EAAE,CAChB,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEL,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEhG,MAAM,QAAQ,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrC,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEzC,MAAM,iBAAiB,GAAgC,IAAI,GAAG,CAAC;oBAC7D,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,yBAAgB,CAAC,CAAC;oBACtD,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,wBAAe,CAAC,CAAC;oBACpD,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,yBAAgB,CAAC,CAAC;oBACtD,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,wBAAe,CAAC,CAAC;oBACpD,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAAmB,CAAC,CAAC;oBAC5D,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,2BAAkB,CAAC,CAAC;oBAC1D,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,sBAAa,CAAC,CAAC;oBAChD,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,qBAAY,CAAC,CAAC;oBAC9C,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,yBAAgB,CAAC,CAAC;oBACtD,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,yBAAgB,CAAC,CAAC;oBACtD,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,wBAAe,CAAC,CAAC;oBACpD,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,wBAAe,CAAC,CAAC;iBACrD,CAAC,CAAC;gBAEH,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAC9B,sBAAsB,EACtB,MAAM,CACP,CAAC;gBAEF,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;gBAE3G,MAAM,SAAS,GAAG;oBAChB,MAAM,EAAE,kBAAgB;oBACxB,OAAO,EAAE;wBAEP,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;4BAC5B,MAAM,EACJ,IAAI,EACJ,WAAW,EAAE,gBAAgB,EAC7B,OAAO,EAAE,YAAY,EACrB,qBAAqB,EAAE,0BAA0B,EACjD,SAAS,EAAE,cAAc,GAC1B,GAAG,WAAW,CAAC;4BAEhB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BAE3C,MAAM,WAAW,GAAG,gBAAgB,IAAI,IAAA,oCAA0B,EAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;4BAEtF,MAAM,OAAO,GAAG,YAAY,IAAI,iBAAiB,CAAC;4BAClD,IAAI,OAAO,IAAI,CAAC,IAAA,wBAAc,EAAC,OAAO,CAAC,EAAE,CAAC;gCACxC,MAAM,CACJ,IAAI,KAAK,CACP,mBAAmB,OAAO,QAAQ,IAAI,SAAS;sCAC7C,+EAA+E,CAClF,CACF,CAAC;gCACF,OAAO;4BACT,CAAC;4BAED,MAAM,qBAAqB,GAAG,0BAA0B,IAAI,+BAA+B,CAAC;4BAG5F,OAAO,MAAM,CAAC,UAAU,CACtB,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,EAAE,GAAG,WAAW,EAAE,WAAW,EAAE,EAC/B,OAAO,EACP,qBAAqB,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAC5C,cAAc,IAAI,gBAAgB,EAClC,YAAY,EACZ,cAAc,EACd,gBAAgB,CACjB,CAAC;wBACJ,CAAC,CAAC;qBACH;oBACD,WAAW,EAAE;wBACX,GAAG,sBAAsB;wBACzB,GAAG,CACD,wBAAwB;4BACtB,CAAC,CAAC,CAAC,IAAA,mCAA0B,EAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;4BACzD,CAAC,CAAC,EAAE,CACP;qBACF;oBACD,SAAS,EAAE;wBACT;4BACE,OAAO,EAAE,sBAAe;4BACxB,MAAM,EAAE,CAAC,6BAAa,EAAE,gBAAS,EAAE,mCAAe,EAAE,qCAAwB,CAAC;4BAC7E,UAAU,EAAE,CACV,YAAmB,EACnB,SAAoB,EACpB,eAAgC,EAChC,KAA4B,EAC5B,EAAE;gCACF,OAAO,IAAI,yCAA0B,CAAC,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;4BACzF,CAAC;yBACF;wBACD,GAAG,CACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;4BAChC,qCAA0B;4BAC1B,IAAA,2CAAgC,EAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,yBAAyB,CAAC;mCACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,gBAAgB,CAAC;mCAChD,EAAE,CACN;yBACF,CAAC,CAAC,CAAC,EAAE,CACP;wBACD,GAAG,mBAAmB;qBACvB;iBACF,CAAC;gBAEF,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAaO,MAAM,CAAC,qBAAqB,CAClC,GAAW,EACX,cAAuB,EACvB,YAAoC,EACpC,OAA+B,EAC/B,YAAoC,EACpC,SAAsC,EACtC,uBAAwC;QAExC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,cAAc,CAAC,CAAC;QAEvE,OAAO;YACL,GAAG;YACH,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,cAAc;YACpC,GAAG,CACD,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CACrF;YACD,GAAG,CACD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpB,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE;oBACX,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;oBACnF,aAAa,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;iBAChG;gBACD,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,wBAAwB;gBAC1D,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,IAAI,KAAK;gBAClD,wBAAwB,EAAE,OAAO,CAAC,GAAG,EAAE,qBAAqB,IAAI,IAAI;gBACpE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,aAAa;gBAC5C,mBAAmB,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,IAAI,KAAK;gBAC7D,oBAAoB,EAAE,OAAO,CAAC,aAAa,EAAE,oBAAoB,IAAI,KAAK;gBAC1E,cAAc,EAAE,IAAA,qCAA2B,EAAC,SAAS,CAAC;aACvD,CAAC,CAAC,CAAC,EAAE,CACP;YACD,GAAG,CACD,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChE,YAAY,EAAE;oBACZ,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ;oBAC5F,QAAQ,EAAE,YAAY,CAAC,QAAQ,IAAI,EAAE;iBACtC;aACF,CAAC,CAAC,CAAC,EAAE,CACP;YACD,cAAc,EAAE,IAAA,qCAA2B,EAAC,SAAS,CAAC;YACtD,GAAG,CACD,uBAAuB,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAC3D;SACF,CAAC;IACJ,CAAC;IASO,MAAM,CAAC,gBAAgB,CAC7B,iBAA+B,EAC/B,yBAAgD,EAAE,EAClD,SAA0C,EAAE;QAE5C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QAC/E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QAE/E,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAExG,OAAO,iBAAiB,CAAC,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CACnE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CACnC;aACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtF,OAAO,eAAe,IAAI,EAAE,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;;AA5VU,4CAAgB;AAKX,sBAAK,GAAG,IAAI,uCAA4B,EAAE,AAArC,CAAsC;2BALhD,gBAAgB;IAD5B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CA6V5B"}
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) {
46
- return;
47
- }
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);
60
- if (helpers_1.DynamicApiWsConfigStore.debug) {
61
- this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${resolvedRooms ? JSON.stringify(resolvedRooms) : 'all'}, items=${broadcastData.length}`);
62
- }
63
- if (resolvedRooms) {
64
- const nsp = socket.nsp;
65
- nsp.to(resolvedRooms).emit(broadcastEvent, broadcastData);
45
+ try {
46
+ const resolved = (0, helpers_1.resolveBroadcast)(event, data, broadcastConfig, socket.user);
47
+ if (!resolved) {
48
+ return;
49
+ }
50
+ const { event: broadcastEvent, rooms, data: broadcastData } = resolved;
51
+ if (helpers_1.DynamicApiWsConfigStore.debug) {
52
+ this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${rooms ? JSON.stringify(rooms) : 'all'}, items=${broadcastData.length}`);
53
+ }
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 "${event}": ${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"}
@@ -3,12 +3,16 @@ export * from './format.helper';
3
3
  export * from './from-user.helper';
4
4
  export * from './lodash.helper';
5
5
  export * from './mixin-data.helper';
6
+ export * from './mongoose-cast-error.helper';
7
+ export * from './predicate-identifier.helper';
6
8
  export * from './repository.helper';
9
+ export * from './resolve-broadcast.helper';
7
10
  export * from './resolve-rooms.helper';
8
11
  export * from './route-decorators.helper';
9
12
  export * from './route-description.helper';
10
13
  export * from './schema.helper';
11
14
  export * from './socket-config.helper';
15
+ export * from './strip-business-validators.helper';
12
16
  export * from './swagger-config.helper';
13
17
  export * from './validation-config.helper';
14
18
  export * from './versioning-config.helper';
@@ -19,12 +19,16 @@ __exportStar(require("./format.helper"), exports);
19
19
  __exportStar(require("./from-user.helper"), exports);
20
20
  __exportStar(require("./lodash.helper"), exports);
21
21
  __exportStar(require("./mixin-data.helper"), exports);
22
+ __exportStar(require("./mongoose-cast-error.helper"), exports);
23
+ __exportStar(require("./predicate-identifier.helper"), exports);
22
24
  __exportStar(require("./repository.helper"), exports);
25
+ __exportStar(require("./resolve-broadcast.helper"), exports);
23
26
  __exportStar(require("./resolve-rooms.helper"), exports);
24
27
  __exportStar(require("./route-decorators.helper"), exports);
25
28
  __exportStar(require("./route-description.helper"), exports);
26
29
  __exportStar(require("./schema.helper"), exports);
27
30
  __exportStar(require("./socket-config.helper"), exports);
31
+ __exportStar(require("./strip-business-validators.helper"), exports);
28
32
  __exportStar(require("./swagger-config.helper"), exports);
29
33
  __exportStar(require("./validation-config.helper"), exports);
30
34
  __exportStar(require("./versioning-config.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,+DAA6C;AAC7C,gEAA8C;AAC9C,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,qEAAmD;AACnD,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,