@flusys/nestjs-shared 7.1.0 → 8.0.0-beta.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 (338) hide show
  1. package/classes/api-controller.class.d.ts +4 -4
  2. package/classes/api-service.class.d.ts +7 -7
  3. package/classes/disabled-event-bus.class.d.ts +1 -1
  4. package/classes/domain-event.publisher.d.ts +1 -1
  5. package/classes/event-bus.registry.d.ts +1 -1
  6. package/classes/event-transports/event-transport.registry.d.ts +1 -1
  7. package/classes/event-transports/index.d.ts +2 -2
  8. package/classes/event-transports/kafka-transport.optional.d.ts +1 -1
  9. package/classes/event-transports/memory-transport.d.ts +1 -1
  10. package/classes/event-transports/rabbitmq-transport.optional.d.ts +1 -1
  11. package/classes/hybrid-event-bus.class.d.ts +1 -1
  12. package/classes/index.d.ts +11 -11
  13. package/constants/index.d.ts +2 -2
  14. package/decorators/api-response.decorator.d.ts +1 -1
  15. package/decorators/current-user.decorator.d.ts +1 -1
  16. package/decorators/index.d.ts +6 -6
  17. package/decorators/require-permission.decorator.d.ts +1 -1
  18. package/dtos/filter-and-pagination.dto.d.ts +1 -1
  19. package/dtos/index.d.ts +6 -6
  20. package/entities/index.d.ts +3 -3
  21. package/enums/index.d.ts +3 -3
  22. package/exceptions/index.d.ts +2 -2
  23. package/fesm/470.js +2713 -0
  24. package/fesm/509.js +793 -0
  25. package/fesm/667.js +606 -0
  26. package/fesm/67.js +808 -0
  27. package/fesm/720.js +914 -0
  28. package/{cjs/classes/event-transports/rabbitmq-transport.optional.js → fesm/chunks/123.js} +78 -55
  29. package/fesm/{classes/event-transports/kafka-transport.optional.js → chunks/37.js} +74 -41
  30. package/fesm/classes/index.js +62 -12
  31. package/fesm/constants/index.js +445 -17
  32. package/fesm/decorators/index.js +341 -6
  33. package/fesm/dtos/index.js +23 -6
  34. package/fesm/entities/index.js +336 -3
  35. package/fesm/enums/index.js +57 -3
  36. package/fesm/exceptions/index.js +280 -2
  37. package/fesm/guards/index.js +1003 -3
  38. package/fesm/index.js +1524 -14
  39. package/fesm/interceptors/index.js +924 -5
  40. package/fesm/interfaces/index.js +57 -11
  41. package/fesm/middlewares/index.js +33 -1
  42. package/fesm/modules/index.js +432 -9
  43. package/fesm/runtime.js +134 -0
  44. package/fesm/utils/index.js +1045 -8
  45. package/filters/global-exception.filter.d.ts +1 -1
  46. package/filters/index.d.ts +1 -1
  47. package/guards/index.d.ts +3 -3
  48. package/guards/jwt-auth.guard.d.ts +1 -1
  49. package/guards/optional-jwt-auth.guard.d.ts +1 -1
  50. package/guards/permission.guard.d.ts +2 -2
  51. package/index.d.ts +14 -14
  52. package/interceptors/delete-empty-id-from-body.interceptor.d.ts +1 -1
  53. package/interceptors/idempotency.interceptor.d.ts +2 -2
  54. package/interceptors/index.d.ts +5 -5
  55. package/interceptors/response-meta.interceptor.d.ts +1 -1
  56. package/interceptors/set-user-field-on-body.interceptor.d.ts +1 -1
  57. package/interceptors/slug.interceptor.d.ts +2 -2
  58. package/interfaces/ai-assistant-adapter.interface.d.ts +1 -1
  59. package/interfaces/api.interface.d.ts +2 -2
  60. package/interfaces/datasource.interface.d.ts +1 -1
  61. package/interfaces/event-manager-adapter.interface.d.ts +2 -2
  62. package/interfaces/index.d.ts +11 -11
  63. package/interfaces/module-config.interface.d.ts +1 -1
  64. package/interfaces/notification-adapter.interface.d.ts +1 -1
  65. package/middlewares/index.d.ts +1 -1
  66. package/middlewares/logger.middleware.d.ts +2 -2
  67. package/modules/cache/cache.module.d.ts +1 -1
  68. package/modules/datasource/index.d.ts +1 -1
  69. package/modules/datasource/multi-tenant-datasource.service.d.ts +4 -4
  70. package/modules/event-bus/event-bus.explorer.d.ts +2 -2
  71. package/modules/event-bus/event-bus.module.d.ts +2 -2
  72. package/modules/event-bus/module-events.provider.d.ts +1 -1
  73. package/modules/index.d.ts +9 -9
  74. package/modules/shared-permission-cache/shared-permission-cache.service.d.ts +3 -3
  75. package/modules/utils/utils.service.d.ts +1 -1
  76. package/package.json +30 -44
  77. package/utils/index.d.ts +8 -8
  78. package/utils/permission-cache-key.util.d.ts +1 -1
  79. package/utils/query-helpers.util.d.ts +2 -2
  80. package/utils/request.util.d.ts +1 -1
  81. package/cjs/classes/api-controller.class.js +0 -728
  82. package/cjs/classes/api-controller.class.spec.js +0 -684
  83. package/cjs/classes/api-service.class.js +0 -631
  84. package/cjs/classes/api-service.class.spec.js +0 -1137
  85. package/cjs/classes/disabled-event-bus.class.js +0 -15
  86. package/cjs/classes/disabled-event-bus.class.spec.js +0 -40
  87. package/cjs/classes/domain-event.publisher.js +0 -76
  88. package/cjs/classes/domain-event.publisher.spec.js +0 -234
  89. package/cjs/classes/event-bus.registry.js +0 -68
  90. package/cjs/classes/event-bus.registry.spec.js +0 -141
  91. package/cjs/classes/event-transports/event-transport.registry.js +0 -41
  92. package/cjs/classes/event-transports/event-transport.registry.spec.js +0 -31
  93. package/cjs/classes/event-transports/index.js +0 -23
  94. package/cjs/classes/event-transports/kafka-transport.optional.js +0 -151
  95. package/cjs/classes/event-transports/kafka-transport.optional.spec.js +0 -198
  96. package/cjs/classes/event-transports/memory-transport.js +0 -53
  97. package/cjs/classes/event-transports/memory-transport.spec.js +0 -57
  98. package/cjs/classes/event-transports/rabbitmq-transport.optional.spec.js +0 -255
  99. package/cjs/classes/handle-custome-db.js +0 -37
  100. package/cjs/classes/handle-custome-db.spec.js +0 -82
  101. package/cjs/classes/hybrid-cache.class.js +0 -96
  102. package/cjs/classes/hybrid-cache.class.spec.js +0 -168
  103. package/cjs/classes/hybrid-event-bus.class.js +0 -281
  104. package/cjs/classes/hybrid-event-bus.class.spec.js +0 -218
  105. package/cjs/classes/index.js +0 -28
  106. package/cjs/classes/winston.logger.class.js +0 -274
  107. package/cjs/classes/winston.logger.class.spec.js +0 -330
  108. package/cjs/constants/index.js +0 -88
  109. package/cjs/constants/message-keys.js +0 -68
  110. package/cjs/constants/permissions.js +0 -307
  111. package/cjs/decorators/api-response.decorator.js +0 -52
  112. package/cjs/decorators/api-response.decorator.spec.js +0 -126
  113. package/cjs/decorators/current-user.decorator.js +0 -16
  114. package/cjs/decorators/current-user.decorator.spec.js +0 -74
  115. package/cjs/decorators/index.js +0 -23
  116. package/cjs/decorators/log-action.decorator.js +0 -149
  117. package/cjs/decorators/log-action.decorator.spec.js +0 -353
  118. package/cjs/decorators/on-domain-event.decorator.js +0 -13
  119. package/cjs/decorators/on-domain-event.decorator.spec.js +0 -50
  120. package/cjs/decorators/public.decorator.js +0 -13
  121. package/cjs/decorators/public.decorator.spec.js +0 -50
  122. package/cjs/decorators/require-permission.decorator.js +0 -32
  123. package/cjs/decorators/require-permission.decorator.spec.js +0 -147
  124. package/cjs/dtos/delete.dto.js +0 -92
  125. package/cjs/dtos/filter-and-pagination.dto.js +0 -164
  126. package/cjs/dtos/get-by-ids.dto.js +0 -65
  127. package/cjs/dtos/identity-response.dto.js +0 -108
  128. package/cjs/dtos/index.js +0 -23
  129. package/cjs/dtos/pagination.dto.js +0 -67
  130. package/cjs/dtos/response-payload.dto.js +0 -369
  131. package/cjs/entities/identity.js +0 -100
  132. package/cjs/entities/index.js +0 -20
  133. package/cjs/entities/raw-type.js +0 -4
  134. package/cjs/entities/user-root.js +0 -189
  135. package/cjs/enums/index.js +0 -20
  136. package/cjs/enums/notification-type.enum.js +0 -17
  137. package/cjs/enums/participant-status.enum.js +0 -17
  138. package/cjs/enums/recurrence-type.enum.js +0 -18
  139. package/cjs/exceptions/base-app.exception.js +0 -151
  140. package/cjs/exceptions/base-app.exception.spec.js +0 -157
  141. package/cjs/exceptions/index.js +0 -19
  142. package/cjs/exceptions/permission.exception.js +0 -56
  143. package/cjs/exceptions/permission.exception.spec.js +0 -82
  144. package/cjs/filters/global-exception.filter.js +0 -279
  145. package/cjs/filters/global-exception.filter.spec.js +0 -440
  146. package/cjs/filters/index.js +0 -18
  147. package/cjs/guards/index.js +0 -20
  148. package/cjs/guards/jwt-auth.guard.js +0 -75
  149. package/cjs/guards/jwt-auth.guard.spec.js +0 -75
  150. package/cjs/guards/optional-jwt-auth.guard.js +0 -67
  151. package/cjs/guards/optional-jwt-auth.guard.spec.js +0 -55
  152. package/cjs/guards/permission.guard.js +0 -179
  153. package/cjs/guards/permission.guard.spec.js +0 -373
  154. package/cjs/index.js +0 -31
  155. package/cjs/interceptors/delete-empty-id-from-body.interceptor.js +0 -40
  156. package/cjs/interceptors/delete-empty-id-from-body.interceptor.spec.js +0 -107
  157. package/cjs/interceptors/idempotency.interceptor.js +0 -96
  158. package/cjs/interceptors/idempotency.interceptor.spec.js +0 -116
  159. package/cjs/interceptors/index.js +0 -22
  160. package/cjs/interceptors/response-meta.interceptor.js +0 -47
  161. package/cjs/interceptors/response-meta.interceptor.spec.js +0 -89
  162. package/cjs/interceptors/set-user-field-on-body.interceptor.js +0 -60
  163. package/cjs/interceptors/set-user-field-on-body.interceptor.spec.js +0 -128
  164. package/cjs/interceptors/slug.interceptor.js +0 -75
  165. package/cjs/interceptors/slug.interceptor.spec.js +0 -110
  166. package/cjs/interfaces/ai-assistant-adapter.interface.js +0 -24
  167. package/cjs/interfaces/api.interface.js +0 -4
  168. package/cjs/interfaces/datasource.interface.js +0 -4
  169. package/cjs/interfaces/event-bus.interface.js +0 -4
  170. package/cjs/interfaces/event-manager-adapter.interface.js +0 -11
  171. package/cjs/interfaces/identity.interface.js +0 -4
  172. package/cjs/interfaces/index.js +0 -28
  173. package/cjs/interfaces/logged-user-info.interface.js +0 -6
  174. package/cjs/interfaces/module-config.interface.js +0 -4
  175. package/cjs/interfaces/notification-adapter.interface.js +0 -11
  176. package/cjs/interfaces/permission-sync-adapter.interface.js +0 -11
  177. package/cjs/interfaces/permission.interface.js +0 -4
  178. package/cjs/middlewares/index.js +0 -18
  179. package/cjs/middlewares/logger.middleware.js +0 -264
  180. package/cjs/middlewares/logger.middleware.spec.js +0 -462
  181. package/cjs/modules/cache/cache.module.js +0 -39
  182. package/cjs/modules/cache/cache.module.spec.js +0 -48
  183. package/cjs/modules/datasource/index.js +0 -18
  184. package/cjs/modules/datasource/multi-tenant-datasource.service.js +0 -222
  185. package/cjs/modules/datasource/multi-tenant-datasource.service.spec.js +0 -381
  186. package/cjs/modules/event-bus/event-bus.explorer.js +0 -124
  187. package/cjs/modules/event-bus/event-bus.explorer.spec.js +0 -189
  188. package/cjs/modules/event-bus/event-bus.integration.spec.js +0 -253
  189. package/cjs/modules/event-bus/event-bus.module.js +0 -94
  190. package/cjs/modules/event-bus/event-bus.module.spec.js +0 -149
  191. package/cjs/modules/event-bus/module-events.provider.js +0 -39
  192. package/cjs/modules/event-bus/module-events.provider.spec.js +0 -56
  193. package/cjs/modules/index.js +0 -26
  194. package/cjs/modules/shared-permission-cache/shared-permission-cache.module.js +0 -32
  195. package/cjs/modules/shared-permission-cache/shared-permission-cache.service.js +0 -101
  196. package/cjs/modules/shared-permission-cache/shared-permission-cache.service.spec.js +0 -165
  197. package/cjs/modules/utils/utils.module.js +0 -32
  198. package/cjs/modules/utils/utils.service.js +0 -76
  199. package/cjs/modules/utils/utils.service.spec.js +0 -169
  200. package/cjs/utils/date-time.util.js +0 -94
  201. package/cjs/utils/date-time.util.spec.js +0 -84
  202. package/cjs/utils/event-pattern.util.js +0 -103
  203. package/cjs/utils/event-pattern.util.spec.js +0 -251
  204. package/cjs/utils/html-sanitizer.util.js +0 -64
  205. package/cjs/utils/html-sanitizer.util.spec.js +0 -76
  206. package/cjs/utils/index.js +0 -25
  207. package/cjs/utils/optional-module.util.js +0 -35
  208. package/cjs/utils/optional-module.util.spec.js +0 -14
  209. package/cjs/utils/permission-cache-key.util.js +0 -31
  210. package/cjs/utils/permission-cache-key.util.spec.js +0 -88
  211. package/cjs/utils/query-helpers.util.js +0 -60
  212. package/cjs/utils/query-helpers.util.spec.js +0 -209
  213. package/cjs/utils/request.util.js +0 -96
  214. package/cjs/utils/request.util.spec.js +0 -249
  215. package/cjs/utils/string.util.js +0 -63
  216. package/cjs/utils/string.util.spec.js +0 -63
  217. package/fesm/classes/api-controller.class.js +0 -718
  218. package/fesm/classes/api-controller.class.spec.js +0 -680
  219. package/fesm/classes/api-service.class.js +0 -621
  220. package/fesm/classes/api-service.class.spec.js +0 -1133
  221. package/fesm/classes/disabled-event-bus.class.js +0 -11
  222. package/fesm/classes/disabled-event-bus.class.spec.js +0 -36
  223. package/fesm/classes/domain-event.publisher.js +0 -63
  224. package/fesm/classes/domain-event.publisher.spec.js +0 -230
  225. package/fesm/classes/event-bus.registry.js +0 -64
  226. package/fesm/classes/event-bus.registry.spec.js +0 -137
  227. package/fesm/classes/event-transports/event-transport.registry.js +0 -35
  228. package/fesm/classes/event-transports/event-transport.registry.spec.js +0 -27
  229. package/fesm/classes/event-transports/index.js +0 -6
  230. package/fesm/classes/event-transports/kafka-transport.optional.spec.js +0 -194
  231. package/fesm/classes/event-transports/memory-transport.js +0 -49
  232. package/fesm/classes/event-transports/memory-transport.spec.js +0 -53
  233. package/fesm/classes/event-transports/rabbitmq-transport.optional.js +0 -174
  234. package/fesm/classes/event-transports/rabbitmq-transport.optional.spec.js +0 -251
  235. package/fesm/classes/handle-custome-db.js +0 -19
  236. package/fesm/classes/handle-custome-db.spec.js +0 -78
  237. package/fesm/classes/hybrid-cache.class.js +0 -81
  238. package/fesm/classes/hybrid-cache.class.spec.js +0 -164
  239. package/fesm/classes/hybrid-event-bus.class.js +0 -237
  240. package/fesm/classes/hybrid-event-bus.class.spec.js +0 -214
  241. package/fesm/classes/winston.logger.class.js +0 -228
  242. package/fesm/classes/winston.logger.class.spec.js +0 -327
  243. package/fesm/constants/message-keys.js +0 -49
  244. package/fesm/constants/permissions.js +0 -215
  245. package/fesm/decorators/api-response.decorator.js +0 -42
  246. package/fesm/decorators/api-response.decorator.spec.js +0 -122
  247. package/fesm/decorators/current-user.decorator.js +0 -18
  248. package/fesm/decorators/current-user.decorator.spec.js +0 -73
  249. package/fesm/decorators/log-action.decorator.js +0 -139
  250. package/fesm/decorators/log-action.decorator.spec.js +0 -349
  251. package/fesm/decorators/on-domain-event.decorator.js +0 -10
  252. package/fesm/decorators/on-domain-event.decorator.spec.js +0 -46
  253. package/fesm/decorators/public.decorator.js +0 -20
  254. package/fesm/decorators/public.decorator.spec.js +0 -46
  255. package/fesm/decorators/require-permission.decorator.js +0 -27
  256. package/fesm/decorators/require-permission.decorator.spec.js +0 -143
  257. package/fesm/dtos/delete.dto.js +0 -82
  258. package/fesm/dtos/filter-and-pagination.dto.js +0 -148
  259. package/fesm/dtos/get-by-ids.dto.js +0 -55
  260. package/fesm/dtos/identity-response.dto.js +0 -98
  261. package/fesm/dtos/pagination.dto.js +0 -57
  262. package/fesm/dtos/response-payload.dto.js +0 -336
  263. package/fesm/entities/identity.js +0 -90
  264. package/fesm/entities/raw-type.js +0 -1
  265. package/fesm/entities/user-root.js +0 -179
  266. package/fesm/enums/notification-type.enum.js +0 -7
  267. package/fesm/enums/participant-status.enum.js +0 -7
  268. package/fesm/enums/recurrence-type.enum.js +0 -8
  269. package/fesm/exceptions/base-app.exception.js +0 -115
  270. package/fesm/exceptions/base-app.exception.spec.js +0 -153
  271. package/fesm/exceptions/permission.exception.js +0 -35
  272. package/fesm/exceptions/permission.exception.spec.js +0 -78
  273. package/fesm/filters/global-exception.filter.js +0 -269
  274. package/fesm/filters/global-exception.filter.spec.js +0 -436
  275. package/fesm/filters/index.js +0 -1
  276. package/fesm/guards/jwt-auth.guard.js +0 -65
  277. package/fesm/guards/jwt-auth.guard.spec.js +0 -71
  278. package/fesm/guards/optional-jwt-auth.guard.js +0 -57
  279. package/fesm/guards/optional-jwt-auth.guard.spec.js +0 -51
  280. package/fesm/guards/permission.guard.js +0 -169
  281. package/fesm/guards/permission.guard.spec.js +0 -369
  282. package/fesm/interceptors/delete-empty-id-from-body.interceptor.js +0 -30
  283. package/fesm/interceptors/delete-empty-id-from-body.interceptor.spec.js +0 -103
  284. package/fesm/interceptors/idempotency.interceptor.js +0 -86
  285. package/fesm/interceptors/idempotency.interceptor.spec.js +0 -112
  286. package/fesm/interceptors/response-meta.interceptor.js +0 -37
  287. package/fesm/interceptors/response-meta.interceptor.spec.js +0 -85
  288. package/fesm/interceptors/set-user-field-on-body.interceptor.js +0 -39
  289. package/fesm/interceptors/set-user-field-on-body.interceptor.spec.js +0 -124
  290. package/fesm/interceptors/slug.interceptor.js +0 -65
  291. package/fesm/interceptors/slug.interceptor.spec.js +0 -106
  292. package/fesm/interfaces/ai-assistant-adapter.interface.js +0 -3
  293. package/fesm/interfaces/api.interface.js +0 -1
  294. package/fesm/interfaces/datasource.interface.js +0 -1
  295. package/fesm/interfaces/event-bus.interface.js +0 -1
  296. package/fesm/interfaces/event-manager-adapter.interface.js +0 -1
  297. package/fesm/interfaces/identity.interface.js +0 -1
  298. package/fesm/interfaces/logged-user-info.interface.js +0 -3
  299. package/fesm/interfaces/module-config.interface.js +0 -5
  300. package/fesm/interfaces/notification-adapter.interface.js +0 -1
  301. package/fesm/interfaces/permission-sync-adapter.interface.js +0 -1
  302. package/fesm/interfaces/permission.interface.js +0 -1
  303. package/fesm/middlewares/logger.middleware.js +0 -235
  304. package/fesm/middlewares/logger.middleware.spec.js +0 -459
  305. package/fesm/modules/cache/cache.module.js +0 -29
  306. package/fesm/modules/cache/cache.module.spec.js +0 -44
  307. package/fesm/modules/datasource/index.js +0 -1
  308. package/fesm/modules/datasource/multi-tenant-datasource.service.js +0 -212
  309. package/fesm/modules/datasource/multi-tenant-datasource.service.spec.js +0 -377
  310. package/fesm/modules/event-bus/event-bus.explorer.js +0 -114
  311. package/fesm/modules/event-bus/event-bus.explorer.spec.js +0 -185
  312. package/fesm/modules/event-bus/event-bus.integration.spec.js +0 -249
  313. package/fesm/modules/event-bus/event-bus.module.js +0 -84
  314. package/fesm/modules/event-bus/event-bus.module.spec.js +0 -145
  315. package/fesm/modules/event-bus/module-events.provider.js +0 -26
  316. package/fesm/modules/event-bus/module-events.provider.spec.js +0 -52
  317. package/fesm/modules/shared-permission-cache/shared-permission-cache.module.js +0 -22
  318. package/fesm/modules/shared-permission-cache/shared-permission-cache.service.js +0 -91
  319. package/fesm/modules/shared-permission-cache/shared-permission-cache.service.spec.js +0 -161
  320. package/fesm/modules/utils/utils.module.js +0 -22
  321. package/fesm/modules/utils/utils.service.js +0 -66
  322. package/fesm/modules/utils/utils.service.spec.js +0 -165
  323. package/fesm/utils/date-time.util.js +0 -70
  324. package/fesm/utils/date-time.util.spec.js +0 -80
  325. package/fesm/utils/event-pattern.util.js +0 -91
  326. package/fesm/utils/event-pattern.util.spec.js +0 -247
  327. package/fesm/utils/html-sanitizer.util.js +0 -69
  328. package/fesm/utils/html-sanitizer.util.spec.js +0 -72
  329. package/fesm/utils/optional-module.util.js +0 -25
  330. package/fesm/utils/optional-module.util.spec.js +0 -10
  331. package/fesm/utils/permission-cache-key.util.js +0 -10
  332. package/fesm/utils/permission-cache-key.util.spec.js +0 -84
  333. package/fesm/utils/query-helpers.util.js +0 -85
  334. package/fesm/utils/query-helpers.util.spec.js +0 -205
  335. package/fesm/utils/request.util.js +0 -81
  336. package/fesm/utils/request.util.spec.js +0 -245
  337. package/fesm/utils/string.util.js +0 -71
  338. package/fesm/utils/string.util.spec.js +0 -59
@@ -1,684 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- require("reflect-metadata");
6
- const _classtransformer = require("class-transformer");
7
- const _common = require("@nestjs/common");
8
- const _apicontrollerclass = require("./api-controller.class");
9
- const _entities = require("../entities");
10
- const _exceptions = require("../exceptions");
11
- const _constants = require("../constants");
12
- const _loggedusermock = require("@test-utils/mocks/logged-user.mock");
13
- function _define_property(obj, key, value) {
14
- if (key in obj) {
15
- Object.defineProperty(obj, key, {
16
- value: value,
17
- enumerable: true,
18
- configurable: true,
19
- writable: true
20
- });
21
- } else {
22
- obj[key] = value;
23
- }
24
- return obj;
25
- }
26
- function _ts_decorate(decorators, target, key, desc) {
27
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
28
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
29
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
30
- return c > 3 && r && Object.defineProperty(target, key, r), r;
31
- }
32
- function _ts_metadata(k, v) {
33
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
34
- }
35
- const GUARDS_METADATA = '__guards__';
36
- const API_EXCLUDE_ENDPOINT_METADATA = 'swagger/apiExcludeEndpoint';
37
- function guardNames(target, method) {
38
- const guards = Reflect.getMetadata(GUARDS_METADATA, target.prototype[method]) ?? [];
39
- return guards.map((g)=>g.name);
40
- }
41
- let ProductEntity = class ProductEntity extends _entities.Identity {
42
- constructor(...args){
43
- super(...args), _define_property(this, "name", void 0), _define_property(this, "secret", void 0);
44
- }
45
- };
46
- let CreateProductDto = class CreateProductDto {
47
- constructor(){
48
- _define_property(this, "name", void 0);
49
- }
50
- };
51
- let UpdateProductDto = class UpdateProductDto {
52
- constructor(){
53
- _define_property(this, "id", void 0);
54
- _define_property(this, "name", void 0);
55
- }
56
- };
57
- let ProductResponseDto = class ProductResponseDto {
58
- constructor(){
59
- _define_property(this, "id", void 0);
60
- _define_property(this, "name", void 0);
61
- }
62
- };
63
- _ts_decorate([
64
- (0, _classtransformer.Expose)(),
65
- _ts_metadata("design:type", String)
66
- ], ProductResponseDto.prototype, "id", void 0);
67
- _ts_decorate([
68
- (0, _classtransformer.Expose)(),
69
- _ts_metadata("design:type", String)
70
- ], ProductResponseDto.prototype, "name", void 0);
71
- function makeController(options = {}) {
72
- const ControllerClass = (0, _apicontrollerclass.createApiController)(CreateProductDto, UpdateProductDto, ProductResponseDto, options);
73
- const mockService = {
74
- insert: jest.fn(),
75
- insertMany: jest.fn(),
76
- findById: jest.fn(),
77
- findByIds: jest.fn(),
78
- update: jest.fn(),
79
- updateMany: jest.fn(),
80
- bulkUpsert: jest.fn(),
81
- getAll: jest.fn(),
82
- delete: jest.fn()
83
- };
84
- const controller = new ControllerClass(mockService);
85
- return {
86
- controller,
87
- mockService,
88
- ControllerClass
89
- };
90
- }
91
- describe('createApiController', ()=>{
92
- const mockUser = (0, _loggedusermock.buildMockUser)();
93
- describe('isEnabled', ()=>{
94
- it('should treat every endpoint as enabled by default', ()=>{
95
- const { controller } = makeController();
96
- expect(controller.isEnabled('insert')).toBe(true);
97
- expect(controller.isEnabled('delete')).toBe(true);
98
- });
99
- it('should only enable the endpoints explicitly listed', ()=>{
100
- const { controller } = makeController({
101
- enabledEndpoints: [
102
- 'getById'
103
- ]
104
- });
105
- expect(controller.isEnabled('getById')).toBe(true);
106
- expect(controller.isEnabled('insert')).toBe(false);
107
- });
108
- });
109
- describe('insert', ()=>{
110
- it('should return a success response with the converted dto', async ()=>{
111
- const { controller, mockService } = makeController();
112
- mockService.insert.mockResolvedValue({
113
- id: '1',
114
- name: 'Widget',
115
- secret: 'shh'
116
- });
117
- const result = await controller.insert({
118
- name: 'Widget'
119
- }, mockUser);
120
- expect(result.success).toBe(true);
121
- expect(result.messageKey).toBe('item.create.success');
122
- expect(result.message).toBe('Item created successfully');
123
- expect(result.data).toEqual({
124
- id: '1',
125
- name: 'Widget'
126
- });
127
- });
128
- it('should strip fields without @Expose() by default (excludeExtraneousValues)', async ()=>{
129
- const { controller, mockService } = makeController();
130
- mockService.insert.mockResolvedValue({
131
- id: '1',
132
- name: 'Widget',
133
- secret: 'shh'
134
- });
135
- const result = await controller.insert({
136
- name: 'Widget'
137
- }, mockUser);
138
- expect(result.data.secret).toBeUndefined();
139
- });
140
- it('should keep all fields when excludeExtraneousValues is false', async ()=>{
141
- const { controller, mockService } = makeController({
142
- excludeExtraneousValues: false
143
- });
144
- mockService.insert.mockResolvedValue({
145
- id: '1',
146
- name: 'Widget',
147
- secret: 'shh'
148
- });
149
- const result = await controller.insert({
150
- name: 'Widget'
151
- }, mockUser);
152
- expect(result.data.secret).toBe('shh');
153
- });
154
- it('should use the configured entityName in message/messageKey', async ()=>{
155
- const { controller, mockService } = makeController({
156
- entityName: 'product'
157
- });
158
- mockService.insert.mockResolvedValue({
159
- id: '1',
160
- name: 'Widget'
161
- });
162
- const result = await controller.insert({
163
- name: 'Widget'
164
- }, mockUser);
165
- expect(result.message).toBe('Product created successfully');
166
- expect(result.messageKey).toBe('product.create.success');
167
- });
168
- it('should throw a 403 BaseAppException when insert is disabled', async ()=>{
169
- const { controller } = makeController({
170
- enabledEndpoints: [
171
- 'getById'
172
- ]
173
- });
174
- await expect(controller.insert({
175
- name: 'Widget'
176
- }, mockUser)).rejects.toMatchObject({
177
- message: expect.stringContaining("'insert' is disabled")
178
- });
179
- try {
180
- await controller.insert({
181
- name: 'Widget'
182
- }, mockUser);
183
- fail('expected throw');
184
- } catch (e) {
185
- expect(e).toBeInstanceOf(_exceptions.BaseAppException);
186
- expect(e.getStatus()).toBe(_common.HttpStatus.FORBIDDEN);
187
- }
188
- });
189
- });
190
- describe('insertMany', ()=>{
191
- it('should return bulk meta counting successes and failures', async ()=>{
192
- const { controller, mockService } = makeController();
193
- mockService.insertMany.mockResolvedValue([
194
- {
195
- id: '1',
196
- name: 'A'
197
- }
198
- ]);
199
- const result = await controller.insertMany([
200
- {
201
- name: 'A'
202
- },
203
- {
204
- name: 'B'
205
- }
206
- ], mockUser);
207
- expect(result.data).toHaveLength(1);
208
- expect(result.meta).toEqual({
209
- count: 1,
210
- total: 2,
211
- failed: 1
212
- });
213
- });
214
- });
215
- describe('getById', ()=>{
216
- it('should return the converted entity', async ()=>{
217
- const { controller, mockService } = makeController();
218
- mockService.findById.mockResolvedValue({
219
- id: '1',
220
- name: 'Widget'
221
- });
222
- const result = await controller.getById('1', {
223
- select: [
224
- 'name'
225
- ]
226
- }, mockUser);
227
- expect(mockService.findById).toHaveBeenCalledWith('1', mockUser, [
228
- 'name'
229
- ]);
230
- expect(result.data).toEqual({
231
- id: '1',
232
- name: 'Widget'
233
- });
234
- });
235
- it('should throw a 403 when getById is disabled', async ()=>{
236
- const { controller } = makeController({
237
- enabledEndpoints: []
238
- });
239
- await expect(controller.getById('1', {}, mockUser)).rejects.toBeInstanceOf(_exceptions.BaseAppException);
240
- });
241
- });
242
- describe('getByIds', ()=>{
243
- it('should return correct pluralization and meta for multiple items', async ()=>{
244
- const { controller, mockService } = makeController();
245
- mockService.findByIds.mockResolvedValue([
246
- {
247
- id: '1',
248
- name: 'A'
249
- },
250
- {
251
- id: '2',
252
- name: 'B'
253
- }
254
- ]);
255
- const result = await controller.getByIds({
256
- ids: [
257
- '1',
258
- '2'
259
- ]
260
- }, mockUser);
261
- expect(result.message).toBe('2 items retrieved successfully');
262
- expect(result.meta).toEqual({
263
- total: 2,
264
- page: 0,
265
- pageSize: 2,
266
- count: 2,
267
- totalPages: 1
268
- });
269
- });
270
- it('should use singular wording for exactly one item', async ()=>{
271
- const { controller, mockService } = makeController();
272
- mockService.findByIds.mockResolvedValue([
273
- {
274
- id: '1',
275
- name: 'A'
276
- }
277
- ]);
278
- const result = await controller.getByIds({
279
- ids: [
280
- '1'
281
- ]
282
- }, mockUser);
283
- expect(result.message).toBe('1 item retrieved successfully');
284
- });
285
- });
286
- describe('update / updateMany', ()=>{
287
- it('update should return the updated entity', async ()=>{
288
- const { controller, mockService } = makeController();
289
- mockService.update.mockResolvedValue({
290
- id: '1',
291
- name: 'Updated'
292
- });
293
- const result = await controller.update({
294
- id: '1',
295
- name: 'Updated'
296
- }, mockUser);
297
- expect(result.data).toEqual({
298
- id: '1',
299
- name: 'Updated'
300
- });
301
- expect(result.messageKey).toBe('item.update.success');
302
- });
303
- it('updateMany should report per-item failure counts', async ()=>{
304
- const { controller, mockService } = makeController();
305
- mockService.updateMany.mockResolvedValue([
306
- {
307
- id: '1',
308
- name: 'A'
309
- }
310
- ]);
311
- const result = await controller.updateMany([
312
- {
313
- id: '1',
314
- name: 'A'
315
- },
316
- {
317
- id: '2',
318
- name: 'B'
319
- }
320
- ], mockUser);
321
- expect(result.meta).toEqual({
322
- count: 1,
323
- total: 2,
324
- failed: 1
325
- });
326
- });
327
- });
328
- describe('bulkUpsert', ()=>{
329
- it('should split dtos into insert/update sets based on a truthy id', async ()=>{
330
- const { controller, mockService } = makeController();
331
- mockService.bulkUpsert.mockResolvedValue([
332
- {
333
- id: '1',
334
- name: 'A'
335
- }
336
- ]);
337
- await controller.bulkUpsert([
338
- {
339
- name: 'NoId'
340
- },
341
- {
342
- id: '',
343
- name: 'EmptyId'
344
- },
345
- {
346
- id: 'x-1',
347
- name: 'HasId'
348
- }
349
- ], mockUser);
350
- expect(mockService.bulkUpsert).toHaveBeenCalledWith([
351
- {
352
- name: 'NoId'
353
- },
354
- {
355
- id: '',
356
- name: 'EmptyId'
357
- }
358
- ], [
359
- {
360
- id: 'x-1',
361
- name: 'HasId'
362
- }
363
- ], mockUser);
364
- });
365
- });
366
- describe('getByFilter', ()=>{
367
- it('should query getAll with a single-item page and return the first match', async ()=>{
368
- const { controller, mockService } = makeController();
369
- mockService.getAll.mockResolvedValue({
370
- data: [
371
- {
372
- id: '1',
373
- name: 'A'
374
- }
375
- ],
376
- total: 1
377
- });
378
- const result = await controller.getByFilter({
379
- name: 'A'
380
- }, mockUser);
381
- expect(mockService.getAll).toHaveBeenCalledWith('', {
382
- filter: {
383
- name: 'A'
384
- },
385
- pagination: {
386
- currentPage: 0,
387
- pageSize: 1
388
- }
389
- }, mockUser);
390
- expect(result.data).toEqual({
391
- id: '1',
392
- name: 'A'
393
- });
394
- });
395
- it('should throw NotFoundException when nothing matches the filter', async ()=>{
396
- const { controller, mockService } = makeController();
397
- mockService.getAll.mockResolvedValue({
398
- data: [],
399
- total: 0
400
- });
401
- await expect(controller.getByFilter({
402
- name: 'ghost'
403
- }, mockUser)).rejects.toThrow(_exceptions.NotFoundException);
404
- });
405
- });
406
- describe('getAll', ()=>{
407
- it('should compute pagination meta with hasMore=true when more pages remain', async ()=>{
408
- const { controller, mockService } = makeController();
409
- mockService.getAll.mockResolvedValue({
410
- data: [
411
- {
412
- id: '1',
413
- name: 'A'
414
- }
415
- ],
416
- total: 25
417
- });
418
- const result = await controller.getAll({
419
- pagination: {
420
- currentPage: 0,
421
- pageSize: 10
422
- }
423
- }, mockUser);
424
- expect(result.meta).toEqual({
425
- total: 25,
426
- page: 0,
427
- pageSize: 10,
428
- count: 1,
429
- hasMore: true,
430
- totalPages: 3
431
- });
432
- });
433
- it('should compute hasMore=false on the last page', async ()=>{
434
- const { controller, mockService } = makeController();
435
- mockService.getAll.mockResolvedValue({
436
- data: [
437
- {
438
- id: '3',
439
- name: 'C'
440
- }
441
- ],
442
- total: 25
443
- });
444
- const result = await controller.getAll({
445
- pagination: {
446
- currentPage: 2,
447
- pageSize: 10
448
- }
449
- }, mockUser);
450
- expect(result.meta.hasMore).toBe(false);
451
- expect(result.meta.totalPages).toBe(3);
452
- });
453
- it('should default page/pageSize and force totalPages=1 when no pagination is supplied', async ()=>{
454
- const { controller, mockService } = makeController();
455
- mockService.getAll.mockResolvedValue({
456
- data: [
457
- {
458
- id: '1',
459
- name: 'A'
460
- },
461
- {
462
- id: '2',
463
- name: 'B'
464
- }
465
- ],
466
- total: 2
467
- });
468
- const result = await controller.getAll({}, mockUser);
469
- expect(result.meta.page).toBe(0);
470
- expect(result.meta.pageSize).toBe(2);
471
- expect(result.meta.totalPages).toBe(1);
472
- });
473
- it('should forward the search query param to the service', async ()=>{
474
- const { controller, mockService } = makeController();
475
- mockService.getAll.mockResolvedValue({
476
- data: [],
477
- total: 0
478
- });
479
- await controller.getAll({}, mockUser, 'widget');
480
- expect(mockService.getAll).toHaveBeenCalledWith('widget', {}, mockUser);
481
- });
482
- it('should default search to an empty string when the q param is absent', async ()=>{
483
- const { controller, mockService } = makeController();
484
- mockService.getAll.mockResolvedValue({
485
- data: [],
486
- total: 0
487
- });
488
- await controller.getAll({}, mockUser);
489
- expect(mockService.getAll).toHaveBeenCalledWith('', {}, mockUser);
490
- });
491
- });
492
- describe('delete', ()=>{
493
- it('should report singular deletion for one id', async ()=>{
494
- const { controller, mockService } = makeController();
495
- mockService.delete.mockResolvedValue(null);
496
- const result = await controller.delete({
497
- id: '1',
498
- type: 'delete'
499
- }, mockUser);
500
- expect(result.message).toBe('1 item deleted successfully');
501
- expect(result.messageKey).toBe('item.delete.success');
502
- expect(result.messageVariables).toEqual({
503
- count: 1
504
- });
505
- });
506
- it('should report plural deletion for multiple ids', async ()=>{
507
- const { controller, mockService } = makeController();
508
- mockService.delete.mockResolvedValue(null);
509
- const result = await controller.delete({
510
- id: [
511
- '1',
512
- '2',
513
- '3'
514
- ],
515
- type: 'permanent'
516
- }, mockUser);
517
- expect(result.message).toBe('3 items deleted successfully');
518
- });
519
- it('should label the action "restore" (not delete) for type=restore', async ()=>{
520
- const { controller, mockService } = makeController();
521
- mockService.delete.mockResolvedValue(null);
522
- const result = await controller.delete({
523
- id: [
524
- '1',
525
- '2'
526
- ],
527
- type: 'restore'
528
- }, mockUser);
529
- expect(result.message).toBe('2 items restored successfully');
530
- expect(result.messageKey).toBe('item.restore.success');
531
- });
532
- it('should throw a 403 when delete is disabled', async ()=>{
533
- const { controller } = makeController({
534
- enabledEndpoints: [
535
- 'getById'
536
- ]
537
- });
538
- await expect(controller.delete({
539
- id: '1',
540
- type: 'delete'
541
- }, mockUser)).rejects.toBeInstanceOf(_exceptions.BaseAppException);
542
- });
543
- });
544
- describe('security configuration', ()=>{
545
- it('should default every endpoint to public when no security option is given at all', ()=>{
546
- const { ControllerClass } = makeController();
547
- expect(Reflect.getMetadata(_constants.IS_PUBLIC_KEY, ControllerClass.prototype.insert)).toBe(true);
548
- expect(Reflect.getMetadata(_constants.IS_PUBLIC_KEY, ControllerClass.prototype.delete)).toBe(true);
549
- expect(guardNames(ControllerClass, 'insert')).toEqual([]);
550
- });
551
- it('should apply JwtAuthGuard + ApiBearerAuth to every endpoint for global "jwt" security', ()=>{
552
- const { ControllerClass } = makeController({
553
- security: 'jwt'
554
- });
555
- expect(guardNames(ControllerClass, 'insert')).toEqual([
556
- 'JwtAuthGuard'
557
- ]);
558
- expect(guardNames(ControllerClass, 'delete')).toEqual([
559
- 'JwtAuthGuard'
560
- ]);
561
- expect(Reflect.getMetadata(_constants.IS_PUBLIC_KEY, ControllerClass.prototype.insert)).toBeUndefined();
562
- });
563
- it('should apply JwtAuthGuard + PermissionGuard and AND-logic permissions by default', ()=>{
564
- const { ControllerClass } = makeController({
565
- security: {
566
- level: 'permission',
567
- permissions: [
568
- 'product.create'
569
- ]
570
- }
571
- });
572
- expect(guardNames(ControllerClass, 'insert')).toEqual([
573
- 'JwtAuthGuard',
574
- 'PermissionGuard'
575
- ]);
576
- expect(Reflect.getMetadata(_constants.PERMISSIONS_KEY, ControllerClass.prototype.insert)).toEqual({
577
- permissions: [
578
- 'product.create'
579
- ],
580
- operator: 'AND'
581
- });
582
- });
583
- it('should use OR-logic permissions when operator is "OR"', ()=>{
584
- const { ControllerClass } = makeController({
585
- security: {
586
- level: 'permission',
587
- permissions: [
588
- 'a',
589
- 'b'
590
- ],
591
- operator: 'OR'
592
- }
593
- });
594
- expect(Reflect.getMetadata(_constants.PERMISSIONS_KEY, ControllerClass.prototype.insert)).toEqual({
595
- permissions: [
596
- 'a',
597
- 'b'
598
- ],
599
- operator: 'OR'
600
- });
601
- });
602
- it('should prefer complex `logic` over `permissions`/`operator` when both are given', ()=>{
603
- const logic = {
604
- type: 'action',
605
- actionId: 'product.create'
606
- };
607
- const { ControllerClass } = makeController({
608
- security: {
609
- level: 'permission',
610
- permissions: [
611
- 'ignored'
612
- ],
613
- logic: logic
614
- }
615
- });
616
- expect(Reflect.getMetadata(_constants.PERMISSIONS_KEY, ControllerClass.prototype.insert)).toEqual(logic);
617
- });
618
- it('should apply no permission decorator when permission level has neither logic nor permissions', ()=>{
619
- const { ControllerClass } = makeController({
620
- security: {
621
- level: 'permission'
622
- }
623
- });
624
- expect(guardNames(ControllerClass, 'insert')).toEqual([
625
- 'JwtAuthGuard',
626
- 'PermissionGuard'
627
- ]);
628
- expect(Reflect.getMetadata(_constants.PERMISSIONS_KEY, ControllerClass.prototype.insert)).toBeUndefined();
629
- });
630
- it('should apply per-endpoint security for configured endpoints', ()=>{
631
- const { ControllerClass } = makeController({
632
- security: {
633
- insert: 'public',
634
- delete: {
635
- level: 'permission',
636
- permissions: [
637
- 'x.delete'
638
- ]
639
- }
640
- }
641
- });
642
- expect(Reflect.getMetadata(_constants.IS_PUBLIC_KEY, ControllerClass.prototype.insert)).toBe(true);
643
- expect(guardNames(ControllerClass, 'delete')).toEqual([
644
- 'JwtAuthGuard',
645
- 'PermissionGuard'
646
- ]);
647
- });
648
- // KNOWN GAP: the `defaultSecurity = { level: 'jwt' }` fallback (api-controller.class.ts
649
- // lines 230-232) is dead code. It is only ever assigned to endpoints when `isGlobalSecurity`
650
- // is true, in which case every endpoint already shares the same global config anyway. In
651
- // per-endpoint mode (or when no `security` option is passed at all), each endpoint's security
652
- // is resolved independently via `normalizeSecurity(securityConfig?.<endpoint>)`, and
653
- // `normalizeSecurity(undefined)` returns `{ level: 'public' }` -- not the intended 'jwt'
654
- // fallback described in the source comment. This means any endpoint omitted from a
655
- // per-endpoint `security` config (or the config itself) is silently PUBLIC. Pin the current
656
- // (buggy) behavior here so a fix is visible as an intentional test change, not a silent one.
657
- it('BUG: leaves endpoints unconfigured in per-endpoint mode PUBLIC instead of defaulting to jwt', ()=>{
658
- const { ControllerClass } = makeController({
659
- security: {
660
- insert: 'public',
661
- delete: {
662
- level: 'permission',
663
- permissions: [
664
- 'x.delete'
665
- ]
666
- }
667
- }
668
- });
669
- expect(Reflect.getMetadata(_constants.IS_PUBLIC_KEY, ControllerClass.prototype.getAll)).toBe(true);
670
- expect(guardNames(ControllerClass, 'getAll')).toEqual([]);
671
- });
672
- it('should mark disabled endpoints with ApiExcludeEndpoint', ()=>{
673
- const { ControllerClass } = makeController({
674
- enabledEndpoints: [
675
- 'getById'
676
- ]
677
- });
678
- expect(Reflect.getMetadata(API_EXCLUDE_ENDPOINT_METADATA, ControllerClass.prototype.insert)).toEqual({
679
- disable: true
680
- });
681
- expect(Reflect.getMetadata(API_EXCLUDE_ENDPOINT_METADATA, ControllerClass.prototype.getById)).toBeUndefined();
682
- });
683
- });
684
- });