@nest-omni/core 4.1.3-3 → 4.1.3-31

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 (370) hide show
  1. package/audit/audit.module.d.ts +1 -0
  2. package/audit/audit.module.js +51 -2
  3. package/audit/controllers/audit.controller.d.ts +57 -1
  4. package/audit/controllers/audit.controller.js +43 -0
  5. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  6. package/audit/decorators/audit-action.decorator.js +42 -0
  7. package/audit/decorators/audit-controller.decorator.d.ts +1 -1
  8. package/audit/decorators/audit-controller.decorator.js +2 -2
  9. package/audit/decorators/audit-operation.decorator.d.ts +0 -7
  10. package/audit/decorators/audit-operation.decorator.js +0 -7
  11. package/audit/decorators/entity-audit.decorator.d.ts +78 -2
  12. package/audit/decorators/entity-audit.decorator.js +145 -4
  13. package/audit/decorators/index.d.ts +2 -0
  14. package/audit/decorators/index.js +2 -0
  15. package/audit/dto/audit-action-query.dto.d.ts +13 -0
  16. package/audit/dto/audit-action-query.dto.js +77 -0
  17. package/audit/dto/index.d.ts +1 -0
  18. package/audit/dto/index.js +1 -0
  19. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  20. package/audit/entities/audit-action-summary.entity.js +101 -0
  21. package/audit/entities/entity-audit-log.entity.d.ts +7 -2
  22. package/audit/entities/entity-audit-log.entity.js +45 -9
  23. package/audit/entities/entity-transaction.entity.d.ts +8 -2
  24. package/audit/entities/entity-transaction.entity.js +39 -3
  25. package/audit/entities/index.d.ts +3 -0
  26. package/audit/entities/index.js +3 -0
  27. package/audit/entities/manual-operation-log.entity.d.ts +0 -2
  28. package/audit/entities/manual-operation-log.entity.js +8 -9
  29. package/audit/enums/audit.enums.d.ts +14 -6
  30. package/audit/enums/audit.enums.js +18 -9
  31. package/audit/examples/decorator-value-mapping.example.d.ts +70 -0
  32. package/audit/examples/decorator-value-mapping.example.js +414 -0
  33. package/audit/index.d.ts +5 -1
  34. package/audit/index.js +29 -2
  35. package/audit/interceptors/audit-action.interceptor.d.ts +39 -0
  36. package/audit/interceptors/audit-action.interceptor.js +217 -0
  37. package/audit/interceptors/audit.interceptor.d.ts +1 -0
  38. package/audit/interceptors/audit.interceptor.js +19 -11
  39. package/audit/interceptors/index.d.ts +1 -0
  40. package/audit/interceptors/index.js +1 -0
  41. package/audit/interfaces/audit.interfaces.d.ts +132 -4
  42. package/audit/services/audit-action.service.d.ts +142 -0
  43. package/audit/services/audit-action.service.js +246 -0
  44. package/audit/services/audit-context.service.d.ts +91 -0
  45. package/audit/services/audit-context.service.js +170 -0
  46. package/audit/services/entity-audit.service.d.ts +220 -9
  47. package/audit/services/entity-audit.service.js +761 -72
  48. package/audit/services/index.d.ts +3 -0
  49. package/audit/services/index.js +3 -0
  50. package/audit/services/manual-audit-log.service.d.ts +23 -23
  51. package/audit/services/manual-audit-log.service.js +34 -57
  52. package/audit/services/multi-database.service.d.ts +0 -5
  53. package/audit/services/multi-database.service.js +0 -24
  54. package/audit/services/operation-description.service.d.ts +14 -3
  55. package/audit/services/operation-description.service.js +165 -26
  56. package/audit/services/transaction-audit.service.d.ts +1 -0
  57. package/audit/services/transaction-audit.service.js +12 -9
  58. package/audit/subscribers/entity-audit.subscriber.d.ts +5 -0
  59. package/audit/subscribers/entity-audit.subscriber.js +69 -5
  60. package/cache/cache.module.d.ts +7 -8
  61. package/cache/cache.module.js +15 -13
  62. package/cache/cache.service.d.ts +6 -4
  63. package/cache/cache.service.js +24 -12
  64. package/cache/decorators/cache-put.decorator.js +5 -4
  65. package/cache/dependencies/callback.dependency.js +9 -0
  66. package/cache/dependencies/db.dependency.d.ts +43 -12
  67. package/cache/dependencies/db.dependency.js +46 -18
  68. package/cache/dependencies/tag.dependency.d.ts +31 -4
  69. package/cache/dependencies/tag.dependency.js +100 -11
  70. package/cache/entities/index.d.ts +1 -0
  71. package/cache/entities/index.js +17 -0
  72. package/cache/entities/typeorm-cache.entity.d.ts +71 -0
  73. package/cache/entities/typeorm-cache.entity.js +110 -0
  74. package/cache/index.d.ts +2 -1
  75. package/cache/index.js +19 -2
  76. package/cache/interfaces/cache-options.interface.d.ts +8 -0
  77. package/cache/providers/index.d.ts +2 -1
  78. package/cache/providers/index.js +2 -1
  79. package/cache/providers/lrucache.provider.d.ts +77 -0
  80. package/cache/providers/lrucache.provider.js +228 -0
  81. package/cache/providers/redis-cache.provider.d.ts +1 -0
  82. package/cache/providers/redis-cache.provider.js +8 -6
  83. package/cache/providers/typeorm-cache.provider.d.ts +211 -0
  84. package/cache/providers/typeorm-cache.provider.js +483 -0
  85. package/common/boilerplate.polyfill.d.ts +1 -0
  86. package/common/boilerplate.polyfill.js +18 -1
  87. package/common/helpers/validation-metadata-helper.d.ts +112 -0
  88. package/common/helpers/validation-metadata-helper.js +164 -0
  89. package/common/index.d.ts +1 -0
  90. package/common/index.js +4 -0
  91. package/decorators/examples/field-i18n.example.d.ts +294 -0
  92. package/decorators/examples/field-i18n.example.js +478 -0
  93. package/decorators/field.decorators.d.ts +95 -3
  94. package/decorators/field.decorators.js +152 -18
  95. package/decorators/transform.decorators.d.ts +0 -2
  96. package/decorators/transform.decorators.js +0 -23
  97. package/decorators/translate.decorator.d.ts +26 -0
  98. package/decorators/translate.decorator.js +26 -1
  99. package/email-log/email-log.constants.d.ts +8 -0
  100. package/email-log/email-log.constants.js +11 -0
  101. package/email-log/email-log.module.d.ts +47 -0
  102. package/email-log/email-log.module.js +140 -0
  103. package/email-log/index.d.ts +11 -0
  104. package/email-log/index.js +48 -0
  105. package/email-log/interfaces/email-log-options.interface.d.ts +61 -0
  106. package/email-log/interfaces/email-log-options.interface.js +134 -0
  107. package/email-log/interfaces/email-log-transport.interface.d.ts +20 -0
  108. package/email-log/interfaces/email-log-transport.interface.js +2 -0
  109. package/email-log/interfaces/index.d.ts +2 -0
  110. package/email-log/interfaces/index.js +18 -0
  111. package/email-log/providers/email-provider.d.ts +42 -0
  112. package/email-log/providers/email-provider.js +127 -0
  113. package/email-log/providers/index.d.ts +1 -0
  114. package/email-log/providers/index.js +17 -0
  115. package/email-log/services/email-log-alert.service.d.ts +46 -0
  116. package/email-log/services/email-log-alert.service.js +162 -0
  117. package/email-log/services/email-log-formatter.service.d.ts +78 -0
  118. package/email-log/services/email-log-formatter.service.js +442 -0
  119. package/email-log/services/email-log-logger.service.d.ts +85 -0
  120. package/email-log/services/email-log-logger.service.js +168 -0
  121. package/email-log/services/email-log-rate-limiter.service.d.ts +42 -0
  122. package/email-log/services/email-log-rate-limiter.service.js +110 -0
  123. package/email-log/services/email-log-transport.service.d.ts +80 -0
  124. package/email-log/services/email-log-transport.service.js +271 -0
  125. package/email-log/services/index.d.ts +5 -0
  126. package/email-log/services/index.js +21 -0
  127. package/email-log/transports/index.d.ts +1 -0
  128. package/email-log/transports/index.js +17 -0
  129. package/email-log/transports/pino-email.transport.d.ts +56 -0
  130. package/email-log/transports/pino-email.transport.js +188 -0
  131. package/email-log/utils/index.d.ts +2 -0
  132. package/email-log/utils/index.js +18 -0
  133. package/email-log/utils/log-level.helper.d.ts +46 -0
  134. package/email-log/utils/log-level.helper.js +74 -0
  135. package/email-log/utils/pino-transport.utils.d.ts +135 -0
  136. package/email-log/utils/pino-transport.utils.js +238 -0
  137. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  138. package/file-upload/controllers/file-access.controller.js +128 -0
  139. package/file-upload/decorators/column.decorator.d.ts +151 -0
  140. package/file-upload/decorators/column.decorator.js +273 -0
  141. package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
  142. package/file-upload/decorators/csv-data.decorator.js +85 -0
  143. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  144. package/file-upload/decorators/csv-import.decorator.js +24 -0
  145. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  146. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  147. package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
  148. package/file-upload/decorators/excel-data.decorator.js +85 -0
  149. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  150. package/file-upload/decorators/file-upload.decorator.js +172 -0
  151. package/file-upload/decorators/index.d.ts +5 -0
  152. package/file-upload/decorators/index.js +38 -0
  153. package/file-upload/decorators/process.decorator.d.ts +40 -0
  154. package/file-upload/decorators/process.decorator.js +52 -0
  155. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  156. package/file-upload/decorators/validate-data.decorator.js +39 -0
  157. package/file-upload/dto/create-file.dto.d.ts +24 -0
  158. package/file-upload/dto/create-file.dto.js +112 -0
  159. package/file-upload/dto/find-files.dto.d.ts +15 -0
  160. package/file-upload/dto/find-files.dto.js +76 -0
  161. package/file-upload/dto/index.d.ts +4 -0
  162. package/file-upload/dto/index.js +20 -0
  163. package/file-upload/dto/pagination.dto.d.ts +7 -0
  164. package/file-upload/dto/pagination.dto.js +39 -0
  165. package/file-upload/dto/update-file.dto.d.ts +15 -0
  166. package/file-upload/dto/update-file.dto.js +67 -0
  167. package/file-upload/entities/file-metadata.entity.d.ts +25 -0
  168. package/file-upload/entities/file-metadata.entity.js +76 -0
  169. package/file-upload/entities/file.entity.d.ts +114 -0
  170. package/file-upload/entities/file.entity.js +350 -0
  171. package/file-upload/entities/index.d.ts +2 -0
  172. package/file-upload/entities/index.js +18 -0
  173. package/file-upload/enums/file-type.enum.d.ts +72 -0
  174. package/file-upload/enums/file-type.enum.js +212 -0
  175. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  176. package/file-upload/exceptions/file-upload.exception.js +120 -0
  177. package/file-upload/exceptions/index.d.ts +1 -0
  178. package/file-upload/exceptions/index.js +17 -0
  179. package/file-upload/file-upload.module.d.ts +89 -0
  180. package/file-upload/file-upload.module.js +292 -0
  181. package/file-upload/index.d.ts +37 -0
  182. package/file-upload/index.js +77 -0
  183. package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
  184. package/file-upload/interceptors/file-upload.interceptor.js +594 -0
  185. package/file-upload/interceptors/index.d.ts +1 -0
  186. package/file-upload/interceptors/index.js +17 -0
  187. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  188. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  189. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  190. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  191. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  192. package/file-upload/interfaces/file-entity.interface.js +28 -0
  193. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  194. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  195. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  196. package/file-upload/interfaces/file-processor.interface.js +2 -0
  197. package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
  198. package/file-upload/interfaces/file-upload-options.interface.js +5 -0
  199. package/file-upload/interfaces/index.d.ts +7 -0
  200. package/file-upload/interfaces/index.js +24 -0
  201. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  202. package/file-upload/interfaces/processor-options.interface.js +2 -0
  203. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  204. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  205. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  206. package/file-upload/interfaces/upload-options.interface.js +2 -0
  207. package/file-upload/processors/csv.processor.d.ts +98 -0
  208. package/file-upload/processors/csv.processor.js +391 -0
  209. package/file-upload/processors/excel.processor.d.ts +130 -0
  210. package/file-upload/processors/excel.processor.js +547 -0
  211. package/file-upload/processors/image.processor.d.ts +199 -0
  212. package/file-upload/processors/image.processor.js +377 -0
  213. package/file-upload/providers/index.d.ts +2 -0
  214. package/file-upload/providers/index.js +18 -0
  215. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  216. package/file-upload/providers/local-storage.provider.js +484 -0
  217. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  218. package/file-upload/providers/s3-storage.provider.js +455 -0
  219. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  220. package/file-upload/services/file-signature-validator.service.js +376 -0
  221. package/file-upload/services/file.service.d.ts +193 -0
  222. package/file-upload/services/file.service.js +638 -0
  223. package/file-upload/services/index.d.ts +4 -0
  224. package/file-upload/services/index.js +20 -0
  225. package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
  226. package/file-upload/services/malicious-file-detector.service.js +1234 -0
  227. package/file-upload/services/mime-registry.service.d.ts +47 -0
  228. package/file-upload/services/mime-registry.service.js +167 -0
  229. package/file-upload/utils/checksum.util.d.ts +28 -0
  230. package/file-upload/utils/checksum.util.js +65 -0
  231. package/file-upload/utils/dynamic-import.util.d.ts +54 -0
  232. package/file-upload/utils/dynamic-import.util.js +156 -0
  233. package/file-upload/utils/filename.util.d.ts +59 -0
  234. package/file-upload/utils/filename.util.js +184 -0
  235. package/file-upload/utils/filepath.util.d.ts +70 -0
  236. package/file-upload/utils/filepath.util.js +152 -0
  237. package/file-upload/utils/index.d.ts +4 -0
  238. package/file-upload/utils/index.js +20 -0
  239. package/filters/bad-request.filter.d.ts +9 -0
  240. package/filters/bad-request.filter.js +57 -16
  241. package/http-client/config/http-client.config.d.ts +5 -0
  242. package/http-client/config/http-client.config.js +27 -14
  243. package/http-client/decorators/http-client.decorators.d.ts +7 -28
  244. package/http-client/decorators/http-client.decorators.js +124 -99
  245. package/http-client/entities/http-log.entity.d.ts +0 -20
  246. package/http-client/entities/http-log.entity.js +1 -21
  247. package/http-client/examples/advanced-usage.example.d.ts +4 -5
  248. package/http-client/examples/advanced-usage.example.js +7 -59
  249. package/http-client/examples/axios-config-extended.example.d.ts +17 -0
  250. package/http-client/examples/axios-config-extended.example.js +311 -0
  251. package/http-client/examples/flexible-response-example.d.ts +28 -0
  252. package/http-client/examples/flexible-response-example.js +120 -0
  253. package/http-client/examples/index.d.ts +2 -0
  254. package/http-client/examples/index.js +2 -0
  255. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  256. package/http-client/examples/proxy-from-environment.example.js +409 -0
  257. package/http-client/examples/ssl-certificate.example.d.ts +47 -0
  258. package/http-client/examples/ssl-certificate.example.js +432 -0
  259. package/http-client/http-client.module.d.ts +43 -2
  260. package/http-client/http-client.module.js +150 -90
  261. package/http-client/index.d.ts +1 -1
  262. package/http-client/interfaces/api-client-config.interface.d.ts +24 -103
  263. package/http-client/interfaces/http-client-config.interface.d.ts +137 -62
  264. package/http-client/services/api-client-registry.service.d.ts +8 -21
  265. package/http-client/services/api-client-registry.service.js +31 -282
  266. package/http-client/services/circuit-breaker.service.d.ts +69 -2
  267. package/http-client/services/circuit-breaker.service.js +185 -7
  268. package/http-client/services/http-client.service.d.ts +85 -23
  269. package/http-client/services/http-client.service.js +512 -168
  270. package/http-client/services/http-log-query.service.js +0 -13
  271. package/http-client/services/index.d.ts +0 -1
  272. package/http-client/services/index.js +0 -1
  273. package/http-client/services/logging.service.d.ts +69 -16
  274. package/http-client/services/logging.service.js +290 -170
  275. package/http-client/utils/call-stack-extractor.util.d.ts +26 -0
  276. package/http-client/utils/call-stack-extractor.util.js +35 -0
  277. package/http-client/utils/context-extractor.util.d.ts +2 -0
  278. package/http-client/utils/context-extractor.util.js +17 -3
  279. package/http-client/utils/curl-generator.util.js +2 -5
  280. package/http-client/utils/index.d.ts +2 -0
  281. package/http-client/utils/index.js +2 -0
  282. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  283. package/http-client/utils/proxy-environment.util.js +154 -0
  284. package/http-client/utils/retry-recorder.util.d.ts +0 -4
  285. package/http-client/utils/retry-recorder.util.js +2 -27
  286. package/http-client/utils/sanitize.util.d.ts +58 -0
  287. package/http-client/utils/sanitize.util.js +188 -0
  288. package/http-client/utils/security-validator.util.d.ts +118 -0
  289. package/http-client/utils/security-validator.util.js +354 -0
  290. package/index.d.ts +4 -1
  291. package/index.js +6 -1
  292. package/interceptors/translation-interceptor.service.d.ts +7 -0
  293. package/interceptors/translation-interceptor.service.js +40 -8
  294. package/ip-filter/constants.d.ts +21 -0
  295. package/ip-filter/constants.js +24 -0
  296. package/ip-filter/decorators/index.d.ts +1 -0
  297. package/ip-filter/decorators/index.js +17 -0
  298. package/ip-filter/decorators/ip-filter.decorator.d.ts +58 -0
  299. package/ip-filter/decorators/ip-filter.decorator.js +79 -0
  300. package/ip-filter/guards/index.d.ts +1 -0
  301. package/ip-filter/guards/index.js +17 -0
  302. package/ip-filter/guards/ip-filter.guard.d.ts +62 -0
  303. package/ip-filter/guards/ip-filter.guard.js +174 -0
  304. package/ip-filter/index.d.ts +7 -0
  305. package/ip-filter/index.js +23 -0
  306. package/ip-filter/interfaces/index.d.ts +4 -0
  307. package/ip-filter/interfaces/index.js +20 -0
  308. package/ip-filter/interfaces/ip-filter-async-options.interface.d.ts +15 -0
  309. package/ip-filter/interfaces/ip-filter-async-options.interface.js +2 -0
  310. package/ip-filter/interfaces/ip-filter-metadata.interface.d.ts +26 -0
  311. package/ip-filter/interfaces/ip-filter-metadata.interface.js +2 -0
  312. package/ip-filter/interfaces/ip-filter-options.interface.d.ts +34 -0
  313. package/ip-filter/interfaces/ip-filter-options.interface.js +2 -0
  314. package/ip-filter/interfaces/ip-rule.interface.d.ts +36 -0
  315. package/ip-filter/interfaces/ip-rule.interface.js +2 -0
  316. package/ip-filter/ip-filter.module.d.ts +55 -0
  317. package/ip-filter/ip-filter.module.js +105 -0
  318. package/ip-filter/services/index.d.ts +1 -0
  319. package/ip-filter/services/index.js +17 -0
  320. package/ip-filter/services/ip-filter.service.d.ts +92 -0
  321. package/ip-filter/services/ip-filter.service.js +238 -0
  322. package/ip-filter/utils/index.d.ts +1 -0
  323. package/ip-filter/utils/index.js +17 -0
  324. package/ip-filter/utils/ip-utils.d.ts +61 -0
  325. package/ip-filter/utils/ip-utils.js +162 -0
  326. package/package.json +34 -29
  327. package/providers/context.provider.d.ts +9 -0
  328. package/providers/context.provider.js +13 -0
  329. package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
  330. package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
  331. package/redis-lock/index.d.ts +2 -0
  332. package/redis-lock/index.js +5 -1
  333. package/redis-lock/lock-heartbeat.service.d.ts +80 -0
  334. package/redis-lock/lock-heartbeat.service.js +232 -0
  335. package/redis-lock/redis-lock.module.d.ts +6 -0
  336. package/redis-lock/redis-lock.module.js +136 -77
  337. package/redis-lock/redis-lock.service.d.ts +31 -0
  338. package/redis-lock/redis-lock.service.js +124 -17
  339. package/setup/bootstrap.setup.d.ts +2 -1
  340. package/setup/bootstrap.setup.js +3 -2
  341. package/setup/index.d.ts +1 -0
  342. package/setup/index.js +1 -0
  343. package/setup/run-in-mode.decorator.d.ts +56 -0
  344. package/setup/run-in-mode.decorator.js +92 -0
  345. package/setup/schedule.decorator.d.ts +1 -0
  346. package/setup/schedule.decorator.js +28 -13
  347. package/setup/worker.decorator.js +10 -1
  348. package/shared/index.d.ts +1 -1
  349. package/shared/index.js +1 -1
  350. package/shared/{serviceRegistryModule.js → service-registry.module.js} +28 -17
  351. package/shared/services/api-config.service.d.ts +41 -0
  352. package/shared/services/api-config.service.js +175 -8
  353. package/shared/services/index.d.ts +0 -1
  354. package/shared/services/index.js +0 -1
  355. package/validators/custom-validate.validator.d.ts +1 -0
  356. package/validators/custom-validate.validator.js +1 -0
  357. package/validators/file-mimetype.validator.d.ts +0 -2
  358. package/validators/file-mimetype.validator.js +4 -6
  359. package/validators/is-exists.validator.d.ts +15 -6
  360. package/validators/is-exists.validator.js +8 -7
  361. package/validators/is-unique.validator.d.ts +22 -7
  362. package/validators/is-unique.validator.js +41 -17
  363. package/vault/vault-config.service.js +1 -1
  364. package/cache/providers/memory-cache.provider.d.ts +0 -49
  365. package/cache/providers/memory-cache.provider.js +0 -197
  366. package/http-client/services/cache.service.d.ts +0 -76
  367. package/http-client/services/cache.service.js +0 -333
  368. package/shared/services/validator.service.d.ts +0 -3
  369. package/shared/services/validator.service.js +0 -20
  370. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -21,22 +21,56 @@ var HttpLoggingService_1;
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.HttpLoggingService = void 0;
23
23
  const common_1 = require("@nestjs/common");
24
- const typeorm_1 = require("typeorm");
25
24
  const http_log_entity_1 = require("../entities/http-log.entity");
26
25
  const request_id_util_1 = require("../utils/request-id.util");
27
26
  const context_extractor_util_1 = require("../utils/context-extractor.util");
28
27
  const call_stack_extractor_util_1 = require("../utils/call-stack-extractor.util");
28
+ const sanitize_util_1 = require("../utils/sanitize.util");
29
+ const transaction_1 = require("@nest-omni/transaction");
29
30
  /**
30
31
  * HTTP日志服务
31
32
  * 基于Spring Boot的请求日志记录机制,集成现有的ContextProvider
33
+ * 支持异步批量日志写入以提升性能
32
34
  */
33
35
  let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
34
- constructor(dataSource) {
35
- this.dataSource = dataSource;
36
+ constructor() {
36
37
  this.logger = new common_1.Logger(HttpLoggingService_1.name);
37
38
  this.logRepository = null;
38
- if (dataSource) {
39
- this.initializeDatabaseLogging();
39
+ /** 日志队列 */
40
+ this.logQueue = [];
41
+ /** 默认异步日志配置 */
42
+ this.asyncConfig = {
43
+ batchSize: 50, // 批量写入50条日志
44
+ flushIntervalMs: 5000, // 每5秒刷新一次
45
+ maxRetries: 3, // 失败后最多重试3次
46
+ enabled: true, // 默认启用异步日志
47
+ };
48
+ /** 处理中标志 */
49
+ this.isProcessing = false;
50
+ // 启动定期刷新任务
51
+ if (this.asyncConfig.enabled) {
52
+ this.startFlushTask();
53
+ }
54
+ }
55
+ onModuleDestroy() {
56
+ // 清理定时器
57
+ if (this.flushTimer) {
58
+ clearInterval(this.flushTimer);
59
+ }
60
+ // 刷新剩余日志
61
+ this.flush();
62
+ }
63
+ initRepository(dataSource, tableName) {
64
+ try {
65
+ this.logRepository =
66
+ (0, transaction_1.getDataSource)(dataSource).getRepository(http_log_entity_1.HttpLogEntity);
67
+ this.logger.log('Database logging initialized');
68
+ return this.logRepository;
69
+ }
70
+ catch (error) {
71
+ this.logger.warn('Database logging not available, continuing without it');
72
+ this.logRepository = null;
73
+ return null;
40
74
  }
41
75
  }
42
76
  /**
@@ -46,16 +80,16 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
46
80
  // 从ContextProvider获取上下文信息
47
81
  const context = context_extractor_util_1.ContextExtractor.getHttpContext();
48
82
  const actualRequestId = requestId || context.requestId || (0, request_id_util_1.generateRequestId)();
49
- const { logHeaders = true, logBody = true, sanitizeHeaders = [], } = loggingOptions || {};
83
+ const { logHeaders = true, logBody = true, sanitize = [], } = loggingOptions || {};
50
84
  const logData = {
51
85
  requestId: actualRequestId,
52
86
  userId: context.userId,
53
- method: config.method ? config.method.toUpperCase() : 'GET',
54
- url: config.url,
55
- headers: logHeaders
56
- ? this.sanitizeHeaders(config.headers, sanitizeHeaders)
87
+ method: (config === null || config === void 0 ? void 0 : config.method) ? config.method.toUpperCase() : 'GET',
88
+ url: config ? sanitize_util_1.SanitizeUtil.sanitizeQueryString(config.url, sanitize) : '',
89
+ headers: logHeaders && config
90
+ ? sanitize_util_1.SanitizeUtil.sanitizeHeaders(config.headers, sanitize)
57
91
  : undefined,
58
- body: logBody ? this.sanitizeBody(config.data) : undefined,
92
+ body: logBody && config ? sanitize_util_1.SanitizeUtil.sanitizeBody(config.data, sanitize) : undefined,
59
93
  clientIp: context.clientIp,
60
94
  serviceName: context.appId,
61
95
  };
@@ -74,78 +108,90 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
74
108
  /**
75
109
  * 记录请求成功响应
76
110
  */
77
- logRequestSuccess(response, startTime, requestId, loggingOptions, databaseLogging = false, retryRecords, cacheHit, circuitBreakerState, decoratorContext) {
78
- var _a, _b;
79
- const { logHeaders = true, logBody = true, sanitizeHeaders = [], } = loggingOptions || {};
80
- const responseTime = Date.now() - startTime;
81
- // 获取当前上下文信息
82
- const context = context_extractor_util_1.ContextExtractor.getHttpContext();
83
- const logData = {
84
- requestId,
85
- userId: context.userId,
86
- statusCode: response.status,
87
- responseTime,
88
- headers: logHeaders
89
- ? this.sanitizeHeaders(response.headers, sanitizeHeaders)
90
- : undefined,
91
- body: logBody ? this.sanitizeBody(response.data) : undefined,
92
- responseSize: JSON.stringify(response.data).length,
93
- cacheHit,
94
- circuitBreakerState,
95
- };
96
- const logMessage = `HTTP Response [${requestId}]: ${response.status} (${responseTime}ms)${cacheHit ? ' [CACHE HIT]' : ''}`;
97
- switch ((loggingOptions || {}).logLevel) {
98
- case 'debug':
99
- this.logger.debug(logMessage, logData);
100
- break;
101
- case 'info':
102
- default:
103
- this.logger.log(logMessage, logData);
104
- break;
105
- }
106
- // 数据库日志记录
107
- if (databaseLogging && this.logRepository) {
108
- // 提取调用信息
109
- const callInfo = this.extractCallInfo(decoratorContext, response.config);
110
- this.saveToDatabase({
111
- id: requestId,
111
+ logRequestSuccess(response_1, startTime_1, requestId_1, loggingOptions_1) {
112
+ return __awaiter(this, arguments, void 0, function* (response, startTime, requestId, loggingOptions, databaseLogging = false, retryRecords, circuitBreakerState, decoratorContext, clientName, callingContext) {
113
+ var _a, _b, _c, _d, _e, _f;
114
+ const { logHeaders = true, logBody = true, sanitize = [], } = loggingOptions || {};
115
+ const responseTime = Date.now() - startTime;
116
+ // 获取当前上下文信息
117
+ const context = context_extractor_util_1.ContextExtractor.getHttpContext();
118
+ const logData = {
112
119
  requestId,
113
120
  userId: context.userId,
114
- method: ((_a = response.config.method) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || 'UNKNOWN',
115
- url: response.config.url || '',
116
- headers: this.sanitizeHeaders(response.config.headers, sanitizeHeaders),
117
- body: this.sanitizeBodyAsString(response.config.data),
118
- params: response.config.params,
119
121
  statusCode: response.status,
120
122
  responseTime,
121
- attemptCount: (retryRecords === null || retryRecords === void 0 ? void 0 : retryRecords.length)
122
- ? Math.max(...retryRecords.map((r) => r.attempt))
123
- : 1,
124
- success: true,
125
- responseHeaders: this.sanitizeHeaders(response.headers, sanitizeHeaders),
126
- responseBody: logBody
127
- ? this.sanitizeBodyAsString(response.data)
123
+ headers: logHeaders
124
+ ? sanitize_util_1.SanitizeUtil.sanitizeHeaders(response.headers, sanitize)
128
125
  : undefined,
126
+ body: logBody ? sanitize_util_1.SanitizeUtil.sanitizeBody(response.data, sanitize) : undefined,
129
127
  responseSize: JSON.stringify(response.data).length,
130
- requestSize: JSON.stringify(response.config.data).length,
131
- serviceName: context.appId,
132
- operationName: callInfo.operationName,
133
- clientIp: context.clientIp,
134
- source: (_b = context.metadata) === null || _b === void 0 ? void 0 : _b.source,
135
- tags: context.tags,
136
- metadata: logData,
137
- retryRecords,
138
- cacheHit,
139
128
  circuitBreakerState,
140
- });
141
- }
129
+ };
130
+ const logMessage = `HTTP Response [${requestId}]: ${response.status} (${responseTime}ms)`;
131
+ switch ((loggingOptions || {}).logLevel) {
132
+ case 'debug':
133
+ this.logger.debug(logMessage, logData);
134
+ break;
135
+ case 'info':
136
+ default:
137
+ this.logger.log(logMessage, logData);
138
+ break;
139
+ }
140
+ if (!this.logRepository) {
141
+ this.logger.debug('Initializing log repository', {
142
+ dataSource: (_a = loggingOptions.databaseLogging) === null || _a === void 0 ? void 0 : _a.dataSource,
143
+ tableName: (_b = loggingOptions.databaseLogging) === null || _b === void 0 ? void 0 : _b.tableName,
144
+ });
145
+ this.initRepository(((_c = loggingOptions.databaseLogging) === null || _c === void 0 ? void 0 : _c.dataSource) || 'default', ((_d = loggingOptions.databaseLogging) === null || _d === void 0 ? void 0 : _d.tableName) || 'http_log');
146
+ }
147
+ // 数据库日志记录
148
+ if (databaseLogging && this.logRepository) {
149
+ this.logger.log('Database logging conditions met, saving to database');
150
+ }
151
+ else {
152
+ this.logger.warn(`Database logging conditions NOT met: databaseLogging=${databaseLogging}, hasRepository=${!!this.logRepository}, type=${typeof this.logRepository}`);
153
+ }
154
+ if (databaseLogging && this.logRepository) {
155
+ // 提取调用信息
156
+ const callInfo = callingContext && callingContext.operationName
157
+ ? callingContext
158
+ : this.extractCallInfo(decoratorContext, response.config);
159
+ this.saveToDatabase({
160
+ requestId,
161
+ userId: context.userId,
162
+ method: ((_e = response.config.method) === null || _e === void 0 ? void 0 : _e.toUpperCase()) || 'UNKNOWN',
163
+ url: sanitize_util_1.SanitizeUtil.sanitizeQueryString(this.getFullUrl(response.config), sanitize),
164
+ headers: sanitize_util_1.SanitizeUtil.sanitizeHeaders(response.config.headers, sanitize),
165
+ body: sanitize_util_1.SanitizeUtil.sanitizeBodyAsString(response.config.data, sanitize),
166
+ params: sanitize_util_1.SanitizeUtil.sanitizeParams(response.config.params, sanitize),
167
+ statusCode: response.status,
168
+ responseTime,
169
+ attemptCount: (retryRecords === null || retryRecords === void 0 ? void 0 : retryRecords.length)
170
+ ? Math.max(...retryRecords.map((r) => r.attempt)) + 1
171
+ : 1,
172
+ success: true,
173
+ responseHeaders: sanitize_util_1.SanitizeUtil.sanitizeHeaders(response.headers, sanitize),
174
+ responseBody: logBody
175
+ ? sanitize_util_1.SanitizeUtil.sanitizeBodyAsString(response.data, sanitize)
176
+ : undefined,
177
+ serviceName: clientName || context.appId,
178
+ operationName: callInfo.operationName,
179
+ clientIp: context.clientIp,
180
+ source: (_f = context.metadata) === null || _f === void 0 ? void 0 : _f.source,
181
+ tags: context.tags,
182
+ metadata: logData,
183
+ retryRecords,
184
+ circuitBreakerState,
185
+ });
186
+ }
187
+ });
142
188
  }
143
189
  /**
144
190
  * 记录请求错误
145
191
  */
146
- logRequestError(error, startTime, requestId, attemptCount, loggingOptions, databaseLogging = false, retryRecords, cacheHit, circuitBreakerState, decoratorContext) {
192
+ logRequestError(error, startTime, requestId, attemptCount, loggingOptions, databaseLogging = false, retryRecords, circuitBreakerState, decoratorContext, clientName, callingContext) {
147
193
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
148
- const { logHeaders = true, sanitizeHeaders = [] } = loggingOptions;
194
+ const { logHeaders = true, sanitize = [] } = loggingOptions;
149
195
  const responseTime = Date.now() - startTime;
150
196
  // 获取当前上下文信息
151
197
  const context = context_extractor_util_1.ContextExtractor.getHttpContext();
@@ -159,7 +205,7 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
159
205
  errorCode: error.code,
160
206
  statusCode: (_a = error.response) === null || _a === void 0 ? void 0 : _a.status,
161
207
  headers: ((_b = error.config) === null || _b === void 0 ? void 0 : _b.headers) && logHeaders
162
- ? this.sanitizeHeaders(error.config.headers, sanitizeHeaders)
208
+ ? sanitize_util_1.SanitizeUtil.sanitizeHeaders(error.config.headers, sanitize)
163
209
  : undefined,
164
210
  circuitBreakerState,
165
211
  };
@@ -178,37 +224,39 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
178
224
  this.logger.error(logMessage, logData);
179
225
  break;
180
226
  }
227
+ if (!this.logRepository) {
228
+ this.initRepository(((_c = loggingOptions.databaseLogging) === null || _c === void 0 ? void 0 : _c.dataSource) || 'default', ((_d = loggingOptions.databaseLogging) === null || _d === void 0 ? void 0 : _d.tableName) || 'http_log');
229
+ }
181
230
  // 数据库日志记录
182
231
  if (databaseLogging && this.logRepository) {
183
232
  // 提取调用信息
184
- const callInfo = this.extractCallInfo(decoratorContext, error.config);
233
+ const callInfo = callingContext && callingContext.operationName
234
+ ? callingContext
235
+ : this.extractCallInfo(decoratorContext, error.config);
185
236
  this.saveToDatabase({
186
- id: requestId,
187
237
  requestId,
188
238
  userId: context.userId,
189
- method: ((_d = (_c = error.config) === null || _c === void 0 ? void 0 : _c.method) === null || _d === void 0 ? void 0 : _d.toUpperCase()) || 'UNKNOWN',
190
- url: ((_e = error.config) === null || _e === void 0 ? void 0 : _e.url) || '',
191
- headers: ((_f = error.config) === null || _f === void 0 ? void 0 : _f.headers)
192
- ? this.sanitizeHeaders(error.config.headers, sanitizeHeaders)
239
+ method: ((_f = (_e = error.config) === null || _e === void 0 ? void 0 : _e.method) === null || _f === void 0 ? void 0 : _f.toUpperCase()) || 'UNKNOWN',
240
+ url: sanitize_util_1.SanitizeUtil.sanitizeQueryString(this.getFullUrl(error.config), sanitize),
241
+ headers: ((_g = error.config) === null || _g === void 0 ? void 0 : _g.headers)
242
+ ? sanitize_util_1.SanitizeUtil.sanitizeHeaders(error.config.headers, sanitize)
193
243
  : {},
194
- body: this.sanitizeBodyAsString((_g = error.config) === null || _g === void 0 ? void 0 : _g.data),
195
- params: (_h = error.config) === null || _h === void 0 ? void 0 : _h.params,
196
- statusCode: (_j = error.response) === null || _j === void 0 ? void 0 : _j.status,
244
+ body: sanitize_util_1.SanitizeUtil.sanitizeBodyAsString((_h = error.config) === null || _h === void 0 ? void 0 : _h.data, sanitize),
245
+ params: sanitize_util_1.SanitizeUtil.sanitizeParams((_j = error.config) === null || _j === void 0 ? void 0 : _j.params, sanitize),
246
+ statusCode: (_k = error.response) === null || _k === void 0 ? void 0 : _k.status,
197
247
  responseTime,
198
248
  attemptCount,
199
249
  success: false,
200
250
  errorMessage: error.message,
201
251
  errorStack: error.stack,
202
252
  errorCode: error.code,
203
- requestSize: JSON.stringify(((_k = error.config) === null || _k === void 0 ? void 0 : _k.data) || {}).length,
204
- serviceName: context.appId,
253
+ serviceName: clientName || context.appId,
205
254
  operationName: callInfo.operationName,
206
255
  clientIp: context.clientIp,
207
256
  source: (_l = context.metadata) === null || _l === void 0 ? void 0 : _l.source,
208
257
  tags: context.tags,
209
258
  metadata: logData,
210
259
  retryRecords,
211
- cacheHit,
212
260
  circuitBreakerState,
213
261
  });
214
262
  }
@@ -330,19 +378,49 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
330
378
  });
331
379
  }
332
380
  /**
333
- * 初始化数据库日志记录
381
+ * 获取日志队列统计信息
382
+ */
383
+ getQueueStats() {
384
+ return {
385
+ queueSize: this.logQueue.length,
386
+ isProcessing: this.isProcessing,
387
+ config: Object.assign({}, this.asyncConfig),
388
+ };
389
+ }
390
+ /**
391
+ * 手动刷新日志队列
334
392
  */
335
- initializeDatabaseLogging() {
393
+ manualFlush() {
336
394
  return __awaiter(this, void 0, void 0, function* () {
337
- try {
338
- this.logRepository = this.dataSource.getRepository(http_log_entity_1.HttpLogEntity);
339
- this.logger.log('Database logging initialized');
340
- }
341
- catch (error) {
342
- this.logger.error('Failed to initialize database logging', error);
343
- }
395
+ return new Promise((resolve) => {
396
+ const checkProcessing = () => {
397
+ if (!this.isProcessing) {
398
+ this.flush();
399
+ // 等待刷新完成
400
+ setTimeout(() => resolve(), 100);
401
+ }
402
+ else {
403
+ setTimeout(checkProcessing, 50);
404
+ }
405
+ };
406
+ checkProcessing();
407
+ });
344
408
  });
345
409
  }
410
+ /**
411
+ * 设置异步日志配置
412
+ */
413
+ setAsyncConfig(config) {
414
+ Object.assign(this.asyncConfig, config);
415
+ // 重启刷新任务
416
+ if (this.flushTimer) {
417
+ clearInterval(this.flushTimer);
418
+ }
419
+ if (this.asyncConfig.enabled) {
420
+ this.startFlushTask();
421
+ }
422
+ this.logger.log(`Async log config updated: ${JSON.stringify(this.asyncConfig)}`);
423
+ }
346
424
  /**
347
425
  * 提取调用信息
348
426
  */
@@ -386,113 +464,155 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
386
464
  }
387
465
  /**
388
466
  * 保存到数据库
467
+ * 如果启用异步日志,将日志项添加到队列中
468
+ * 否则同步保存到数据库
389
469
  */
390
470
  saveToDatabase(logEntity) {
391
471
  return __awaiter(this, void 0, void 0, function* () {
392
- if (!this.logRepository)
472
+ if (!this.logRepository) {
473
+ this.logger.warn('Log repository not initialized, skipping database logging');
393
474
  return;
394
- try {
395
- yield this.logRepository.save(logEntity);
396
475
  }
397
- catch (error) {
398
- this.logger.error('Failed to save HTTP log to database', error);
476
+ if (this.asyncConfig.enabled) {
477
+ // 异步模式:添加到队列
478
+ this.logQueue.push({
479
+ logEntity,
480
+ attempt: 0,
481
+ });
482
+ // 如果队列达到批量大小,立即刷新
483
+ if (this.logQueue.length >= this.asyncConfig.batchSize) {
484
+ setImmediate(() => this.flush());
485
+ }
486
+ }
487
+ else {
488
+ // 同步模式:直接保存
489
+ yield this.saveLogToDatabase(logEntity);
399
490
  }
400
491
  });
401
492
  }
402
493
  /**
403
- * 转换请求体为字符串
494
+ * 启动定期刷新任务
404
495
  */
405
- sanitizeBodyAsString(data) {
406
- if (!data)
407
- return undefined;
408
- if (typeof data === 'string') {
409
- return data.length > 5000 ? data.substring(0, 5000) + '...' : data;
410
- }
411
- const jsonString = JSON.stringify(data);
412
- return jsonString.length > 5000
413
- ? jsonString.substring(0, 5000) + '...'
414
- : jsonString;
496
+ startFlushTask() {
497
+ this.flushTimer = setInterval(() => {
498
+ this.flush();
499
+ }, this.asyncConfig.flushIntervalMs);
500
+ this.logger.log(`Async log flushing started (interval: ${this.asyncConfig.flushIntervalMs}ms, batchSize: ${this.asyncConfig.batchSize})`);
415
501
  }
416
502
  /**
417
- * 清理敏感头信息
503
+ * 刷新日志队列到数据库
418
504
  */
419
- sanitizeHeaders(headers, sanitizeHeaders) {
420
- if (!headers)
421
- return {};
422
- const sanitized = {};
423
- const defaultSensitiveHeaders = [
424
- 'authorization',
425
- 'apikey',
426
- 'password',
427
- 'token',
428
- 'secret',
429
- 'cookie',
430
- 'set-cookie',
431
- 'x-api-key',
432
- 'x-auth-token',
433
- ];
434
- const headersToSanitize = [...defaultSensitiveHeaders, ...sanitizeHeaders];
435
- Object.keys(headers).forEach((key) => {
436
- if (headersToSanitize.some((sensitive) => key.toLowerCase().includes(sensitive.toLowerCase()))) {
437
- sanitized[key] = '[FILTERED]';
505
+ flush() {
506
+ if (this.isProcessing || this.logQueue.length === 0) {
507
+ return;
508
+ }
509
+ this.isProcessing = true;
510
+ // 取出当前批次
511
+ const batch = this.logQueue.splice(0, this.asyncConfig.batchSize);
512
+ // 异步处理
513
+ setImmediate(() => __awaiter(this, void 0, void 0, function* () {
514
+ try {
515
+ // 批量保存
516
+ yield Promise.all(batch.map((item) => this.processLogItem(item)));
517
+ this.logger.debug(`Flushed ${batch.length} log entries to database`);
518
+ // 如果还有剩余日志,继续处理
519
+ if (this.logQueue.length > 0) {
520
+ setImmediate(() => this.flush());
521
+ }
438
522
  }
439
- else {
440
- sanitized[key] = String(headers[key]);
523
+ catch (error) {
524
+ this.logger.error('Error flushing log queue', error);
525
+ // 将失败的日志重新放回队列(如果还有重试机会)
526
+ batch.forEach((item) => {
527
+ if (item.attempt < this.asyncConfig.maxRetries) {
528
+ item.attempt++;
529
+ this.logQueue.unshift(item); // 放回队列头部
530
+ }
531
+ else {
532
+ this.logger.error(`Log entry exceeded max retries, discarding: ${item.logEntity.requestId}`);
533
+ }
534
+ });
441
535
  }
442
- });
443
- return sanitized;
536
+ finally {
537
+ this.isProcessing = false;
538
+ }
539
+ }));
444
540
  }
445
541
  /**
446
- * 清理敏感请求体信息
542
+ * 处理单个日志项
447
543
  */
448
- sanitizeBody(body) {
449
- if (!body)
450
- return undefined;
451
- if (typeof body === 'string') {
544
+ processLogItem(item) {
545
+ return __awaiter(this, void 0, void 0, function* () {
546
+ if (!this.logRepository) {
547
+ return;
548
+ }
452
549
  try {
453
- body = JSON.parse(body);
550
+ yield this.logRepository.save(item.logEntity, { reload: false });
454
551
  }
455
- catch (_a) {
456
- return body.length > 1000 ? body.substring(0, 1000) + '...' : body;
552
+ catch (error) {
553
+ this.logger.error(`Failed to save log entry: ${item.logEntity.requestId}`, error);
554
+ throw error; // 重新抛出错误以便重试
457
555
  }
458
- }
459
- if (typeof body === 'object') {
460
- const sanitized = Object.assign({}, body);
461
- const sensitiveFields = [
462
- 'password',
463
- 'secret',
464
- 'token',
465
- 'key',
466
- 'authorization',
467
- 'credential',
468
- 'private',
469
- 'confidential',
470
- 'ssn',
471
- 'creditCard',
472
- ];
473
- this.sanitizeObject(sanitized, sensitiveFields);
474
- return sanitized;
475
- }
476
- return body;
556
+ });
477
557
  }
478
558
  /**
479
- * 递归清理对象中的敏感字段
559
+ * 同步保存日志到数据库(用于异步模式内部)
480
560
  */
481
- sanitizeObject(obj, sensitiveFields) {
482
- if (typeof obj !== 'object' || obj === null)
483
- return;
484
- for (const key in obj) {
485
- if (sensitiveFields.some((field) => key.toLowerCase().includes(field.toLowerCase()))) {
486
- obj[key] = '[FILTERED]';
561
+ saveLogToDatabase(logEntity) {
562
+ return __awaiter(this, void 0, void 0, function* () {
563
+ var _a;
564
+ if (!this.logRepository) {
565
+ this.logger.warn('Log repository not initialized, skipping database logging');
566
+ return;
567
+ }
568
+ try {
569
+ this.logger.log('Saving HTTP log to database', {
570
+ requestId: logEntity.requestId,
571
+ circuitBreakerState: logEntity.circuitBreakerState,
572
+ retryRecordsCount: ((_a = logEntity.retryRecords) === null || _a === void 0 ? void 0 : _a.length) || 0,
573
+ });
574
+ yield this.logRepository.save(logEntity, { reload: false });
575
+ this.logger.log('Successfully saved HTTP log to database', {
576
+ requestId: logEntity.requestId,
577
+ circuitBreakerState: logEntity.circuitBreakerState,
578
+ });
487
579
  }
488
- else if (typeof obj[key] === 'object') {
489
- this.sanitizeObject(obj[key], sensitiveFields);
580
+ catch (error) {
581
+ this.logger.error('Failed to save HTTP log to database', error);
582
+ this.logger.error('Log entity details', logEntity);
490
583
  }
584
+ });
585
+ }
586
+ /**
587
+ * 获取完整URL
588
+ * @param config Axios请求配置
589
+ * @returns 完整的URL字符串
590
+ */
591
+ getFullUrl(config) {
592
+ if (!config)
593
+ return '';
594
+ // 如果已经有完整的URL,直接返回
595
+ if (config.url && config.url.startsWith('http')) {
596
+ return config.url;
597
+ }
598
+ // 获取baseURL
599
+ const baseURL = config.baseURL || '';
600
+ // 获取URL路径
601
+ const urlPath = config.url || '';
602
+ // 如果baseURL为空,直接返回URL路径
603
+ if (!baseURL) {
604
+ return urlPath;
491
605
  }
606
+ // 确保baseURL以/结尾,urlPath不以/开头(除非它是绝对路径)
607
+ const normalizedBaseURL = baseURL.endsWith('/') ? baseURL : baseURL + '/';
608
+ const normalizedUrlPath = urlPath.startsWith('/')
609
+ ? urlPath.substring(1)
610
+ : urlPath;
611
+ return normalizedBaseURL + normalizedUrlPath;
492
612
  }
493
613
  };
494
614
  exports.HttpLoggingService = HttpLoggingService;
495
615
  exports.HttpLoggingService = HttpLoggingService = HttpLoggingService_1 = __decorate([
496
616
  (0, common_1.Injectable)(),
497
- __metadata("design:paramtypes", [typeorm_1.DataSource])
617
+ __metadata("design:paramtypes", [])
498
618
  ], HttpLoggingService);
@@ -3,6 +3,32 @@
3
3
  * 用于自动提取HTTP请求的调用服务和方法信息
4
4
  */
5
5
  export declare class CallStackExtractor {
6
+ /**
7
+ * 存储装饰器上下文(用于传递装饰器信息到HTTP客户端)
8
+ */
9
+ private static decoratorContext;
10
+ /**
11
+ * 装饰器上下文引用计数,用于处理多个装饰器嵌套的情况
12
+ */
13
+ private static decoratorContextDepth;
14
+ /**
15
+ * 设置装饰器上下文
16
+ */
17
+ static setDecoratorContext(context: {
18
+ target: any;
19
+ propertyKey: string;
20
+ }): void;
21
+ /**
22
+ * 获取装饰器上下文
23
+ */
24
+ static getDecoratorContext(): {
25
+ target: any;
26
+ propertyKey: string;
27
+ } | null;
28
+ /**
29
+ * 清除装饰器上下文
30
+ */
31
+ static clearDecoratorContext(): void;
6
32
  /**
7
33
  * 从调用栈中提取服务和方法信息
8
34
  */
@@ -6,6 +6,33 @@ exports.CallStackExtractor = void 0;
6
6
  * 用于自动提取HTTP请求的调用服务和方法信息
7
7
  */
8
8
  class CallStackExtractor {
9
+ /**
10
+ * 设置装饰器上下文
11
+ */
12
+ static setDecoratorContext(context) {
13
+ // 只在最外层设置
14
+ if (this.decoratorContextDepth === 0) {
15
+ this.decoratorContext = context;
16
+ }
17
+ this.decoratorContextDepth++;
18
+ }
19
+ /**
20
+ * 获取装饰器上下文
21
+ */
22
+ static getDecoratorContext() {
23
+ return this.decoratorContext;
24
+ }
25
+ /**
26
+ * 清除装饰器上下文
27
+ */
28
+ static clearDecoratorContext() {
29
+ this.decoratorContextDepth--;
30
+ // 只在最外层清除
31
+ if (this.decoratorContextDepth <= 0) {
32
+ this.decoratorContext = null;
33
+ this.decoratorContextDepth = 0;
34
+ }
35
+ }
9
36
  /**
10
37
  * 从调用栈中提取服务和方法信息
11
38
  */
@@ -184,3 +211,11 @@ class CallStackExtractor {
184
211
  }
185
212
  }
186
213
  exports.CallStackExtractor = CallStackExtractor;
214
+ /**
215
+ * 存储装饰器上下文(用于传递装饰器信息到HTTP客户端)
216
+ */
217
+ CallStackExtractor.decoratorContext = null;
218
+ /**
219
+ * 装饰器上下文引用计数,用于处理多个装饰器嵌套的情况
220
+ */
221
+ CallStackExtractor.decoratorContextDepth = 0;