@fecommunity/reactpress-server 4.0.0 → 4.0.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 (340) hide show
  1. package/README.md +325 -56
  2. package/bin/reactpress-server.js +6 -50
  3. package/dist/app.module.js +30 -18
  4. package/dist/app.module.js.map +1 -1
  5. package/dist/filters/http-exception.filter.js +1 -1
  6. package/dist/filters/http-exception.filter.js.map +1 -1
  7. package/dist/generate-swagger.d.ts +1 -1
  8. package/dist/generate-swagger.js +11 -12
  9. package/dist/generate-swagger.js.map +1 -1
  10. package/dist/interceptors/transform.interceptor.d.ts +6 -2
  11. package/dist/interceptors/transform.interceptor.js +5 -10
  12. package/dist/interceptors/transform.interceptor.js.map +1 -1
  13. package/dist/logger/index.js +4 -5
  14. package/dist/logger/index.js.map +1 -1
  15. package/dist/main.d.ts +1 -3
  16. package/dist/main.js +23 -47
  17. package/dist/main.js.map +1 -1
  18. package/dist/modules/article/article.controller.d.ts +2 -7
  19. package/dist/modules/article/article.controller.js +48 -103
  20. package/dist/modules/article/article.controller.js.map +1 -1
  21. package/dist/modules/article/article.entity.d.ts +0 -4
  22. package/dist/modules/article/article.entity.js +41 -61
  23. package/dist/modules/article/article.entity.js.map +1 -1
  24. package/dist/modules/article/article.module.js +3 -18
  25. package/dist/modules/article/article.module.js.map +1 -1
  26. package/dist/modules/article/article.service.d.ts +2 -16
  27. package/dist/modules/article/article.service.js +29 -151
  28. package/dist/modules/article/article.service.js.map +1 -1
  29. package/dist/modules/auth/auth.controller.js +11 -11
  30. package/dist/modules/auth/auth.controller.js.map +1 -1
  31. package/dist/modules/auth/auth.module.js +4 -4
  32. package/dist/modules/auth/auth.module.js.map +1 -1
  33. package/dist/modules/auth/auth.service.js +7 -8
  34. package/dist/modules/auth/auth.service.js.map +1 -1
  35. package/dist/modules/auth/jwt-auth.guard.js +3 -4
  36. package/dist/modules/auth/jwt-auth.guard.js.map +1 -1
  37. package/dist/modules/auth/jwt.strategy.js +3 -4
  38. package/dist/modules/auth/jwt.strategy.js.map +1 -1
  39. package/dist/modules/auth/roles.guard.js +2 -2
  40. package/dist/modules/auth/roles.guard.js.map +1 -1
  41. package/dist/modules/category/category.controller.js +20 -21
  42. package/dist/modules/category/category.controller.js.map +1 -1
  43. package/dist/modules/category/category.entity.js +13 -13
  44. package/dist/modules/category/category.entity.js.map +1 -1
  45. package/dist/modules/category/category.module.js +1 -1
  46. package/dist/modules/category/category.module.js.map +1 -1
  47. package/dist/modules/category/category.service.js +4 -5
  48. package/dist/modules/category/category.service.js.map +1 -1
  49. package/dist/modules/comment/comment.controller.js +20 -24
  50. package/dist/modules/comment/comment.controller.js.map +1 -1
  51. package/dist/modules/comment/comment.entity.js +31 -31
  52. package/dist/modules/comment/comment.entity.js.map +1 -1
  53. package/dist/modules/comment/comment.module.js +2 -11
  54. package/dist/modules/comment/comment.module.js.map +1 -1
  55. package/dist/modules/comment/comment.service.d.ts +1 -5
  56. package/dist/modules/comment/comment.service.js +16 -43
  57. package/dist/modules/comment/comment.service.js.map +1 -1
  58. package/dist/modules/comment/html.d.ts +1 -1
  59. package/dist/modules/comment/html.js +3 -3
  60. package/dist/modules/comment/html.js.map +1 -1
  61. package/dist/modules/file/file.controller.d.ts +1 -1
  62. package/dist/modules/file/file.controller.js +20 -22
  63. package/dist/modules/file/file.controller.js.map +1 -1
  64. package/dist/modules/file/file.entity.d.ts +0 -7
  65. package/dist/modules/file/file.entity.js +15 -20
  66. package/dist/modules/file/file.entity.js.map +1 -1
  67. package/dist/modules/file/file.module.js +4 -16
  68. package/dist/modules/file/file.module.js.map +1 -1
  69. package/dist/modules/file/file.service.d.ts +1 -6
  70. package/dist/modules/file/file.service.js +38 -88
  71. package/dist/modules/file/file.service.js.map +1 -1
  72. package/dist/modules/install/install.controller.js +5 -5
  73. package/dist/modules/install/install.controller.js.map +1 -1
  74. package/dist/modules/install/install.module.js +1 -1
  75. package/dist/modules/install/install.module.js.map +1 -1
  76. package/dist/modules/install/install.service.js +2 -2
  77. package/dist/modules/install/install.service.js.map +1 -1
  78. package/dist/modules/knowledge/knowledge.controller.js +33 -35
  79. package/dist/modules/knowledge/knowledge.controller.js.map +1 -1
  80. package/dist/modules/knowledge/knowledge.entity.js +33 -33
  81. package/dist/modules/knowledge/knowledge.entity.js.map +1 -1
  82. package/dist/modules/knowledge/knowledge.module.js +1 -1
  83. package/dist/modules/knowledge/knowledge.module.js.map +1 -1
  84. package/dist/modules/knowledge/knowledge.service.js +11 -12
  85. package/dist/modules/knowledge/knowledge.service.js.map +1 -1
  86. package/dist/modules/page/page.controller.js +23 -24
  87. package/dist/modules/page/page.controller.js.map +1 -1
  88. package/dist/modules/page/page.entity.js +27 -27
  89. package/dist/modules/page/page.entity.js.map +1 -1
  90. package/dist/modules/page/page.module.js +1 -1
  91. package/dist/modules/page/page.module.js.map +1 -1
  92. package/dist/modules/page/page.service.js +12 -12
  93. package/dist/modules/page/page.service.js.map +1 -1
  94. package/dist/modules/search/search.controller.js +12 -12
  95. package/dist/modules/search/search.controller.js.map +1 -1
  96. package/dist/modules/search/search.entity.js +13 -13
  97. package/dist/modules/search/search.entity.js.map +1 -1
  98. package/dist/modules/search/search.module.js +1 -1
  99. package/dist/modules/search/search.module.js.map +1 -1
  100. package/dist/modules/search/search.service.js +2 -2
  101. package/dist/modules/search/search.service.js.map +1 -1
  102. package/dist/modules/setting/setting.constant.d.ts +4 -5
  103. package/dist/modules/setting/setting.constant.js +20 -5
  104. package/dist/modules/setting/setting.constant.js.map +1 -1
  105. package/dist/modules/setting/setting.controller.js +11 -11
  106. package/dist/modules/setting/setting.controller.js.map +1 -1
  107. package/dist/modules/setting/setting.entity.d.ts +0 -3
  108. package/dist/modules/setting/setting.entity.js +49 -64
  109. package/dist/modules/setting/setting.entity.js.map +1 -1
  110. package/dist/modules/setting/setting.module.js +2 -2
  111. package/dist/modules/setting/setting.module.js.map +1 -1
  112. package/dist/modules/setting/setting.service.d.ts +2 -13
  113. package/dist/modules/setting/setting.service.js +24 -169
  114. package/dist/modules/setting/setting.service.js.map +1 -1
  115. package/dist/modules/smtp/mail.util.d.ts +6 -7
  116. package/dist/modules/smtp/mail.util.js +9 -5
  117. package/dist/modules/smtp/mail.util.js.map +1 -1
  118. package/dist/modules/smtp/smtp.controller.d.ts +0 -3
  119. package/dist/modules/smtp/smtp.controller.js +14 -27
  120. package/dist/modules/smtp/smtp.controller.js.map +1 -1
  121. package/dist/modules/smtp/smtp.entity.js +15 -15
  122. package/dist/modules/smtp/smtp.entity.js.map +1 -1
  123. package/dist/modules/smtp/smtp.module.js +2 -2
  124. package/dist/modules/smtp/smtp.module.js.map +1 -1
  125. package/dist/modules/smtp/smtp.service.d.ts +0 -14
  126. package/dist/modules/smtp/smtp.service.js +12 -40
  127. package/dist/modules/smtp/smtp.service.js.map +1 -1
  128. package/dist/modules/tag/tag.controller.js +22 -24
  129. package/dist/modules/tag/tag.controller.js.map +1 -1
  130. package/dist/modules/tag/tag.entity.js +12 -12
  131. package/dist/modules/tag/tag.entity.js.map +1 -1
  132. package/dist/modules/tag/tag.module.js +1 -1
  133. package/dist/modules/tag/tag.module.js.map +1 -1
  134. package/dist/modules/tag/tag.service.js +4 -5
  135. package/dist/modules/tag/tag.service.js.map +1 -1
  136. package/dist/modules/user/user.controller.js +28 -39
  137. package/dist/modules/user/user.controller.js.map +1 -1
  138. package/dist/modules/user/user.entity.js +22 -22
  139. package/dist/modules/user/user.entity.js.map +1 -1
  140. package/dist/modules/user/user.module.js +2 -2
  141. package/dist/modules/user/user.module.js.map +1 -1
  142. package/dist/modules/user/user.service.js +14 -18
  143. package/dist/modules/user/user.service.js.map +1 -1
  144. package/dist/modules/view/view.controller.js +19 -20
  145. package/dist/modules/view/view.controller.js.map +1 -1
  146. package/dist/modules/view/view.entity.js +24 -24
  147. package/dist/modules/view/view.entity.js.map +1 -1
  148. package/dist/modules/view/view.module.js +1 -1
  149. package/dist/modules/view/view.module.js.map +1 -1
  150. package/dist/modules/view/view.service.js +4 -4
  151. package/dist/modules/view/view.service.js.map +1 -1
  152. package/dist/public/favicon.png +0 -0
  153. package/dist/starter.d.ts +1 -3
  154. package/dist/starter.js +14 -202
  155. package/dist/starter.js.map +1 -1
  156. package/dist/tsconfig.build.tsbuildinfo +15957 -1
  157. package/dist/utils/date.util.js +1 -1
  158. package/dist/utils/date.util.js.map +1 -1
  159. package/dist/utils/markdown.util.js +1 -1
  160. package/dist/utils/markdown.util.js.map +1 -1
  161. package/dist/utils/oss/aliyun-oss-client.d.ts +1 -3
  162. package/dist/utils/oss/aliyun-oss-client.js +0 -5
  163. package/dist/utils/oss/aliyun-oss-client.js.map +1 -1
  164. package/dist/utils/oss/oss-client.d.ts +1 -3
  165. package/dist/utils/oss/oss-client.js.map +1 -1
  166. package/dist/utils/oss.util.d.ts +1 -3
  167. package/dist/utils/oss.util.js +1 -6
  168. package/dist/utils/oss.util.js.map +1 -1
  169. package/dist/utils/uniqueid.util.js +1 -1
  170. package/dist/utils/uniqueid.util.js.map +1 -1
  171. package/dist/utils/upload.util.d.ts +2 -6
  172. package/dist/utils/upload.util.js +8 -23
  173. package/dist/utils/upload.util.js.map +1 -1
  174. package/dist/utils/user.util.d.ts +0 -1
  175. package/dist/utils/user.util.js +2 -6
  176. package/dist/utils/user.util.js.map +1 -1
  177. package/package.json +32 -36
  178. package/public/favicon.png +0 -0
  179. package/dist/common/api-messages.d.ts +0 -41
  180. package/dist/common/api-messages.js +0 -45
  181. package/dist/common/api-messages.js.map +0 -1
  182. package/dist/database/typeorm-options.d.ts +0 -3
  183. package/dist/database/typeorm-options.js +0 -71
  184. package/dist/database/typeorm-options.js.map +0 -1
  185. package/dist/modules/api-key/api-key.controller.d.ts +0 -14
  186. package/dist/modules/api-key/api-key.controller.js +0 -63
  187. package/dist/modules/api-key/api-key.controller.js.map +0 -1
  188. package/dist/modules/api-key/api-key.entity.d.ts +0 -11
  189. package/dist/modules/api-key/api-key.entity.js +0 -63
  190. package/dist/modules/api-key/api-key.entity.js.map +0 -1
  191. package/dist/modules/api-key/api-key.guard.d.ts +0 -7
  192. package/dist/modules/api-key/api-key.guard.js +0 -39
  193. package/dist/modules/api-key/api-key.guard.js.map +0 -1
  194. package/dist/modules/api-key/api-key.module.d.ts +0 -2
  195. package/dist/modules/api-key/api-key.module.js +0 -28
  196. package/dist/modules/api-key/api-key.module.js.map +0 -1
  197. package/dist/modules/api-key/api-key.service.d.ts +0 -15
  198. package/dist/modules/api-key/api-key.service.js +0 -81
  199. package/dist/modules/api-key/api-key.service.js.map +0 -1
  200. package/dist/modules/article/article-revision.entity.d.ts +0 -11
  201. package/dist/modules/article/article-revision.entity.js +0 -53
  202. package/dist/modules/article/article-revision.entity.js.map +0 -1
  203. package/dist/modules/article/article-slug.util.d.ts +0 -2
  204. package/dist/modules/article/article-slug.util.js +0 -19
  205. package/dist/modules/article/article-slug.util.js.map +0 -1
  206. package/dist/modules/article/scheduled-publish.service.d.ts +0 -13
  207. package/dist/modules/article/scheduled-publish.service.js +0 -65
  208. package/dist/modules/article/scheduled-publish.service.js.map +0 -1
  209. package/dist/modules/bootstrap/bootstrap.constants.d.ts +0 -20
  210. package/dist/modules/bootstrap/bootstrap.constants.js +0 -171
  211. package/dist/modules/bootstrap/bootstrap.constants.js.map +0 -1
  212. package/dist/modules/bootstrap/bootstrap.service.d.ts +0 -22
  213. package/dist/modules/bootstrap/bootstrap.service.js +0 -183
  214. package/dist/modules/bootstrap/bootstrap.service.js.map +0 -1
  215. package/dist/modules/bootstrap/install-locale.d.ts +0 -2
  216. package/dist/modules/bootstrap/install-locale.js +0 -11
  217. package/dist/modules/bootstrap/install-locale.js.map +0 -1
  218. package/dist/modules/extension/extension.module.d.ts +0 -9
  219. package/dist/modules/extension/extension.module.js +0 -52
  220. package/dist/modules/extension/extension.module.js.map +0 -1
  221. package/dist/modules/extension/plugin-loader.service.d.ts +0 -12
  222. package/dist/modules/extension/plugin-loader.service.js +0 -96
  223. package/dist/modules/extension/plugin-loader.service.js.map +0 -1
  224. package/dist/modules/extension/plugin-registry.bridge.d.ts +0 -3
  225. package/dist/modules/extension/plugin-registry.bridge.js +0 -44
  226. package/dist/modules/extension/plugin-registry.bridge.js.map +0 -1
  227. package/dist/modules/extension/plugin.controller.d.ts +0 -22
  228. package/dist/modules/extension/plugin.controller.js +0 -155
  229. package/dist/modules/extension/plugin.controller.js.map +0 -1
  230. package/dist/modules/extension/plugin.service.d.ts +0 -54
  231. package/dist/modules/extension/plugin.service.js +0 -414
  232. package/dist/modules/extension/plugin.service.js.map +0 -1
  233. package/dist/modules/extension/preview-draft.store.d.ts +0 -13
  234. package/dist/modules/extension/preview-draft.store.js +0 -41
  235. package/dist/modules/extension/preview-draft.store.js.map +0 -1
  236. package/dist/modules/extension/theme-registry.bridge.d.ts +0 -56
  237. package/dist/modules/extension/theme-registry.bridge.js +0 -68
  238. package/dist/modules/extension/theme-registry.bridge.js.map +0 -1
  239. package/dist/modules/extension/theme.controller.d.ts +0 -66
  240. package/dist/modules/extension/theme.controller.js +0 -301
  241. package/dist/modules/extension/theme.controller.js.map +0 -1
  242. package/dist/modules/extension/theme.service.d.ts +0 -140
  243. package/dist/modules/extension/theme.service.js +0 -1039
  244. package/dist/modules/extension/theme.service.js.map +0 -1
  245. package/dist/modules/file/content-image-scan.util.d.ts +0 -52
  246. package/dist/modules/file/content-image-scan.util.js +0 -222
  247. package/dist/modules/file/content-image-scan.util.js.map +0 -1
  248. package/dist/modules/file/file-optimization.controller.d.ts +0 -12
  249. package/dist/modules/file/file-optimization.controller.js +0 -79
  250. package/dist/modules/file/file-optimization.controller.js.map +0 -1
  251. package/dist/modules/file/file-optimization.service.d.ts +0 -36
  252. package/dist/modules/file/file-optimization.service.js +0 -387
  253. package/dist/modules/file/file-optimization.service.js.map +0 -1
  254. package/dist/modules/file/file-optimization.types.d.ts +0 -66
  255. package/dist/modules/file/file-optimization.types.js +0 -5
  256. package/dist/modules/file/file-optimization.types.js.map +0 -1
  257. package/dist/modules/file/image-optimizer-plugin.guard.d.ts +0 -7
  258. package/dist/modules/file/image-optimizer-plugin.guard.js +0 -33
  259. package/dist/modules/file/image-optimizer-plugin.guard.js.map +0 -1
  260. package/dist/modules/health/health.controller.d.ts +0 -11
  261. package/dist/modules/health/health.controller.js +0 -55
  262. package/dist/modules/health/health.controller.js.map +0 -1
  263. package/dist/modules/health/health.module.d.ts +0 -2
  264. package/dist/modules/health/health.module.js +0 -20
  265. package/dist/modules/health/health.module.js.map +0 -1
  266. package/dist/modules/hook/hook.module.d.ts +0 -2
  267. package/dist/modules/hook/hook.module.js +0 -22
  268. package/dist/modules/hook/hook.module.js.map +0 -1
  269. package/dist/modules/hook/hook.service.d.ts +0 -26
  270. package/dist/modules/hook/hook.service.js +0 -105
  271. package/dist/modules/hook/hook.service.js.map +0 -1
  272. package/dist/modules/webhook/webhook.controller.d.ts +0 -12
  273. package/dist/modules/webhook/webhook.controller.js +0 -63
  274. package/dist/modules/webhook/webhook.controller.js.map +0 -1
  275. package/dist/modules/webhook/webhook.entity.d.ts +0 -9
  276. package/dist/modules/webhook/webhook.entity.js +0 -54
  277. package/dist/modules/webhook/webhook.entity.js.map +0 -1
  278. package/dist/modules/webhook/webhook.module.d.ts +0 -2
  279. package/dist/modules/webhook/webhook.module.js +0 -27
  280. package/dist/modules/webhook/webhook.module.js.map +0 -1
  281. package/dist/modules/webhook/webhook.service.d.ts +0 -16
  282. package/dist/modules/webhook/webhook.service.js +0 -100
  283. package/dist/modules/webhook/webhook.service.js.map +0 -1
  284. package/dist/node-polyfills.d.ts +0 -18
  285. package/dist/node-polyfills.js +0 -24
  286. package/dist/node-polyfills.js.map +0 -1
  287. package/dist/public/apple-touch-icon.png +0 -0
  288. package/dist/public/favicon-16.png +0 -0
  289. package/dist/public/favicon-32.png +0 -0
  290. package/dist/public/favicon-48.png +0 -0
  291. package/dist/public/favicon.ico +0 -0
  292. package/dist/public/icon-192.png +0 -0
  293. package/dist/public/icon-512.png +0 -0
  294. package/dist/public/logo-200.png +0 -0
  295. package/dist/public/logo-400.png +0 -0
  296. package/dist/public/logo.png +0 -0
  297. package/dist/public/logo.svg +0 -7
  298. package/dist/public/uploads/2026-05-30/QR3X4UZQ93ZTUPGXCFA9II..png +0 -0
  299. package/dist/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8.webp +0 -0
  300. package/dist/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8_medium.webp +0 -0
  301. package/dist/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8_thumb.webp +0 -0
  302. package/dist/public/uploads/2026-05-31/I2SZC0ONA7CF31UM46MN56..jpg +0 -0
  303. package/dist/tsconfig.tsbuildinfo +0 -1
  304. package/dist/utils/html-sanitize.util.d.ts +0 -1
  305. package/dist/utils/html-sanitize.util.js +0 -33
  306. package/dist/utils/html-sanitize.util.js.map +0 -1
  307. package/dist/utils/image-processor.util.d.ts +0 -23
  308. package/dist/utils/image-processor.util.js +0 -88
  309. package/dist/utils/image-processor.util.js.map +0 -1
  310. package/dist/utils/local-api-quiet.util.d.ts +0 -1
  311. package/dist/utils/local-api-quiet.util.js +0 -8
  312. package/dist/utils/local-api-quiet.util.js.map +0 -1
  313. package/dist/utils/project-root.util.d.ts +0 -2
  314. package/dist/utils/project-root.util.js +0 -42
  315. package/dist/utils/project-root.util.js.map +0 -1
  316. package/dist/utils/query-whitelist.util.d.ts +0 -1
  317. package/dist/utils/query-whitelist.util.js +0 -100
  318. package/dist/utils/query-whitelist.util.js.map +0 -1
  319. package/dist/utils/theme-placeholder-cover.d.ts +0 -7
  320. package/dist/utils/theme-placeholder-cover.js +0 -94
  321. package/dist/utils/theme-placeholder-cover.js.map +0 -1
  322. package/dist/utils/upload-url.util.d.ts +0 -4
  323. package/dist/utils/upload-url.util.js +0 -34
  324. package/dist/utils/upload-url.util.js.map +0 -1
  325. package/public/apple-touch-icon.png +0 -0
  326. package/public/favicon-16.png +0 -0
  327. package/public/favicon-32.png +0 -0
  328. package/public/favicon-48.png +0 -0
  329. package/public/favicon.ico +0 -0
  330. package/public/icon-192.png +0 -0
  331. package/public/icon-512.png +0 -0
  332. package/public/logo-200.png +0 -0
  333. package/public/logo-400.png +0 -0
  334. package/public/logo.png +0 -0
  335. package/public/logo.svg +0 -7
  336. package/public/uploads/2026-05-30/QR3X4UZQ93ZTUPGXCFA9II..png +0 -0
  337. package/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8.webp +0 -0
  338. package/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8_medium.webp +0 -0
  339. package/public/uploads/2026-05-31/BXQV3NX9ZVWHGNOSX9AXD8_thumb.webp +0 -0
  340. package/public/uploads/2026-05-31/I2SZC0ONA7CF31UM46MN56..jpg +0 -0
@@ -1,22 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.HookModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const hook_service_1 = require("./hook.service");
12
- let HookModule = class HookModule {
13
- };
14
- HookModule = __decorate([
15
- (0, common_1.Global)(),
16
- (0, common_1.Module)({
17
- providers: [hook_service_1.HookService],
18
- exports: [hook_service_1.HookService],
19
- })
20
- ], HookModule);
21
- exports.HookModule = HookModule;
22
- //# sourceMappingURL=hook.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook.module.js","sourceRoot":"","sources":["../../../src/modules/hook/hook.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD,iDAA6C;AAOtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IALtB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,0BAAW,CAAC;QACxB,OAAO,EAAE,CAAC,0BAAW,CAAC;KACvB,CAAC;GACW,UAAU,CAAG;AAAb,gCAAU"}
@@ -1,26 +0,0 @@
1
- import type { ActionCallback, FilterCallback, HookContext, HookRegistrationOptions } from '@fecommunity/reactpress-toolkit/plugin/server';
2
- interface LoadedPluginModule {
3
- pluginId: string;
4
- module: {
5
- register?: (hooks: HookService, ctx: unknown) => void | Promise<void>;
6
- deactivate?: () => void | Promise<void>;
7
- default?: {
8
- register?: (hooks: HookService, ctx: unknown) => void | Promise<void>;
9
- deactivate?: () => void | Promise<void>;
10
- };
11
- };
12
- }
13
- export declare class HookService {
14
- private readonly logger;
15
- private readonly filters;
16
- private readonly actions;
17
- private readonly loadedModules;
18
- applyFilters<T>(name: string, value: T, ctx?: HookContext): Promise<T>;
19
- doAction(name: string, payload?: unknown, ctx?: HookContext): Promise<void>;
20
- addFilter<T>(name: string, callback: FilterCallback<T>, options?: HookRegistrationOptions): () => void;
21
- addAction(name: string, callback: ActionCallback, options?: HookRegistrationOptions): () => void;
22
- removePluginHooks(pluginId: string): void;
23
- registerLoadedModule(pluginId: string, module: LoadedPluginModule['module']): void;
24
- deactivatePluginModule(pluginId: string): Promise<void>;
25
- }
26
- export {};
@@ -1,105 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var HookService_1;
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.HookService = void 0;
11
- const common_1 = require("@nestjs/common");
12
- const server_1 = require("../../../../toolkit/dist/plugin/server");
13
- let HookService = HookService_1 = class HookService {
14
- constructor() {
15
- this.logger = new common_1.Logger(HookService_1.name);
16
- this.filters = new Map();
17
- this.actions = new Map();
18
- this.loadedModules = new Map();
19
- }
20
- async applyFilters(name, value, ctx) {
21
- var _a;
22
- const list = [...((_a = this.filters.get(name)) !== null && _a !== void 0 ? _a : [])].sort((a, b) => a.priority - b.priority);
23
- let current = value;
24
- for (const reg of list) {
25
- try {
26
- current = (await reg.callback(current, Object.assign(Object.assign({}, ctx), { pluginId: reg.pluginId })));
27
- }
28
- catch (err) {
29
- this.logger.warn(`Filter "${name}" failed${reg.pluginId ? ` (plugin: ${reg.pluginId})` : ''}: ${err instanceof Error ? err.message : String(err)}`);
30
- }
31
- }
32
- return current;
33
- }
34
- async doAction(name, payload, ctx) {
35
- var _a;
36
- const list = [...((_a = this.actions.get(name)) !== null && _a !== void 0 ? _a : [])].sort((a, b) => a.priority - b.priority);
37
- for (const reg of list) {
38
- try {
39
- await reg.callback(payload, Object.assign(Object.assign({}, ctx), { pluginId: reg.pluginId }));
40
- }
41
- catch (err) {
42
- this.logger.warn(`Action "${name}" failed${reg.pluginId ? ` (plugin: ${reg.pluginId})` : ''}: ${err instanceof Error ? err.message : String(err)}`);
43
- }
44
- }
45
- }
46
- addFilter(name, callback, options) {
47
- var _a, _b;
48
- const reg = {
49
- callback: callback,
50
- priority: (_a = options === null || options === void 0 ? void 0 : options.priority) !== null && _a !== void 0 ? _a : 10,
51
- pluginId: options === null || options === void 0 ? void 0 : options.pluginId,
52
- };
53
- const list = (_b = this.filters.get(name)) !== null && _b !== void 0 ? _b : [];
54
- list.push(reg);
55
- this.filters.set(name, list);
56
- return () => {
57
- var _a;
58
- const current = (_a = this.filters.get(name)) !== null && _a !== void 0 ? _a : [];
59
- this.filters.set(name, current.filter((item) => item !== reg));
60
- };
61
- }
62
- addAction(name, callback, options) {
63
- var _a, _b;
64
- const reg = {
65
- callback,
66
- priority: (_a = options === null || options === void 0 ? void 0 : options.priority) !== null && _a !== void 0 ? _a : 10,
67
- pluginId: options === null || options === void 0 ? void 0 : options.pluginId,
68
- };
69
- const list = (_b = this.actions.get(name)) !== null && _b !== void 0 ? _b : [];
70
- list.push(reg);
71
- this.actions.set(name, list);
72
- return () => {
73
- var _a;
74
- const current = (_a = this.actions.get(name)) !== null && _a !== void 0 ? _a : [];
75
- this.actions.set(name, current.filter((item) => item !== reg));
76
- };
77
- }
78
- removePluginHooks(pluginId) {
79
- for (const [name, list] of this.filters.entries()) {
80
- this.filters.set(name, list.filter((reg) => reg.pluginId !== pluginId));
81
- }
82
- for (const [name, list] of this.actions.entries()) {
83
- this.actions.set(name, list.filter((reg) => reg.pluginId !== pluginId));
84
- }
85
- }
86
- registerLoadedModule(pluginId, module) {
87
- this.loadedModules.set(pluginId, { pluginId, module });
88
- }
89
- async deactivatePluginModule(pluginId) {
90
- var _a;
91
- const loaded = this.loadedModules.get(pluginId);
92
- if (!loaded)
93
- return;
94
- const mod = (_a = loaded.module.default) !== null && _a !== void 0 ? _a : loaded.module;
95
- if (typeof mod.deactivate === 'function') {
96
- await mod.deactivate();
97
- }
98
- this.loadedModules.delete(pluginId);
99
- }
100
- };
101
- HookService = HookService_1 = __decorate([
102
- (0, common_1.Injectable)()
103
- ], HookService);
104
- exports.HookService = HookService;
105
- //# sourceMappingURL=hook.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook.service.js","sourceRoot":"","sources":["../../../src/modules/hook/hook.service.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { WebhookService } from './webhook.service';
2
- export declare class WebhookController {
3
- private readonly webhookService;
4
- constructor(webhookService: WebhookService);
5
- list(): Promise<import("./webhook.entity").Webhook[]>;
6
- create(body: {
7
- url: string;
8
- events: string;
9
- secret?: string;
10
- }): Promise<import("./webhook.entity").Webhook>;
11
- remove(id: string): Promise<import("./webhook.entity").Webhook>;
12
- }
@@ -1,63 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.WebhookController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const jwt_auth_guard_1 = require("../auth/jwt-auth.guard");
19
- const roles_guard_1 = require("../auth/roles.guard");
20
- const webhook_service_1 = require("./webhook.service");
21
- let WebhookController = class WebhookController {
22
- constructor(webhookService) {
23
- this.webhookService = webhookService;
24
- }
25
- list() {
26
- return this.webhookService.findAll();
27
- }
28
- create(body) {
29
- return this.webhookService.create(body);
30
- }
31
- remove(id) {
32
- return this.webhookService.remove(id);
33
- }
34
- };
35
- __decorate([
36
- (0, common_1.Get)(),
37
- __metadata("design:type", Function),
38
- __metadata("design:paramtypes", []),
39
- __metadata("design:returntype", void 0)
40
- ], WebhookController.prototype, "list", null);
41
- __decorate([
42
- (0, common_1.Post)(),
43
- __param(0, (0, common_1.Body)()),
44
- __metadata("design:type", Function),
45
- __metadata("design:paramtypes", [Object]),
46
- __metadata("design:returntype", void 0)
47
- ], WebhookController.prototype, "create", null);
48
- __decorate([
49
- (0, common_1.Delete)(':id'),
50
- __param(0, (0, common_1.Param)('id')),
51
- __metadata("design:type", Function),
52
- __metadata("design:paramtypes", [String]),
53
- __metadata("design:returntype", void 0)
54
- ], WebhookController.prototype, "remove", null);
55
- WebhookController = __decorate([
56
- (0, swagger_1.ApiTags)('Webhook'),
57
- (0, common_1.Controller)('webhook'),
58
- (0, common_1.UseGuards)(roles_guard_1.RolesGuard, jwt_auth_guard_1.JwtAuthGuard),
59
- (0, roles_guard_1.Roles)('admin'),
60
- __metadata("design:paramtypes", [webhook_service_1.WebhookService])
61
- ], WebhookController);
62
- exports.WebhookController = WebhookController;
63
- //# sourceMappingURL=webhook.controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook.controller.js","sourceRoot":"","sources":["../../../src/modules/webhook/webhook.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAuF;AACvF,6CAA0C;AAE1C,2DAAsD;AACtD,qDAAwD;AACxD,uDAAmD;AAM5C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAG/D,IAAI;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC;IAGD,MAAM,CAAS,IAAsD;QACnE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAGD,MAAM,CAAc,EAAU;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AAdC;IAAC,IAAA,YAAG,GAAE;;;;6CAGL;AAED;IAAC,IAAA,aAAI,GAAE;IACC,WAAA,IAAA,aAAI,GAAE,CAAA;;;;+CAEb;AAED;IAAC,IAAA,eAAM,EAAC,KAAK,CAAC;IACN,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;+CAElB;AAhBU,iBAAiB;IAJ7B,IAAA,iBAAO,EAAC,SAAS,CAAC;IAClB,IAAA,mBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,kBAAS,EAAC,wBAAU,EAAE,6BAAY,CAAC;IACnC,IAAA,mBAAK,EAAC,OAAO,CAAC;qCAEgC,gCAAc;GADhD,iBAAiB,CAiB7B;AAjBY,8CAAiB"}
@@ -1,9 +0,0 @@
1
- export declare class Webhook {
2
- id: string;
3
- url: string;
4
- secret: string;
5
- events: string;
6
- enabled: boolean;
7
- createAt: Date;
8
- updateAt: Date;
9
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.Webhook = void 0;
13
- const swagger_1 = require("@nestjs/swagger");
14
- const typeorm_1 = require("typeorm");
15
- let Webhook = class Webhook {
16
- };
17
- __decorate([
18
- (0, swagger_1.ApiProperty)(),
19
- (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
20
- __metadata("design:type", String)
21
- ], Webhook.prototype, "id", void 0);
22
- __decorate([
23
- (0, swagger_1.ApiProperty)(),
24
- (0, typeorm_1.Column)(),
25
- __metadata("design:type", String)
26
- ], Webhook.prototype, "url", void 0);
27
- __decorate([
28
- (0, swagger_1.ApiProperty)(),
29
- (0, typeorm_1.Column)({ select: false }),
30
- __metadata("design:type", String)
31
- ], Webhook.prototype, "secret", void 0);
32
- __decorate([
33
- (0, swagger_1.ApiProperty)({ description: 'Comma-separated: article.published, comment.created' }),
34
- (0, typeorm_1.Column)(),
35
- __metadata("design:type", String)
36
- ], Webhook.prototype, "events", void 0);
37
- __decorate([
38
- (0, swagger_1.ApiProperty)(),
39
- (0, typeorm_1.Column)({ default: true }),
40
- __metadata("design:type", Boolean)
41
- ], Webhook.prototype, "enabled", void 0);
42
- __decorate([
43
- (0, typeorm_1.CreateDateColumn)({ name: 'create_at' }),
44
- __metadata("design:type", Date)
45
- ], Webhook.prototype, "createAt", void 0);
46
- __decorate([
47
- (0, typeorm_1.UpdateDateColumn)({ name: 'update_at' }),
48
- __metadata("design:type", Date)
49
- ], Webhook.prototype, "updateAt", void 0);
50
- Webhook = __decorate([
51
- (0, typeorm_1.Entity)('webhooks')
52
- ], Webhook);
53
- exports.Webhook = Webhook;
54
- //# sourceMappingURL=webhook.entity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook.entity.js","sourceRoot":"","sources":["../../../src/modules/webhook/webhook.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qCAAqG;AAG9F,IAAM,OAAO,GAAb,MAAM,OAAO;CA0BnB,CAAA;AAzBC;IAAC,IAAA,qBAAW,GAAE;IACb,IAAA,gCAAsB,EAAC,MAAM,CAAC;;mCACpB;AAEX;IAAC,IAAA,qBAAW,GAAE;IACb,IAAA,gBAAM,GAAE;;oCACG;AAEZ;IAAC,IAAA,qBAAW,GAAE;IACb,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;uCACX;AAEf;IAAC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;IACnF,IAAA,gBAAM,GAAE;;uCACM;AAEf;IAAC,IAAA,qBAAW,GAAE;IACb,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wCACT;AAEjB;IAAC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BAC9B,IAAI;yCAAC;AAEf;IAAC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BAC9B,IAAI;yCAAC;AAzBJ,OAAO;IADnB,IAAA,gBAAM,EAAC,UAAU,CAAC;GACN,OAAO,CA0BnB;AA1BY,0BAAO"}
@@ -1,2 +0,0 @@
1
- export declare class WebhookModule {
2
- }
@@ -1,27 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.WebhookModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const typeorm_1 = require("@nestjs/typeorm");
12
- const auth_module_1 = require("../auth/auth.module");
13
- const webhook_controller_1 = require("./webhook.controller");
14
- const webhook_entity_1 = require("./webhook.entity");
15
- const webhook_service_1 = require("./webhook.service");
16
- let WebhookModule = class WebhookModule {
17
- };
18
- WebhookModule = __decorate([
19
- (0, common_1.Module)({
20
- imports: [typeorm_1.TypeOrmModule.forFeature([webhook_entity_1.Webhook]), auth_module_1.AuthModule],
21
- controllers: [webhook_controller_1.WebhookController],
22
- providers: [webhook_service_1.WebhookService],
23
- exports: [webhook_service_1.WebhookService],
24
- })
25
- ], WebhookModule);
26
- exports.WebhookModule = WebhookModule;
27
- //# sourceMappingURL=webhook.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook.module.js","sourceRoot":"","sources":["../../../src/modules/webhook/webhook.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAEhD,qDAAiD;AACjD,6DAAyD;AACzD,qDAA2C;AAC3C,uDAAmD;AAQ5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IANzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uBAAa,CAAC,UAAU,CAAC,CAAC,wBAAO,CAAC,CAAC,EAAE,wBAAU,CAAC;QAC1D,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa"}
@@ -1,16 +0,0 @@
1
- import { Repository } from 'typeorm';
2
- import { Webhook } from './webhook.entity';
3
- export type WebhookEvent = 'article.published' | 'comment.created';
4
- export declare class WebhookService {
5
- private readonly webhookRepository;
6
- constructor(webhookRepository: Repository<Webhook>);
7
- create(data: Partial<Webhook> & {
8
- secret?: string;
9
- }): Promise<Webhook>;
10
- findAll(): Promise<Webhook[]>;
11
- remove(id: string): Promise<Webhook>;
12
- private signPayload;
13
- private deliverOnce;
14
- private deliverWithRetry;
15
- dispatch(event: WebhookEvent, payload: Record<string, unknown>): Promise<void>;
16
- }
@@ -1,100 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.WebhookService = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const typeorm_1 = require("@nestjs/typeorm");
18
- const axios_1 = require("axios");
19
- const crypto = require("crypto");
20
- const typeorm_2 = require("typeorm");
21
- const api_messages_1 = require("../../common/api-messages");
22
- const webhook_entity_1 = require("./webhook.entity");
23
- let WebhookService = class WebhookService {
24
- constructor(webhookRepository) {
25
- this.webhookRepository = webhookRepository;
26
- }
27
- async create(data) {
28
- const secret = data.secret || crypto.randomBytes(16).toString('hex');
29
- const entity = this.webhookRepository.create(Object.assign(Object.assign({}, data), { secret }));
30
- return this.webhookRepository.save(entity);
31
- }
32
- findAll() {
33
- return this.webhookRepository.find({ order: { createAt: 'DESC' } });
34
- }
35
- async remove(id) {
36
- const hook = await this.webhookRepository.findOne(id);
37
- if (!hook) {
38
- throw new common_1.HttpException(api_messages_1.ApiMsg.WEBHOOK_NOT_FOUND, common_1.HttpStatus.NOT_FOUND);
39
- }
40
- return this.webhookRepository.remove(hook);
41
- }
42
- signPayload(secret, body) {
43
- return crypto
44
- .createHmac('sha256', secret)
45
- .update(body)
46
- .digest('hex');
47
- }
48
- async deliverOnce(webhook, event, payload) {
49
- const body = JSON.stringify({
50
- event,
51
- timestamp: new Date().toISOString(),
52
- data: payload,
53
- });
54
- const signature = this.signPayload(webhook.secret, body);
55
- await axios_1.default.post(webhook.url, body, {
56
- headers: {
57
- 'Content-Type': 'application/json',
58
- 'X-ReactPress-Event': event,
59
- 'X-ReactPress-Signature': `sha256=${signature}`,
60
- },
61
- timeout: 10000,
62
- });
63
- }
64
- async deliverWithRetry(webhook, event, payload) {
65
- const delays = [0, 2000, 5000];
66
- let lastError = null;
67
- for (let attempt = 0; attempt < delays.length; attempt++) {
68
- if (delays[attempt] > 0) {
69
- await new Promise((r) => setTimeout(r, delays[attempt]));
70
- }
71
- try {
72
- await this.deliverOnce(webhook, event, payload);
73
- return;
74
- }
75
- catch (err) {
76
- lastError = err;
77
- }
78
- }
79
- console.error(`[Webhook] 投递失败 ${webhook.url} (${event}):`, (lastError === null || lastError === void 0 ? void 0 : lastError.message) || lastError);
80
- }
81
- async dispatch(event, payload) {
82
- const hooks = await this.webhookRepository
83
- .createQueryBuilder('webhook')
84
- .addSelect('webhook.secret')
85
- .where('webhook.enabled = :enabled', { enabled: true })
86
- .getMany();
87
- const targets = hooks.filter((h) => h.events
88
- .split(',')
89
- .map((e) => e.trim())
90
- .includes(event));
91
- await Promise.all(targets.map((hook) => this.deliverWithRetry(hook, event, payload)));
92
- }
93
- };
94
- WebhookService = __decorate([
95
- (0, common_1.Injectable)(),
96
- __param(0, (0, typeorm_1.InjectRepository)(webhook_entity_1.Webhook)),
97
- __metadata("design:paramtypes", [typeorm_2.Repository])
98
- ], WebhookService);
99
- exports.WebhookService = WebhookService;
100
- //# sourceMappingURL=webhook.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook.service.js","sourceRoot":"","sources":["../../../src/modules/webhook/webhook.service.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- declare const util: Record<string, unknown> & {
2
- isArray?: (value: unknown) => boolean;
3
- isBoolean?: (value: unknown) => boolean;
4
- isBuffer?: (value: unknown) => boolean;
5
- isDate?: (value: unknown) => boolean;
6
- isError?: (value: unknown) => boolean;
7
- isFunction?: (value: unknown) => boolean;
8
- isNull?: (value: unknown) => boolean;
9
- isNullOrUndefined?: (value: unknown) => boolean;
10
- isNumber?: (value: unknown) => boolean;
11
- isObject?: (value: unknown) => boolean;
12
- isPrimitive?: (value: unknown) => boolean;
13
- isRegExp?: (value: unknown) => boolean;
14
- isString?: (value: unknown) => boolean;
15
- isSymbol?: (value: unknown) => boolean;
16
- isUndefined?: (value: unknown) => boolean;
17
- };
18
- declare const polyfills: Record<string, (value: unknown) => boolean>;
@@ -1,24 +0,0 @@
1
- const util = require('util');
2
- const polyfills = {
3
- isArray: (value) => Array.isArray(value),
4
- isBoolean: (value) => typeof value === 'boolean',
5
- isBuffer: (value) => Buffer.isBuffer(value),
6
- isDate: (value) => value instanceof Date,
7
- isError: (value) => value instanceof Error,
8
- isFunction: (value) => typeof value === 'function',
9
- isNull: (value) => value === null,
10
- isNullOrUndefined: (value) => value === null || value === undefined,
11
- isNumber: (value) => typeof value === 'number',
12
- isObject: (value) => value !== null && typeof value === 'object',
13
- isPrimitive: (value) => value === null || (typeof value !== 'object' && typeof value !== 'function'),
14
- isRegExp: (value) => value instanceof RegExp,
15
- isString: (value) => typeof value === 'string',
16
- isSymbol: (value) => typeof value === 'symbol',
17
- isUndefined: (value) => typeof value === 'undefined',
18
- };
19
- for (const [name, fn] of Object.entries(polyfills)) {
20
- if (typeof util[name] !== 'function') {
21
- util[name] = fn;
22
- }
23
- }
24
- //# sourceMappingURL=node-polyfills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-polyfills.js","sourceRoot":"","sources":["../src/node-polyfills.ts"],"names":[],"mappings":"AAKA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAgB1B,CAAC;AAEF,MAAM,SAAS,GAAgD;IAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACxC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,SAAS;IAChD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,IAAI;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,KAAK;IAC1C,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,UAAU;IAClD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI;IACjC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;IAChE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;IACpG,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,MAAM;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;IAC9C,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW;CACrD,CAAC;AAEF,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;IAClD,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;KACjB;CACF"}
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,7 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 112 102" fill="none" role="img" aria-label="ReactPress">
2
- <title>ReactPress</title>
3
- <g><path fill="none" stroke="#087ea4" stroke-width="5.333" stroke-linecap="round" d="M56 75.165c29.455 0 53.333-10.745 53.333-24s-23.878-24-53.333-24-53.334 10.745-53.334 24 23.879 24 53.334 24Z"/>
4
- <path fill="none" stroke="#087ea4" stroke-width="5.333" stroke-linecap="round" d="M35.215 63.165c14.728 25.509 35.972 40.815 47.451 34.188 11.48-6.628 8.846-32.68-5.882-58.188-14.727-25.51-35.972-40.816-47.45-34.188-11.48 6.627-8.846 32.679 5.881 58.188Z"/>
5
- <path fill="none" stroke="#087ea4" stroke-width="5.333" stroke-linecap="round" d="M35.215 39.165c-14.727 25.509-17.36 51.56-5.882 58.188 11.48 6.627 32.724-8.68 47.451-34.188 14.728-25.51 17.362-51.56 5.883-58.188-11.48-6.628-32.724 8.679-47.452 34.188Z"/></g>
6
- <text x="56" y="52" text-anchor="middle" dominant-baseline="central" fill="#087ea4" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" font-size="33" font-weight="600" letter-spacing="-0.03em">P</text>
7
- </svg>