mongodb-dynamic-api 1.3.3 → 1.4.1

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 (295) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +476 -21
  3. package/package.json +11 -1
  4. package/src/builders/casl/casl-ability.builder.d.ts +5 -0
  5. package/src/builders/casl/casl-ability.builder.js +14 -0
  6. package/src/builders/index.d.ts +3 -1
  7. package/src/builders/index.js +3 -1
  8. package/src/builders/route-decorators/auth-decorators.builder.d.ts +7 -0
  9. package/src/builders/route-decorators/auth-decorators.builder.js +14 -0
  10. package/src/builders/route-decorators/route-decorators.builder.d.ts +23 -0
  11. package/src/builders/{route-decorators.builder.js → route-decorators/route-decorators.builder.js} +45 -23
  12. package/src/decorators/check-policies.decorator.d.ts +5 -0
  13. package/src/decorators/check-policies.decorator.js +8 -0
  14. package/src/decorators/index.d.ts +2 -0
  15. package/src/decorators/index.js +2 -0
  16. package/src/decorators/public.decorator.d.ts +3 -0
  17. package/src/decorators/public.decorator.js +8 -0
  18. package/src/dynamic-api.module.d.ts +5 -4
  19. package/src/dynamic-api.module.js +132 -87
  20. package/src/guards/base-policies.guard.d.ts +13 -0
  21. package/src/guards/base-policies.guard.js +32 -0
  22. package/src/guards/dynamic-api-jwt-auth.guard.d.ts +11 -0
  23. package/src/guards/dynamic-api-jwt-auth.guard.js +38 -0
  24. package/src/guards/index.d.ts +2 -0
  25. package/src/guards/index.js +18 -0
  26. package/src/helpers/controller-ability-predicates.helper.d.ts +4 -0
  27. package/src/helpers/controller-ability-predicates.helper.js +23 -0
  28. package/src/helpers/index.d.ts +1 -0
  29. package/src/helpers/index.js +1 -0
  30. package/src/helpers/route-decorators.helper.d.ts +2 -2
  31. package/src/helpers/schema.helper.d.ts +28 -0
  32. package/src/helpers/schema.helper.js +22 -0
  33. package/src/index.d.ts +3 -1
  34. package/src/index.js +3 -1
  35. package/src/interceptors/dynamic-api-cache.interceptor.d.ts +16 -0
  36. package/src/interceptors/dynamic-api-cache.interceptor.js +48 -0
  37. package/src/interceptors/index.d.ts +1 -0
  38. package/src/interceptors/index.js +17 -0
  39. package/src/interfaces/controller-options.interface.d.ts +5 -1
  40. package/src/interfaces/decorator-builder.interface.d.ts +5 -0
  41. package/src/interfaces/dynamic-api-cache-options.interface.d.ts +1 -0
  42. package/src/interfaces/dynamic-api-casl-ability.interface.d.ts +17 -0
  43. package/src/interfaces/dynamic-api-casl-ability.interface.js +11 -0
  44. package/src/interfaces/dynamic-api-global-state.interface.d.ts +16 -0
  45. package/src/interfaces/dynamic-api-options.interface.d.ts +5 -2
  46. package/src/interfaces/dynamic-api-options.interface.js +3 -0
  47. package/src/interfaces/dynamic-api-policy-handler.interface.d.ts +16 -0
  48. package/src/interfaces/dynamic-api-route-config.interface.d.ts +7 -9
  49. package/src/interfaces/dynamic-api-route-dtos-bundle.type.d.ts +8 -0
  50. package/src/interfaces/dynamic-api-route-module.type.d.ts +3 -0
  51. package/src/interfaces/dynamic-api-route-type.type.d.ts +2 -0
  52. package/src/interfaces/index.d.ts +11 -2
  53. package/src/interfaces/index.js +11 -2
  54. package/src/mixins/create-policies-guard.mixin.d.ts +5 -0
  55. package/src/mixins/create-policies-guard.mixin.js +37 -0
  56. package/src/mixins/index.d.ts +1 -0
  57. package/src/mixins/index.js +1 -0
  58. package/src/modules/auth/auth.helper.d.ts +10 -0
  59. package/src/modules/auth/auth.helper.js +103 -0
  60. package/src/modules/auth/auth.module.d.ts +12 -0
  61. package/src/modules/auth/auth.module.js +55 -0
  62. package/src/modules/auth/guards/index.d.ts +2 -0
  63. package/src/modules/auth/guards/index.js +18 -0
  64. package/src/modules/auth/guards/jwt-auth.guard.d.ts +4 -0
  65. package/src/modules/auth/guards/jwt-auth.guard.js +17 -0
  66. package/src/modules/auth/guards/local-auth.guard.d.ts +4 -0
  67. package/src/modules/auth/guards/local-auth.guard.js +17 -0
  68. package/src/modules/auth/index.d.ts +7 -0
  69. package/src/modules/auth/index.js +23 -0
  70. package/src/modules/auth/interfaces/auth-controller.interface.d.ts +9 -0
  71. package/src/modules/auth/interfaces/auth-options.interface.d.ts +22 -0
  72. package/src/modules/auth/interfaces/auth-service.interface.d.ts +12 -0
  73. package/src/modules/auth/interfaces/index.d.ts +3 -0
  74. package/src/modules/auth/interfaces/index.js +19 -0
  75. package/src/modules/auth/mixins/auth-controller.mixin.d.ts +6 -0
  76. package/src/modules/auth/mixins/auth-controller.mixin.js +101 -0
  77. package/src/modules/auth/mixins/auth-register-policies-guard.mixin.d.ts +6 -0
  78. package/src/modules/auth/mixins/auth-register-policies-guard.mixin.js +59 -0
  79. package/src/modules/auth/mixins/index.d.ts +2 -0
  80. package/src/modules/auth/mixins/index.js +18 -0
  81. package/src/modules/auth/services/base-auth.service.d.ts +51 -0
  82. package/src/modules/auth/services/base-auth.service.js +64 -0
  83. package/src/modules/auth/services/index.d.ts +1 -0
  84. package/src/modules/auth/services/index.js +17 -0
  85. package/src/modules/auth/strategies/index.d.ts +1 -0
  86. package/src/modules/auth/strategies/index.js +17 -0
  87. package/src/modules/auth/strategies/jwt.strategy.d.ts +8 -0
  88. package/src/modules/auth/strategies/jwt.strategy.js +35 -0
  89. package/src/modules/dynamic-api-config/dynamic-api-config.module.d.ts +5 -0
  90. package/src/modules/dynamic-api-config/dynamic-api-config.module.js +31 -0
  91. package/src/modules/dynamic-api-config/index.d.ts +1 -0
  92. package/src/modules/dynamic-api-config/index.js +17 -0
  93. package/src/modules/index.d.ts +2 -11
  94. package/src/modules/index.js +2 -11
  95. package/src/routes/create-many/create-many-controller.mixin.d.ts +6 -0
  96. package/src/{modules → routes}/create-many/create-many-controller.mixin.js +26 -4
  97. package/src/{modules → routes}/create-many/create-many.helper.d.ts +2 -2
  98. package/src/{modules → routes}/create-many/create-many.helper.js +6 -4
  99. package/src/{modules → routes}/create-many/create-many.module.d.ts +1 -1
  100. package/src/{modules → routes}/create-many/create-many.module.js +2 -2
  101. package/src/routes/create-one/create-one-controller.mixin.d.ts +6 -0
  102. package/src/{modules → routes}/create-one/create-one-controller.mixin.js +25 -3
  103. package/src/{modules → routes}/create-one/create-one.helper.d.ts +2 -2
  104. package/src/{modules → routes}/create-one/create-one.helper.js +6 -4
  105. package/src/routes/create-one/create-one.module.d.ts +6 -0
  106. package/src/{modules → routes}/create-one/create-one.module.js +3 -3
  107. package/src/routes/delete-many/delete-many-controller.mixin.d.ts +6 -0
  108. package/src/{modules → routes}/delete-many/delete-many-controller.mixin.js +26 -3
  109. package/src/{modules → routes}/delete-many/delete-many.helper.d.ts +2 -2
  110. package/src/{modules → routes}/delete-many/delete-many.helper.js +6 -4
  111. package/src/routes/delete-many/delete-many.module.d.ts +6 -0
  112. package/src/{modules → routes}/delete-many/delete-many.module.js +3 -3
  113. package/src/routes/delete-one/delete-one-controller.mixin.d.ts +6 -0
  114. package/src/{modules → routes}/delete-one/delete-one-controller.mixin.js +26 -3
  115. package/src/{modules → routes}/delete-one/delete-one.helper.d.ts +2 -2
  116. package/src/{modules → routes}/delete-one/delete-one.helper.js +6 -4
  117. package/src/routes/delete-one/delete-one.module.d.ts +6 -0
  118. package/src/{modules → routes}/delete-one/delete-one.module.js +3 -3
  119. package/src/routes/duplicate-many/duplicate-many-controller.mixin.d.ts +6 -0
  120. package/src/{modules → routes}/duplicate-many/duplicate-many-controller.mixin.js +25 -3
  121. package/src/{modules → routes}/duplicate-many/duplicate-many.helper.d.ts +2 -2
  122. package/src/{modules → routes}/duplicate-many/duplicate-many.helper.js +6 -4
  123. package/src/routes/duplicate-many/duplicate-many.module.d.ts +6 -0
  124. package/src/{modules → routes}/duplicate-many/duplicate-many.module.js +3 -3
  125. package/src/routes/duplicate-one/duplicate-one-controller.mixin.d.ts +6 -0
  126. package/src/{modules → routes}/duplicate-one/duplicate-one-controller.mixin.js +25 -3
  127. package/src/{modules → routes}/duplicate-one/duplicate-one.helper.d.ts +2 -2
  128. package/src/{modules → routes}/duplicate-one/duplicate-one.helper.js +6 -4
  129. package/src/routes/duplicate-one/duplicate-one.module.d.ts +6 -0
  130. package/src/{modules → routes}/duplicate-one/duplicate-one.module.js +3 -3
  131. package/src/routes/get-many/get-many-controller.mixin.d.ts +6 -0
  132. package/src/{modules → routes}/get-many/get-many-controller.mixin.js +28 -6
  133. package/src/routes/get-many/get-many-service.interface.js +2 -0
  134. package/src/{modules → routes}/get-many/get-many.helper.d.ts +2 -2
  135. package/src/{modules → routes}/get-many/get-many.helper.js +6 -4
  136. package/src/routes/get-many/get-many.module.d.ts +6 -0
  137. package/src/{modules → routes}/get-many/get-many.module.js +3 -3
  138. package/src/routes/get-one/get-one-controller.interface.js +2 -0
  139. package/src/routes/get-one/get-one-controller.mixin.d.ts +6 -0
  140. package/src/{modules → routes}/get-one/get-one-controller.mixin.js +25 -3
  141. package/src/routes/get-one/get-one-service.interface.js +2 -0
  142. package/src/{modules → routes}/get-one/get-one.helper.d.ts +2 -2
  143. package/src/{modules → routes}/get-one/get-one.helper.js +6 -4
  144. package/src/routes/get-one/get-one.module.d.ts +6 -0
  145. package/src/{modules → routes}/get-one/get-one.module.js +3 -3
  146. package/src/routes/index.d.ts +11 -0
  147. package/src/routes/index.js +27 -0
  148. package/src/routes/replace-one/replace-one-controller.interface.js +2 -0
  149. package/src/routes/replace-one/replace-one-controller.mixin.d.ts +6 -0
  150. package/src/{modules → routes}/replace-one/replace-one-controller.mixin.js +25 -3
  151. package/src/routes/replace-one/replace-one-service.interface.js +2 -0
  152. package/src/{modules → routes}/replace-one/replace-one.helper.d.ts +2 -2
  153. package/src/{modules → routes}/replace-one/replace-one.helper.js +6 -4
  154. package/src/routes/replace-one/replace-one.module.d.ts +6 -0
  155. package/src/{modules → routes}/replace-one/replace-one.module.js +3 -3
  156. package/src/routes/update-many/update-many-controller.interface.js +2 -0
  157. package/src/routes/update-many/update-many-controller.mixin.d.ts +6 -0
  158. package/src/{modules → routes}/update-many/update-many-controller.mixin.js +25 -3
  159. package/src/routes/update-many/update-many-service.interface.js +2 -0
  160. package/src/{modules → routes}/update-many/update-many.helper.d.ts +2 -2
  161. package/src/{modules → routes}/update-many/update-many.helper.js +6 -4
  162. package/src/routes/update-many/update-many.module.d.ts +6 -0
  163. package/src/{modules → routes}/update-many/update-many.module.js +3 -3
  164. package/src/routes/update-one/update-one-controller.interface.js +2 -0
  165. package/src/routes/update-one/update-one-controller.mixin.d.ts +6 -0
  166. package/src/{modules → routes}/update-one/update-one-controller.mixin.js +25 -3
  167. package/src/routes/update-one/update-one-service.interface.js +2 -0
  168. package/src/{modules → routes}/update-one/update-one.helper.d.ts +2 -2
  169. package/src/{modules → routes}/update-one/update-one.helper.js +6 -4
  170. package/src/routes/update-one/update-one.module.d.ts +6 -0
  171. package/src/{modules → routes}/update-one/update-one.module.js +3 -3
  172. package/src/services/{base.service.d.ts → base/base.service.d.ts} +1 -1
  173. package/src/services/{base.service.js → base/base.service.js} +2 -2
  174. package/src/services/bcrypt/bcrypt.service.d.ts +5 -0
  175. package/src/services/bcrypt/bcrypt.service.js +26 -0
  176. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.d.ts +11 -0
  177. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +36 -0
  178. package/src/services/index.d.ts +3 -1
  179. package/src/services/index.js +3 -1
  180. package/src/version.json +1 -1
  181. package/tsconfig.tsbuildinfo +1 -1
  182. package/src/builders/route-decorators.builder.d.ts +0 -20
  183. package/src/modules/create-many/create-many-controller.mixin.d.ts +0 -6
  184. package/src/modules/create-one/create-one-controller.mixin.d.ts +0 -6
  185. package/src/modules/create-one/create-one.module.d.ts +0 -6
  186. package/src/modules/delete-many/delete-many-controller.mixin.d.ts +0 -6
  187. package/src/modules/delete-many/delete-many.module.d.ts +0 -6
  188. package/src/modules/delete-one/delete-one-controller.mixin.d.ts +0 -6
  189. package/src/modules/delete-one/delete-one.module.d.ts +0 -6
  190. package/src/modules/duplicate-many/duplicate-many-controller.mixin.d.ts +0 -6
  191. package/src/modules/duplicate-many/duplicate-many.module.d.ts +0 -6
  192. package/src/modules/duplicate-one/duplicate-one-controller.mixin.d.ts +0 -6
  193. package/src/modules/duplicate-one/duplicate-one.module.d.ts +0 -6
  194. package/src/modules/get-many/get-many-controller.mixin.d.ts +0 -6
  195. package/src/modules/get-many/get-many.module.d.ts +0 -6
  196. package/src/modules/get-one/get-one-controller.mixin.d.ts +0 -6
  197. package/src/modules/get-one/get-one.module.d.ts +0 -6
  198. package/src/modules/replace-one/replace-one-controller.mixin.d.ts +0 -6
  199. package/src/modules/replace-one/replace-one.module.d.ts +0 -6
  200. package/src/modules/update-many/update-many-controller.mixin.d.ts +0 -6
  201. package/src/modules/update-many/update-many.module.d.ts +0 -6
  202. package/src/modules/update-one/update-one-controller.mixin.d.ts +0 -6
  203. package/src/modules/update-one/update-one.module.d.ts +0 -6
  204. /package/src/{modules/create-many/create-many-controller.interface.js → interfaces/decorator-builder.interface.js} +0 -0
  205. /package/src/{modules/create-many/create-many-service.interface.js → interfaces/dynamic-api-global-state.interface.js} +0 -0
  206. /package/src/{modules/create-one/create-one-controller.interface.js → interfaces/dynamic-api-policy-handler.interface.js} +0 -0
  207. /package/src/{modules/create-one/create-one-service.interface.js → interfaces/dynamic-api-route-dtos-bundle.type.js} +0 -0
  208. /package/src/{modules/delete-many/delete-many-controller.interface.js → interfaces/dynamic-api-route-module.type.js} +0 -0
  209. /package/src/{modules/delete-many/delete-many-service.interface.js → interfaces/dynamic-api-route-type.type.js} +0 -0
  210. /package/src/modules/{delete-one/delete-one-controller.interface.js → auth/interfaces/auth-controller.interface.js} +0 -0
  211. /package/src/modules/{delete-one/delete-one-service.interface.js → auth/interfaces/auth-options.interface.js} +0 -0
  212. /package/src/modules/{duplicate-many/duplicate-many-controller.interface.js → auth/interfaces/auth-service.interface.js} +0 -0
  213. /package/src/{modules → routes}/create-many/base-create-many.service.d.ts +0 -0
  214. /package/src/{modules → routes}/create-many/base-create-many.service.js +0 -0
  215. /package/src/{modules → routes}/create-many/create-many-controller.interface.d.ts +0 -0
  216. /package/src/{modules/duplicate-many/duplicate-many-service.interface.js → routes/create-many/create-many-controller.interface.js} +0 -0
  217. /package/src/{modules → routes}/create-many/create-many-service.interface.d.ts +0 -0
  218. /package/src/{modules/duplicate-one/duplicate-one-controller.interface.js → routes/create-many/create-many-service.interface.js} +0 -0
  219. /package/src/{modules → routes}/create-many/index.d.ts +0 -0
  220. /package/src/{modules → routes}/create-many/index.js +0 -0
  221. /package/src/{modules → routes}/create-one/base-create-one.service.d.ts +0 -0
  222. /package/src/{modules → routes}/create-one/base-create-one.service.js +0 -0
  223. /package/src/{modules → routes}/create-one/create-one-controller.interface.d.ts +0 -0
  224. /package/src/{modules/duplicate-one/duplicate-one-service.interface.js → routes/create-one/create-one-controller.interface.js} +0 -0
  225. /package/src/{modules → routes}/create-one/create-one-service.interface.d.ts +0 -0
  226. /package/src/{modules/get-many/get-many-controller.interface.js → routes/create-one/create-one-service.interface.js} +0 -0
  227. /package/src/{modules → routes}/create-one/index.d.ts +0 -0
  228. /package/src/{modules → routes}/create-one/index.js +0 -0
  229. /package/src/{modules → routes}/delete-many/base-delete-many.service.d.ts +0 -0
  230. /package/src/{modules → routes}/delete-many/base-delete-many.service.js +0 -0
  231. /package/src/{modules → routes}/delete-many/delete-many-controller.interface.d.ts +0 -0
  232. /package/src/{modules/get-many/get-many-service.interface.js → routes/delete-many/delete-many-controller.interface.js} +0 -0
  233. /package/src/{modules → routes}/delete-many/delete-many-service.interface.d.ts +0 -0
  234. /package/src/{modules/get-one/get-one-controller.interface.js → routes/delete-many/delete-many-service.interface.js} +0 -0
  235. /package/src/{modules → routes}/delete-many/delete-many.presenter.d.ts +0 -0
  236. /package/src/{modules → routes}/delete-many/delete-many.presenter.js +0 -0
  237. /package/src/{modules → routes}/delete-many/index.d.ts +0 -0
  238. /package/src/{modules → routes}/delete-many/index.js +0 -0
  239. /package/src/{modules → routes}/delete-one/base-delete-one.service.d.ts +0 -0
  240. /package/src/{modules → routes}/delete-one/base-delete-one.service.js +0 -0
  241. /package/src/{modules → routes}/delete-one/delete-one-controller.interface.d.ts +0 -0
  242. /package/src/{modules/get-one/get-one-service.interface.js → routes/delete-one/delete-one-controller.interface.js} +0 -0
  243. /package/src/{modules → routes}/delete-one/delete-one-service.interface.d.ts +0 -0
  244. /package/src/{modules/replace-one/replace-one-controller.interface.js → routes/delete-one/delete-one-service.interface.js} +0 -0
  245. /package/src/{modules → routes}/delete-one/delete-one.presenter.d.ts +0 -0
  246. /package/src/{modules → routes}/delete-one/delete-one.presenter.js +0 -0
  247. /package/src/{modules → routes}/delete-one/index.d.ts +0 -0
  248. /package/src/{modules → routes}/delete-one/index.js +0 -0
  249. /package/src/{modules → routes}/duplicate-many/base-duplicate-many.service.d.ts +0 -0
  250. /package/src/{modules → routes}/duplicate-many/base-duplicate-many.service.js +0 -0
  251. /package/src/{modules → routes}/duplicate-many/duplicate-many-controller.interface.d.ts +0 -0
  252. /package/src/{modules/replace-one/replace-one-service.interface.js → routes/duplicate-many/duplicate-many-controller.interface.js} +0 -0
  253. /package/src/{modules → routes}/duplicate-many/duplicate-many-service.interface.d.ts +0 -0
  254. /package/src/{modules/update-many/update-many-controller.interface.js → routes/duplicate-many/duplicate-many-service.interface.js} +0 -0
  255. /package/src/{modules → routes}/duplicate-many/index.d.ts +0 -0
  256. /package/src/{modules → routes}/duplicate-many/index.js +0 -0
  257. /package/src/{modules → routes}/duplicate-one/base-duplicate-one.service.d.ts +0 -0
  258. /package/src/{modules → routes}/duplicate-one/base-duplicate-one.service.js +0 -0
  259. /package/src/{modules → routes}/duplicate-one/duplicate-one-controller.interface.d.ts +0 -0
  260. /package/src/{modules/update-many/update-many-service.interface.js → routes/duplicate-one/duplicate-one-controller.interface.js} +0 -0
  261. /package/src/{modules → routes}/duplicate-one/duplicate-one-service.interface.d.ts +0 -0
  262. /package/src/{modules/update-one/update-one-controller.interface.js → routes/duplicate-one/duplicate-one-service.interface.js} +0 -0
  263. /package/src/{modules → routes}/duplicate-one/index.d.ts +0 -0
  264. /package/src/{modules → routes}/duplicate-one/index.js +0 -0
  265. /package/src/{modules → routes}/get-many/base-get-many.service.d.ts +0 -0
  266. /package/src/{modules → routes}/get-many/base-get-many.service.js +0 -0
  267. /package/src/{modules → routes}/get-many/get-many-controller.interface.d.ts +0 -0
  268. /package/src/{modules/update-one/update-one-service.interface.js → routes/get-many/get-many-controller.interface.js} +0 -0
  269. /package/src/{modules → routes}/get-many/get-many-service.interface.d.ts +0 -0
  270. /package/src/{modules → routes}/get-many/index.d.ts +0 -0
  271. /package/src/{modules → routes}/get-many/index.js +0 -0
  272. /package/src/{modules → routes}/get-one/base-get-one.service.d.ts +0 -0
  273. /package/src/{modules → routes}/get-one/base-get-one.service.js +0 -0
  274. /package/src/{modules → routes}/get-one/get-one-controller.interface.d.ts +0 -0
  275. /package/src/{modules → routes}/get-one/get-one-service.interface.d.ts +0 -0
  276. /package/src/{modules → routes}/get-one/index.d.ts +0 -0
  277. /package/src/{modules → routes}/get-one/index.js +0 -0
  278. /package/src/{modules → routes}/replace-one/base-replace-one.service.d.ts +0 -0
  279. /package/src/{modules → routes}/replace-one/base-replace-one.service.js +0 -0
  280. /package/src/{modules → routes}/replace-one/index.d.ts +0 -0
  281. /package/src/{modules → routes}/replace-one/index.js +0 -0
  282. /package/src/{modules → routes}/replace-one/replace-one-controller.interface.d.ts +0 -0
  283. /package/src/{modules → routes}/replace-one/replace-one-service.interface.d.ts +0 -0
  284. /package/src/{modules → routes}/update-many/base-update-many.service.d.ts +0 -0
  285. /package/src/{modules → routes}/update-many/base-update-many.service.js +0 -0
  286. /package/src/{modules → routes}/update-many/index.d.ts +0 -0
  287. /package/src/{modules → routes}/update-many/index.js +0 -0
  288. /package/src/{modules → routes}/update-many/update-many-controller.interface.d.ts +0 -0
  289. /package/src/{modules → routes}/update-many/update-many-service.interface.d.ts +0 -0
  290. /package/src/{modules → routes}/update-one/base-update-one.service.d.ts +0 -0
  291. /package/src/{modules → routes}/update-one/base-update-one.service.js +0 -0
  292. /package/src/{modules → routes}/update-one/index.d.ts +0 -0
  293. /package/src/{modules → routes}/update-one/index.js +0 -0
  294. /package/src/{modules → routes}/update-one/update-one-controller.interface.d.ts +0 -0
  295. /package/src/{modules → routes}/update-one/update-one-service.interface.d.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongodb-dynamic-api",
3
- "version": "1.3.3",
3
+ "version": "1.4.1",
4
4
  "description": "Auto generated CRUD API for MongoDB using NestJS",
5
5
  "readmeFilename": "README.md",
6
6
  "main": "index.js",
@@ -38,19 +38,26 @@
38
38
  },
39
39
  "homepage": "https://mikedev75015.github.io",
40
40
  "dependencies": {
41
+ "@casl/ability": "^6.7.0",
41
42
  "@nestjs/cache-manager": "^2.2.1",
42
43
  "@nestjs/common": "^10.3.2",
43
44
  "@nestjs/core": "^10.3.2",
45
+ "@nestjs/jwt": "^10.2.0",
44
46
  "@nestjs/mongoose": "^10.0.4",
47
+ "@nestjs/passport": "^10.0.3",
45
48
  "@nestjs/platform-express": "^10.3.2",
46
49
  "@nestjs/swagger": "^7.3.0",
47
50
  "@types/lodash": "^4.14.202",
51
+ "bcrypt": "^5.1.1",
48
52
  "builder-pattern": "^2.2.0",
49
53
  "cache-manager": "^5.4.0",
50
54
  "class-transformer": "^0.5.1",
51
55
  "class-validator": "^0.14.1",
52
56
  "lodash": "^4.17.21",
53
57
  "mongoose": "^8.1.1",
58
+ "passport": "^0.7.0",
59
+ "passport-jwt": "^4.0.1",
60
+ "passport-local": "^1.0.0",
54
61
  "reflect-metadata": "^0.2.1",
55
62
  "rxjs": "^7.8.1"
56
63
  },
@@ -63,9 +70,12 @@
63
70
  "@release-it/conventional-changelog": "^8.0.1",
64
71
  "@swc/cli": "^0.3.9",
65
72
  "@swc/core": "^1.4.0",
73
+ "@types/bcrypt": "^5.0.2",
66
74
  "@types/express": "^4.17.21",
67
75
  "@types/jest": "^29.5.12",
68
76
  "@types/node": "^20.11.16",
77
+ "@types/passport-jwt": "^4.0.1",
78
+ "@types/passport-local": "^1.0.38",
69
79
  "@types/supertest": "^6.0.2",
70
80
  "@typescript-eslint/eslint-plugin": "^6.21.0",
71
81
  "@typescript-eslint/parser": "^6.21.0",
@@ -0,0 +1,5 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { AppAbility, DynamicApiRouteCaslAbilityPredicate, RouteType } from '../../interfaces';
3
+ import { BaseEntity } from '../../models';
4
+ declare function CaslAbilityBuilder<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, abilityPredicate: DynamicApiRouteCaslAbilityPredicate<Entity>, user: unknown): AppAbility<Entity>;
5
+ export { CaslAbilityBuilder };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CaslAbilityBuilder = void 0;
4
+ const ability_1 = require("@casl/ability");
5
+ function CaslAbilityBuilder(entity, routeType, abilityPredicate, user) {
6
+ const { can, build } = new ability_1.AbilityBuilder(ability_1.createMongoAbility);
7
+ if (abilityPredicate(new entity(), user)) {
8
+ can(routeType, entity);
9
+ }
10
+ return build({
11
+ detectSubjectType: (object) => object.constructor
12
+ });
13
+ }
14
+ exports.CaslAbilityBuilder = CaslAbilityBuilder;
@@ -1 +1,3 @@
1
- export * from './route-decorators.builder';
1
+ export * from './casl/casl-ability.builder';
2
+ export * from './route-decorators/auth-decorators.builder';
3
+ export * from './route-decorators/route-decorators.builder';
@@ -14,4 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./route-decorators.builder"), exports);
17
+ __exportStar(require("./casl/casl-ability.builder"), exports);
18
+ __exportStar(require("./route-decorators/auth-decorators.builder"), exports);
19
+ __exportStar(require("./route-decorators/route-decorators.builder"), exports);
@@ -0,0 +1,7 @@
1
+ import { DecoratorBuilder } from '../../interfaces';
2
+ declare class AuthDecoratorsBuilder implements DecoratorBuilder<any> {
3
+ private readonly protectRegister;
4
+ constructor(protectRegister: boolean | undefined);
5
+ build(): (ClassDecorator & MethodDecorator)[];
6
+ }
7
+ export { AuthDecoratorsBuilder };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthDecoratorsBuilder = void 0;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ const decorators_1 = require("../../decorators");
6
+ class AuthDecoratorsBuilder {
7
+ constructor(protectRegister) {
8
+ this.protectRegister = protectRegister;
9
+ }
10
+ build() {
11
+ return !this.protectRegister ? [(0, decorators_1.Public)()] : [(0, swagger_1.ApiBearerAuth)()];
12
+ }
13
+ }
14
+ exports.AuthDecoratorsBuilder = AuthDecoratorsBuilder;
@@ -0,0 +1,23 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { DecoratorBuilder, RouteType } from '../../interfaces';
3
+ import { BaseEntity } from '../../models';
4
+ declare class RouteDecoratorsBuilder<Entity extends BaseEntity> implements DecoratorBuilder<Entity> {
5
+ private readonly routeType;
6
+ private readonly entity;
7
+ private readonly version;
8
+ private readonly description;
9
+ private readonly isPublic;
10
+ private readonly dTOs;
11
+ private readonly responseRouteTypeIsArray;
12
+ private readonly bodyRouteTypeIsOptional;
13
+ constructor(routeType: RouteType, entity: Type<Entity>, version: string | undefined, description: string | undefined, isPublic: boolean | undefined, dTOs?: {
14
+ param?: Type;
15
+ query?: Type;
16
+ body?: Type;
17
+ presenter?: Type;
18
+ });
19
+ build(): any[];
20
+ private getRouteDecorators;
21
+ private getApiDecorators;
22
+ }
23
+ export { RouteDecoratorsBuilder };
@@ -4,16 +4,16 @@ exports.RouteDecoratorsBuilder = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  const swagger_1 = require("@nestjs/swagger");
6
6
  const lodash_1 = require("lodash");
7
+ const decorators_1 = require("../../decorators");
8
+ const dynamic_api_module_1 = require("../../dynamic-api.module");
7
9
  class RouteDecoratorsBuilder {
8
- constructor(routeType, entity, version, description, param, query, body, presenter) {
10
+ constructor(routeType, entity, version, description, isPublic, dTOs = {}) {
9
11
  this.routeType = routeType;
10
12
  this.entity = entity;
11
13
  this.version = version;
12
14
  this.description = description;
13
- this.param = param;
14
- this.query = query;
15
- this.body = body;
16
- this.presenter = presenter;
15
+ this.isPublic = isPublic;
16
+ this.dTOs = dTOs;
17
17
  this.responseRouteTypeIsArray = [
18
18
  'GetMany',
19
19
  'CreateMany',
@@ -25,39 +25,59 @@ class RouteDecoratorsBuilder {
25
25
  ];
26
26
  }
27
27
  build() {
28
- const [paramKey] = this.param ? (0, lodash_1.keys)(new this.param()) : [];
28
+ const [paramKey] = this.dTOs.param ? (0, lodash_1.keys)(new this.dTOs.param()) : [];
29
29
  return [
30
30
  ...this.getRouteDecorators(paramKey),
31
31
  ...this.getApiDecorators(paramKey),
32
32
  ];
33
33
  }
34
34
  getRouteDecorators(paramKey) {
35
+ let routeDecorators = [];
36
+ const isAuthEnabled = dynamic_api_module_1.DynamicApiModule.state.get('isAuthEnabled');
37
+ if (this.isPublic) {
38
+ routeDecorators.push((0, decorators_1.Public)());
39
+ }
40
+ else if (isAuthEnabled) {
41
+ routeDecorators.push((0, swagger_1.ApiBearerAuth)());
42
+ }
35
43
  switch (this.routeType) {
36
44
  case 'GetMany':
37
- return [(0, common_1.Get)()];
45
+ routeDecorators.push((0, common_1.Get)());
46
+ break;
38
47
  case 'GetOne':
39
- return [(0, common_1.Get)(`:${paramKey}`)];
48
+ routeDecorators.push((0, common_1.Get)(`:${paramKey}`));
49
+ break;
40
50
  case 'CreateMany':
41
- return [(0, common_1.Post)('many')];
51
+ routeDecorators.push((0, common_1.Post)('many'));
52
+ break;
42
53
  case 'CreateOne':
43
- return [(0, common_1.Post)()];
54
+ routeDecorators.push((0, common_1.Post)());
55
+ break;
44
56
  case 'UpdateMany':
45
- return [(0, common_1.Patch)()];
57
+ routeDecorators.push((0, common_1.Patch)());
58
+ break;
46
59
  case 'UpdateOne':
47
- return [(0, common_1.Patch)(`:${paramKey}`)];
60
+ routeDecorators.push((0, common_1.Patch)(`:${paramKey}`));
61
+ break;
48
62
  case 'ReplaceOne':
49
- return [(0, common_1.Put)(`:${paramKey}`)];
63
+ routeDecorators.push((0, common_1.Put)(`:${paramKey}`));
64
+ break;
50
65
  case 'DuplicateMany':
51
- return [(0, common_1.Post)(`duplicate`)];
66
+ routeDecorators.push((0, common_1.Post)(`duplicate`));
67
+ break;
52
68
  case 'DuplicateOne':
53
- return [(0, common_1.Post)(`duplicate/:${paramKey}`)];
69
+ routeDecorators.push((0, common_1.Post)(`duplicate/:${paramKey}`));
70
+ break;
54
71
  case 'DeleteMany':
55
- return [(0, common_1.Delete)()];
72
+ routeDecorators.push((0, common_1.Delete)());
73
+ break;
56
74
  case 'DeleteOne':
57
- return [(0, common_1.Delete)(`:${paramKey}`)];
75
+ routeDecorators.push((0, common_1.Delete)(`:${paramKey}`));
76
+ break;
58
77
  default:
59
78
  throw new Error(`Unexpected route type! Cannot build route decorators. Received: ${this.routeType}`);
60
79
  }
80
+ return routeDecorators;
61
81
  }
62
82
  getApiDecorators(paramKey) {
63
83
  return [
@@ -67,17 +87,19 @@ class RouteDecoratorsBuilder {
67
87
  `${(0, lodash_1.upperFirst)((0, lodash_1.lowerCase)(this.routeType))} ${(0, lodash_1.lowerCase)(this.entity.name)}`,
68
88
  }),
69
89
  (0, swagger_1.ApiResponse)({
70
- type: this.presenter ?? this.entity,
90
+ type: this.dTOs.presenter ?? this.entity,
71
91
  isArray: this.responseRouteTypeIsArray.includes(this.routeType),
72
92
  }),
73
- ...(this.body ? [(0, swagger_1.ApiBody)({
74
- type: this.body,
93
+ ...(this.dTOs.body ? [
94
+ (0, swagger_1.ApiBody)({
95
+ type: this.dTOs.body,
75
96
  required: !this.bodyRouteTypeIsOptional.includes(this.routeType),
76
- })] : []),
77
- ...(this.param && paramKey
97
+ }),
98
+ ] : []),
99
+ ...(this.dTOs.param && paramKey
78
100
  ? [
79
101
  (0, swagger_1.ApiParam)({
80
- type: typeof new this.param()[paramKey],
102
+ type: typeof new this.dTOs.param()[paramKey],
81
103
  name: paramKey,
82
104
  }),
83
105
  ]
@@ -0,0 +1,5 @@
1
+ import { PolicyHandler } from '../interfaces';
2
+ import { BaseEntity } from '../models';
3
+ declare const CHECK_POLICIES_KEY = "check_policy";
4
+ declare const CheckPolicies: <Entity extends BaseEntity>(...handlers: PolicyHandler<Entity>[]) => import("@nestjs/common").CustomDecorator<string>;
5
+ export { CheckPolicies, CHECK_POLICIES_KEY };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CHECK_POLICIES_KEY = exports.CheckPolicies = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const CHECK_POLICIES_KEY = 'check_policy';
6
+ exports.CHECK_POLICIES_KEY = CHECK_POLICIES_KEY;
7
+ const CheckPolicies = (...handlers) => (0, common_1.SetMetadata)(CHECK_POLICIES_KEY, handlers);
8
+ exports.CheckPolicies = CheckPolicies;
@@ -1 +1,3 @@
1
+ export * from './check-policies.decorator';
2
+ export * from './public.decorator';
1
3
  export * from './schema-options.decorator';
@@ -14,4 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./check-policies.decorator"), exports);
18
+ __exportStar(require("./public.decorator"), exports);
17
19
  __exportStar(require("./schema-options.decorator"), exports);
@@ -0,0 +1,3 @@
1
+ declare const IS_PUBLIC_KEY = "isPublic";
2
+ declare const Public: () => import("@nestjs/common").CustomDecorator<string>;
3
+ export { IS_PUBLIC_KEY, Public };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Public = exports.IS_PUBLIC_KEY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const IS_PUBLIC_KEY = 'isPublic';
6
+ exports.IS_PUBLIC_KEY = IS_PUBLIC_KEY;
7
+ const Public = () => (0, common_1.SetMetadata)(IS_PUBLIC_KEY, true);
8
+ exports.Public = Public;
@@ -1,9 +1,10 @@
1
1
  import { DynamicModule } from '@nestjs/common';
2
2
  import { DynamicApiForFeatureOptions, DynamicApiForRootOptions } from './interfaces';
3
3
  import { BaseEntity } from './models';
4
+ import { DynamicApiGlobalStateService } from './services';
4
5
  export declare class DynamicApiModule {
5
- static readonly connectionName = "dynamic-api-connection";
6
- static isGlobalCacheEnabled: boolean;
7
- static forRoot(uri: string, { useGlobalCache, cacheOptions }?: DynamicApiForRootOptions): DynamicModule;
8
- static forFeature<Entity extends BaseEntity>({ entity, controllerOptions: { path, apiTag, version: controllerVersion, validationPipeOptions: controllerValidationPipeOptions, }, routes, }: DynamicApiForFeatureOptions<Entity>): DynamicModule;
6
+ static readonly state: DynamicApiGlobalStateService;
7
+ static forRoot(uri: string, { useGlobalCache, cacheOptions, useAuth, }?: DynamicApiForRootOptions): DynamicModule;
8
+ static forFeature<Entity extends BaseEntity>({ entity, controllerOptions, routes, }: DynamicApiForFeatureOptions<Entity>): Promise<DynamicModule>;
9
+ private static setDefaultRoutesIfNotConfigured;
9
10
  }
@@ -11,43 +11,143 @@ exports.DynamicApiModule = void 0;
11
11
  const cache_manager_1 = require("@nestjs/cache-manager");
12
12
  const common_1 = require("@nestjs/common");
13
13
  const core_1 = require("@nestjs/core");
14
+ const http_adapter_host_1 = require("@nestjs/core/helpers/http-adapter-host");
14
15
  const mongoose_1 = require("@nestjs/mongoose");
15
- const decorators_1 = require("./decorators");
16
+ const rxjs_1 = require("rxjs");
17
+ const guards_1 = require("./guards");
16
18
  const helpers_1 = require("./helpers");
19
+ const interceptors_1 = require("./interceptors");
20
+ const interfaces_1 = require("./interfaces");
17
21
  const modules_1 = require("./modules");
22
+ const routes_1 = require("./routes");
23
+ const services_1 = require("./services");
18
24
  let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
19
- static forRoot(uri, { useGlobalCache = true, cacheOptions = {} } = {}) {
25
+ static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, } = {}) {
20
26
  if (!uri) {
21
27
  throw new Error('You must provide a valid mongodb uri in the forRoot method to use MongoDB Dynamic API');
22
28
  }
23
- if (!useGlobalCache) {
24
- DynamicApiModule_1.isGlobalCacheEnabled = false;
25
- }
29
+ this.state.set([
30
+ 'partial', {
31
+ initialized: true,
32
+ isGlobalCacheEnabled: useGlobalCache,
33
+ ...(cacheOptions?.excludePaths ? { cacheExcludedPaths: cacheOptions?.excludePaths } : {}),
34
+ ...(useAuth?.user ? {
35
+ isAuthEnabled: true,
36
+ credentials: {
37
+ loginField: !useAuth.user.loginField ? 'email' : String(useAuth.user.loginField),
38
+ passwordField: !useAuth.user.passwordField ? 'password' : String(useAuth.user.passwordField),
39
+ },
40
+ jwtSecret: useAuth.jwt?.secret ?? 'dynamic-api-jwt-secret',
41
+ } : {}),
42
+ },
43
+ ]);
26
44
  return {
27
45
  module: DynamicApiModule_1,
28
46
  imports: [
29
- ...(useGlobalCache ? [cache_manager_1.CacheModule.register({ isGlobal: true, ...cacheOptions })] : []),
30
- mongoose_1.MongooseModule.forRoot(uri, { connectionName: DynamicApiModule_1.connectionName }),
47
+ modules_1.DynamicApiConfigModule.register(this.state.get()),
48
+ cache_manager_1.CacheModule.register({ isGlobal: true, ...cacheOptions }),
49
+ mongoose_1.MongooseModule.forRoot(uri, { connectionName: this.state.get('connectionName') }),
50
+ ...(useAuth?.user ? [
51
+ modules_1.AuthModule.forRoot({
52
+ user: {
53
+ entity: useAuth.user.entity,
54
+ loginField: useAuth.user.loginField ?? 'email',
55
+ passwordField: useAuth.user.passwordField ?? 'password',
56
+ additionalFields: useAuth.user.additionalFields ?? {
57
+ toRegister: [],
58
+ toRequest: [],
59
+ },
60
+ },
61
+ jwt: {
62
+ secret: useAuth.jwt?.secret ?? 'dynamic-api-jwt-secret',
63
+ expiresIn: useAuth.jwt?.expiresIn ?? '1d',
64
+ },
65
+ protectRegister: useAuth.protectRegister ?? false,
66
+ registerAbilityPredicate: useAuth.registerAbilityPredicate,
67
+ }),
68
+ ] : []),
31
69
  ],
70
+ exports: [modules_1.DynamicApiConfigModule],
32
71
  };
33
72
  }
34
- static forFeature({ entity, controllerOptions: { path, apiTag, version: controllerVersion, validationPipeOptions: controllerValidationPipeOptions, }, routes = [], }) {
35
- const { indexes, hooks } = Reflect.getOwnMetadata(decorators_1.DYNAMIC_API_SCHEMA_OPTIONS_METADATA, entity) ?? {};
36
- const schema = mongoose_1.SchemaFactory.createForClass(entity);
37
- schema.set('timestamps', true);
38
- if (indexes) {
39
- indexes.forEach(({ fields, options }) => {
40
- schema.index(fields, options);
41
- });
42
- }
43
- if (hooks?.length) {
44
- hooks.forEach(({ type, method, callback, options }) => {
45
- schema[method](type, { document: true, query: true, ...options }, callback);
46
- });
47
- }
48
- const databaseModule = mongoose_1.MongooseModule.forFeature([{ name: entity.name, schema }], DynamicApiModule_1.connectionName);
73
+ static forFeature({ entity, controllerOptions, routes = [], }) {
74
+ const databaseModule = mongoose_1.MongooseModule.forFeature([{ name: entity.name, schema: (0, helpers_1.buildSchemaFromEntity)(entity) }], this.state.get('connectionName'));
75
+ routes = this.setDefaultRoutesIfNotConfigured([...routes]);
76
+ return new Promise((resolve, reject) => {
77
+ const waitInitializedStateInterval = setInterval(async () => {
78
+ const stateInitialized = await (0, rxjs_1.firstValueFrom)(this.state.get().onInitialized());
79
+ if (!stateInitialized) {
80
+ return;
81
+ }
82
+ if (waitForState) {
83
+ clearTimeout(waitForState);
84
+ }
85
+ clearInterval(waitInitializedStateInterval);
86
+ const { version: controllerVersion, validationPipeOptions: controllerValidationPipeOptions, } = controllerOptions;
87
+ const castType = (t) => t;
88
+ const castModule = (m) => m;
89
+ const moduleByRouteType = new Map([
90
+ [castType('CreateMany'), castModule(routes_1.CreateManyModule)],
91
+ [castType('CreateOne'), castModule(routes_1.CreateOneModule)],
92
+ [castType('DeleteMany'), castModule(routes_1.DeleteManyModule)],
93
+ [castType('DeleteOne'), castModule(routes_1.DeleteOneModule)],
94
+ [castType('DuplicateMany'), castModule(routes_1.DuplicateManyModule)],
95
+ [castType('DuplicateOne'), castModule(routes_1.DuplicateOneModule)],
96
+ [castType('GetMany'), castModule(routes_1.GetManyModule)],
97
+ [castType('GetOne'), castModule(routes_1.GetOneModule)],
98
+ [castType('ReplaceOne'), castModule(routes_1.ReplaceOneModule)],
99
+ [castType('UpdateMany'), castModule(routes_1.UpdateManyModule)],
100
+ [castType('UpdateOne'), castModule(routes_1.UpdateOneModule)],
101
+ ]);
102
+ const apiModule = {
103
+ module: DynamicApiModule_1,
104
+ imports: [
105
+ ...routes.map((routeConfig) => {
106
+ const { type, description: routeDescription, version: routeVersion, validationPipeOptions: routeValidationPipeOptions, } = routeConfig;
107
+ const module = moduleByRouteType.get(type);
108
+ if (!module) {
109
+ reject(new Error(`Route module for ${type} not found`));
110
+ return;
111
+ }
112
+ const description = routeDescription ?? (0, helpers_1.getDefaultRouteDescription)(type, entity.name);
113
+ const version = routeVersion ?? controllerVersion;
114
+ if (version && !(0, helpers_1.isValidVersion)(version)) {
115
+ reject(new Error(`Invalid version ${version} for ${type} route.`
116
+ + ' Version must be a string that matches numeric format, e.g. 1, 2, 3, ..., 99.'));
117
+ return;
118
+ }
119
+ const validationPipeOptions = routeValidationPipeOptions ?? controllerValidationPipeOptions;
120
+ return module.forFeature(databaseModule, entity, controllerOptions, { ...routeConfig, description }, version, validationPipeOptions ?? { transform: true });
121
+ }),
122
+ ],
123
+ providers: [
124
+ {
125
+ provide: core_1.APP_INTERCEPTOR,
126
+ inject: [cache_manager_1.CACHE_MANAGER, core_1.Reflector, http_adapter_host_1.HttpAdapterHost, interfaces_1.DYNAMIC_API_GLOBAL_STATE],
127
+ useFactory: (cacheManager, reflector, httpAdapterHost, state) => {
128
+ return new interceptors_1.DynamicApiCacheInterceptor(cacheManager, reflector, httpAdapterHost, state);
129
+ },
130
+ },
131
+ {
132
+ provide: core_1.APP_GUARD,
133
+ inject: [core_1.Reflector, interfaces_1.DYNAMIC_API_GLOBAL_STATE],
134
+ useFactory: (reflector, state) => {
135
+ return new guards_1.DynamicApiJwtAuthGuard(reflector, state);
136
+ },
137
+ },
138
+ ],
139
+ };
140
+ resolve(apiModule);
141
+ }, 500);
142
+ const waitForState = setTimeout(() => {
143
+ clearInterval(waitInitializedStateInterval);
144
+ reject(new Error('Dynamic API state could not be initialized. Please check your configuration.'));
145
+ }, 5000);
146
+ });
147
+ }
148
+ static setDefaultRoutesIfNotConfigured(routes) {
49
149
  if (!routes.length) {
50
- routes = [
150
+ return [
51
151
  { type: 'GetMany' },
52
152
  { type: 'GetOne' },
53
153
  { type: 'CreateMany' },
@@ -61,73 +161,18 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
61
161
  { type: 'DeleteOne' },
62
162
  ];
63
163
  }
64
- return {
65
- module: DynamicApiModule_1,
66
- imports: [
67
- ...routes
68
- .map(({ type, dTOs, description: routeDescription, version: routeVersion, validationPipeOptions: routeValidationPipeOptions, }) => {
69
- let module;
70
- switch (type) {
71
- case 'CreateMany':
72
- module = modules_1.CreateManyModule;
73
- break;
74
- case 'CreateOne':
75
- module = modules_1.CreateOneModule;
76
- break;
77
- case 'DeleteMany':
78
- module = modules_1.DeleteManyModule;
79
- break;
80
- case 'DeleteOne':
81
- module = modules_1.DeleteOneModule;
82
- break;
83
- case 'DuplicateMany':
84
- module = modules_1.DuplicateManyModule;
85
- break;
86
- case 'DuplicateOne':
87
- module = modules_1.DuplicateOneModule;
88
- break;
89
- case 'GetMany':
90
- module = modules_1.GetManyModule;
91
- break;
92
- case 'GetOne':
93
- module = modules_1.GetOneModule;
94
- break;
95
- case 'ReplaceOne':
96
- module = modules_1.ReplaceOneModule;
97
- break;
98
- case 'UpdateMany':
99
- module = modules_1.UpdateManyModule;
100
- break;
101
- case 'UpdateOne':
102
- module = modules_1.UpdateOneModule;
103
- break;
104
- default:
105
- throw new Error(`Route for ${type} is not implemented`);
106
- }
107
- const description = routeDescription ?? (0, helpers_1.getDefaultRouteDescription)(type, entity.name);
108
- const version = routeVersion ?? controllerVersion;
109
- if (version && !(0, helpers_1.isValidVersion)(version)) {
110
- throw new Error(`Invalid version ${version} for ${type} route. Version must be a string that matches numeric format, e.g. 1, 2, 3, ..., 99.`);
111
- }
112
- const validationPipeOptions = routeValidationPipeOptions ?? controllerValidationPipeOptions;
113
- return module.forFeature(databaseModule, entity, { path, apiTag }, { description, dTOs }, version, validationPipeOptions);
114
- })
115
- .filter((module) => module),
116
- ],
117
- providers: [
118
- ...(DynamicApiModule_1.isGlobalCacheEnabled ? [
119
- {
120
- provide: core_1.APP_INTERCEPTOR,
121
- useClass: cache_manager_1.CacheInterceptor,
122
- },
123
- ] : []),
124
- ],
125
- };
164
+ return routes;
126
165
  }
127
166
  };
128
167
  exports.DynamicApiModule = DynamicApiModule;
129
- DynamicApiModule.connectionName = 'dynamic-api-connection';
130
- DynamicApiModule.isGlobalCacheEnabled = true;
168
+ DynamicApiModule.state = new services_1.DynamicApiGlobalStateService({
169
+ connectionName: 'dynamic-api-connection',
170
+ isGlobalCacheEnabled: true,
171
+ isAuthEnabled: false,
172
+ credentials: null,
173
+ jwtSecret: undefined,
174
+ cacheExcludedPaths: [],
175
+ });
131
176
  exports.DynamicApiModule = DynamicApiModule = DynamicApiModule_1 = __decorate([
132
177
  (0, common_1.Module)({})
133
178
  ], DynamicApiModule);
@@ -0,0 +1,13 @@
1
+ import { CanActivate, ExecutionContext, Type } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { DynamicApiRouteCaslAbilityPredicate, RouteType } from '../interfaces';
4
+ import { BaseEntity } from '../models';
5
+ export declare abstract class BasePoliciesGuard<Entity extends BaseEntity> implements CanActivate {
6
+ protected readonly reflector: Reflector;
7
+ protected routeType: RouteType;
8
+ protected entity: Type<Entity>;
9
+ protected abilityPredicate: DynamicApiRouteCaslAbilityPredicate<Entity> | undefined;
10
+ protected constructor(reflector: Reflector);
11
+ canActivate(context: ExecutionContext): boolean;
12
+ private execPolicyHandler;
13
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BasePoliciesGuard = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const builders_1 = require("../builders");
6
+ const decorators_1 = require("../decorators");
7
+ class BasePoliciesGuard {
8
+ constructor(reflector) {
9
+ this.reflector = reflector;
10
+ }
11
+ canActivate(context) {
12
+ const policyHandlers = this.reflector.get(decorators_1.CHECK_POLICIES_KEY, context.getHandler());
13
+ if (!policyHandlers || !this.abilityPredicate) {
14
+ return true;
15
+ }
16
+ let { user } = context.switchToHttp().getRequest();
17
+ if (!user) {
18
+ throw new common_1.ForbiddenException('Forbidden resource');
19
+ }
20
+ const ability = (0, builders_1.CaslAbilityBuilder)(this.entity, this.routeType, this.abilityPredicate, user);
21
+ return policyHandlers.every((handler) => {
22
+ return this.execPolicyHandler(handler, ability);
23
+ });
24
+ }
25
+ execPolicyHandler(handler, ability) {
26
+ if (typeof handler === 'function') {
27
+ return handler(ability);
28
+ }
29
+ return handler.handle(ability);
30
+ }
31
+ }
32
+ exports.BasePoliciesGuard = BasePoliciesGuard;
@@ -0,0 +1,11 @@
1
+ import { ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { DynamicApiGlobalState } from '../interfaces';
4
+ declare const DynamicApiJwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
5
+ export declare class DynamicApiJwtAuthGuard extends DynamicApiJwtAuthGuard_base {
6
+ private reflector;
7
+ private readonly state;
8
+ constructor(reflector: Reflector, state: DynamicApiGlobalState);
9
+ canActivate(context: ExecutionContext): boolean | Promise<boolean> | import("rxjs").Observable<boolean>;
10
+ }
11
+ export {};