create-pardx-scaffold 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/README.md +45 -0
  2. package/cli.js +104 -0
  3. package/package.json +15 -0
  4. package/template/.cursorrules +479 -0
  5. package/template/.prettierignore +29 -0
  6. package/template/.prettierrc +11 -0
  7. package/template/.vscode/extensions.json +8 -0
  8. package/template/.vscode/settings.json +122 -0
  9. package/template/CLAUDE.md +762 -0
  10. package/template/README.md +125 -0
  11. package/template/apps/api/.env.example +11 -0
  12. package/template/apps/api/.eslintrc.js +222 -0
  13. package/template/apps/api/config.local.yaml +397 -0
  14. package/template/apps/api/libs/domain/auth/package.json +11 -0
  15. package/template/apps/api/libs/domain/auth/src/README.md +189 -0
  16. package/template/apps/api/libs/domain/auth/src/auth-validation.service.ts +37 -0
  17. package/template/apps/api/libs/domain/auth/src/auth.guard.ts +173 -0
  18. package/template/apps/api/libs/domain/auth/src/auth.module.ts +23 -0
  19. package/template/apps/api/libs/domain/auth/src/auth.service.ts +198 -0
  20. package/template/apps/api/libs/domain/auth/src/auth.ts +66 -0
  21. package/template/apps/api/libs/domain/auth/src/decorators/presets.decorator.ts +50 -0
  22. package/template/apps/api/libs/domain/auth/src/decorators/rbac.decorator.ts +67 -0
  23. package/template/apps/api/libs/domain/auth/src/decorators/resource-owner.decorator.ts +67 -0
  24. package/template/apps/api/libs/domain/auth/src/dto/auth.dto.ts +10 -0
  25. package/template/apps/api/libs/domain/auth/src/guards/streaming-asr-session.guard.ts +179 -0
  26. package/template/apps/api/libs/domain/auth/src/index.ts +12 -0
  27. package/template/apps/api/libs/domain/auth/src/types/auth.interface.ts +52 -0
  28. package/template/apps/api/libs/domain/auth/tsconfig.lib.json +9 -0
  29. package/template/apps/api/libs/domain/db/package.json +11 -0
  30. package/template/apps/api/libs/domain/db/src/index.ts +14 -0
  31. package/template/apps/api/libs/domain/db/src/modules/country-code/country-code.module.ts +12 -0
  32. package/template/apps/api/libs/domain/db/src/modules/country-code/country-code.service.ts +140 -0
  33. package/template/apps/api/libs/domain/db/src/modules/country-code/index.ts +2 -0
  34. package/template/apps/api/libs/domain/db/src/modules/discord-auth/discord-auth.module.ts +12 -0
  35. package/template/apps/api/libs/domain/db/src/modules/discord-auth/discord-auth.service.ts +101 -0
  36. package/template/apps/api/libs/domain/db/src/modules/discord-auth/index.ts +2 -0
  37. package/template/apps/api/libs/domain/db/src/modules/email-auth/email-auth.module.ts +12 -0
  38. package/template/apps/api/libs/domain/db/src/modules/email-auth/email-auth.service.ts +101 -0
  39. package/template/apps/api/libs/domain/db/src/modules/email-auth/index.ts +2 -0
  40. package/template/apps/api/libs/domain/db/src/modules/file-source/file-source.module.ts +12 -0
  41. package/template/apps/api/libs/domain/db/src/modules/file-source/file-source.service.ts +109 -0
  42. package/template/apps/api/libs/domain/db/src/modules/file-source/index.ts +2 -0
  43. package/template/apps/api/libs/domain/db/src/modules/google-auth/google-auth.module.ts +12 -0
  44. package/template/apps/api/libs/domain/db/src/modules/google-auth/google-auth.service.ts +101 -0
  45. package/template/apps/api/libs/domain/db/src/modules/google-auth/index.ts +2 -0
  46. package/template/apps/api/libs/domain/db/src/modules/message/index.ts +2 -0
  47. package/template/apps/api/libs/domain/db/src/modules/message/message.module.ts +10 -0
  48. package/template/apps/api/libs/domain/db/src/modules/message/message.service.ts +314 -0
  49. package/template/apps/api/libs/domain/db/src/modules/mobile-auth/index.ts +2 -0
  50. package/template/apps/api/libs/domain/db/src/modules/mobile-auth/mobile-auth.module.ts +12 -0
  51. package/template/apps/api/libs/domain/db/src/modules/mobile-auth/mobile-auth.service.ts +101 -0
  52. package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/index.ts +2 -0
  53. package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/risk-detection-record.module.ts +12 -0
  54. package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/risk-detection-record.service.ts +101 -0
  55. package/template/apps/api/libs/domain/db/src/modules/system-task-queue/index.ts +2 -0
  56. package/template/apps/api/libs/domain/db/src/modules/system-task-queue/system-task-queue.module.ts +12 -0
  57. package/template/apps/api/libs/domain/db/src/modules/system-task-queue/system-task-queue.service.ts +101 -0
  58. package/template/apps/api/libs/domain/db/src/modules/user-info/index.ts +2 -0
  59. package/template/apps/api/libs/domain/db/src/modules/user-info/user-info.module.ts +12 -0
  60. package/template/apps/api/libs/domain/db/src/modules/user-info/user-info.service.ts +139 -0
  61. package/template/apps/api/libs/domain/db/src/modules/wechat-auth/index.ts +2 -0
  62. package/template/apps/api/libs/domain/db/src/modules/wechat-auth/wechat-auth.module.ts +12 -0
  63. package/template/apps/api/libs/domain/db/src/modules/wechat-auth/wechat-auth.service.ts +101 -0
  64. package/template/apps/api/libs/domain/db/tsconfig.lib.json +9 -0
  65. package/template/apps/api/libs/infra/clients/internal/ai/index.ts +2 -0
  66. package/template/apps/api/libs/infra/clients/internal/ai/risk-detection.client.ts +301 -0
  67. package/template/apps/api/libs/infra/clients/internal/ai/risk-detection.module.ts +22 -0
  68. package/template/apps/api/libs/infra/clients/internal/crypt/crypt-client.service.spec.ts +18 -0
  69. package/template/apps/api/libs/infra/clients/internal/crypt/crypt.client.ts +37 -0
  70. package/template/apps/api/libs/infra/clients/internal/crypt/crypt.module.ts +10 -0
  71. package/template/apps/api/libs/infra/clients/internal/crypt/index.ts +2 -0
  72. package/template/apps/api/libs/infra/clients/internal/email/dto/email.dto.ts +75 -0
  73. package/template/apps/api/libs/infra/clients/internal/email/index.ts +11 -0
  74. package/template/apps/api/libs/infra/clients/internal/email/sendcloud.client.ts +400 -0
  75. package/template/apps/api/libs/infra/clients/internal/file-cdn/README.md +255 -0
  76. package/template/apps/api/libs/infra/clients/internal/file-cdn/dto/file-cdn.dto.ts +96 -0
  77. package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn-client.service.spec.ts +18 -0
  78. package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn.client.ts +620 -0
  79. package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn.module.ts +19 -0
  80. package/template/apps/api/libs/infra/clients/internal/file-cdn/index.ts +40 -0
  81. package/template/apps/api/libs/infra/clients/internal/file-storage/config/file.config.ts +14 -0
  82. package/template/apps/api/libs/infra/clients/internal/file-storage/dto/file.dto.ts +127 -0
  83. package/template/apps/api/libs/infra/clients/internal/file-storage/file-gcs.client.ts +154 -0
  84. package/template/apps/api/libs/infra/clients/internal/file-storage/file-qiniu.client.ts +729 -0
  85. package/template/apps/api/libs/infra/clients/internal/file-storage/file-s3.client.ts +1097 -0
  86. package/template/apps/api/libs/infra/clients/internal/file-storage/file-storage.interface.ts +114 -0
  87. package/template/apps/api/libs/infra/clients/internal/file-storage/file-tos.client.ts +767 -0
  88. package/template/apps/api/libs/infra/clients/internal/file-storage/file-us3.client.ts +176 -0
  89. package/template/apps/api/libs/infra/clients/internal/file-storage/index.ts +16 -0
  90. package/template/apps/api/libs/infra/clients/internal/ocr/dto/ocr.dto.ts +61 -0
  91. package/template/apps/api/libs/infra/clients/internal/ocr/index.ts +3 -0
  92. package/template/apps/api/libs/infra/clients/internal/ocr/ocr.client.ts +123 -0
  93. package/template/apps/api/libs/infra/clients/internal/ocr/ocr.module.ts +15 -0
  94. package/template/apps/api/libs/infra/clients/internal/openai/index.ts +2 -0
  95. package/template/apps/api/libs/infra/clients/internal/openai/openai.client.ts +135 -0
  96. package/template/apps/api/libs/infra/clients/internal/openai/openai.module.ts +17 -0
  97. package/template/apps/api/libs/infra/clients/internal/openspeech/README.md +508 -0
  98. package/template/apps/api/libs/infra/clients/internal/openspeech/index.ts +44 -0
  99. package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.client.ts +441 -0
  100. package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.factory.ts +450 -0
  101. package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.module.ts +56 -0
  102. package/template/apps/api/libs/infra/clients/internal/openspeech/providers/aliyun.provider.ts +308 -0
  103. package/template/apps/api/libs/infra/clients/internal/openspeech/providers/base.provider.ts +114 -0
  104. package/template/apps/api/libs/infra/clients/internal/openspeech/providers/index.ts +10 -0
  105. package/template/apps/api/libs/infra/clients/internal/openspeech/providers/volcengine-streaming.provider.ts +1689 -0
  106. package/template/apps/api/libs/infra/clients/internal/openspeech/providers/volcengine.provider.ts +387 -0
  107. package/template/apps/api/libs/infra/clients/internal/openspeech/types.ts +467 -0
  108. package/template/apps/api/libs/infra/clients/internal/sms/dto/sms.dto.ts +97 -0
  109. package/template/apps/api/libs/infra/clients/internal/sms/index.ts +15 -0
  110. package/template/apps/api/libs/infra/clients/internal/sms/sms-aliyun.client.ts +52 -0
  111. package/template/apps/api/libs/infra/clients/internal/sms/sms-http.client.ts +111 -0
  112. package/template/apps/api/libs/infra/clients/internal/sms/sms-tencent.client.ts +54 -0
  113. package/template/apps/api/libs/infra/clients/internal/sms/sms-volcengine.client.ts +165 -0
  114. package/template/apps/api/libs/infra/clients/internal/sms/sms-zxjc.client.ts +47 -0
  115. package/template/apps/api/libs/infra/clients/internal/sse/index.ts +2 -0
  116. package/template/apps/api/libs/infra/clients/internal/sse/sse-client.service.spec.ts +18 -0
  117. package/template/apps/api/libs/infra/clients/internal/sse/sse.client.ts +360 -0
  118. package/template/apps/api/libs/infra/clients/internal/sse/sse.module.ts +17 -0
  119. package/template/apps/api/libs/infra/clients/internal/third-party-sse/index.ts +2 -0
  120. package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.client.ts +51 -0
  121. package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.module.ts +10 -0
  122. package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.service.spec.ts +18 -0
  123. package/template/apps/api/libs/infra/clients/internal/verify/index.ts +2 -0
  124. package/template/apps/api/libs/infra/clients/internal/verify/verify.client.ts +42 -0
  125. package/template/apps/api/libs/infra/clients/internal/verify/verify.module.ts +10 -0
  126. package/template/apps/api/libs/infra/clients/internal/volcengine-tts/dto/tts.dto.ts +64 -0
  127. package/template/apps/api/libs/infra/clients/internal/volcengine-tts/index.ts +3 -0
  128. package/template/apps/api/libs/infra/clients/internal/volcengine-tts/volcengine-tts.client.ts +846 -0
  129. package/template/apps/api/libs/infra/clients/internal/volcengine-tts/volcengine-tts.module.ts +21 -0
  130. package/template/apps/api/libs/infra/clients/internal/wechat/index.ts +2 -0
  131. package/template/apps/api/libs/infra/clients/internal/wechat/wechat-client.service.spec.ts +18 -0
  132. package/template/apps/api/libs/infra/clients/internal/wechat/wechat.client.ts +4 -0
  133. package/template/apps/api/libs/infra/clients/internal/wechat/wechat.module.ts +8 -0
  134. package/template/apps/api/libs/infra/clients/plugin/decorators/inject-client.decorator.ts +60 -0
  135. package/template/apps/api/libs/infra/clients/plugin/index.ts +21 -0
  136. package/template/apps/api/libs/infra/clients/plugin/interceptors/http-logging.interceptor.ts +130 -0
  137. package/template/apps/api/libs/infra/clients/plugin/interfaces/client.interface.ts +86 -0
  138. package/template/apps/api/libs/infra/clients/plugin/utils/retry.util.ts +157 -0
  139. package/template/apps/api/libs/infra/common/adapters/base.adapter.ts +94 -0
  140. package/template/apps/api/libs/infra/common/adapters/index.ts +38 -0
  141. package/template/apps/api/libs/infra/common/config/README.md +254 -0
  142. package/template/apps/api/libs/infra/common/config/agentx.config.ts +91 -0
  143. package/template/apps/api/libs/infra/common/config/configuration.ts +289 -0
  144. package/template/apps/api/libs/infra/common/config/constant/config.constants.ts +92 -0
  145. package/template/apps/api/libs/infra/common/config/dto/config.dto.ts +282 -0
  146. package/template/apps/api/libs/infra/common/config/package.json +11 -0
  147. package/template/apps/api/libs/infra/common/config/validation/env.validation.ts +161 -0
  148. package/template/apps/api/libs/infra/common/config/validation/index.ts +188 -0
  149. package/template/apps/api/libs/infra/common/config/validation/keys.validation.ts +564 -0
  150. package/template/apps/api/libs/infra/common/config/validation/yaml.validation.ts +582 -0
  151. package/template/apps/api/libs/infra/common/decorators/app-version/app-version.controller.ts +135 -0
  152. package/template/apps/api/libs/infra/common/decorators/app-version/app-version.interceptor.ts +36 -0
  153. package/template/apps/api/libs/infra/common/decorators/app-version/app-version.module.ts +27 -0
  154. package/template/apps/api/libs/infra/common/decorators/app-version/app-version.service.ts +252 -0
  155. package/template/apps/api/libs/infra/common/decorators/app-version/index.ts +13 -0
  156. package/template/apps/api/libs/infra/common/decorators/cache/cache.decorator.ts +437 -0
  157. package/template/apps/api/libs/infra/common/decorators/cache/cache.interceptor.ts +268 -0
  158. package/template/apps/api/libs/infra/common/decorators/cache/cache.module.ts +24 -0
  159. package/template/apps/api/libs/infra/common/decorators/cache/index.ts +33 -0
  160. package/template/apps/api/libs/infra/common/decorators/event/event.decorator.ts +229 -0
  161. package/template/apps/api/libs/infra/common/decorators/event/event.interceptor.ts +155 -0
  162. package/template/apps/api/libs/infra/common/decorators/event/event.module.ts +47 -0
  163. package/template/apps/api/libs/infra/common/decorators/event/handlers/cache-event.handler.ts +159 -0
  164. package/template/apps/api/libs/infra/common/decorators/event/index.ts +29 -0
  165. package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.decorator.ts +221 -0
  166. package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.interceptor.ts +150 -0
  167. package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.module.ts +27 -0
  168. package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.service.spec.ts +330 -0
  169. package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.service.ts +423 -0
  170. package/template/apps/api/libs/infra/common/decorators/feature-flag/index.ts +28 -0
  171. package/template/apps/api/libs/infra/common/decorators/rate-limit/dto/rate-limit.dto.ts +201 -0
  172. package/template/apps/api/libs/infra/common/decorators/rate-limit/index.ts +54 -0
  173. package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.decorator.ts +216 -0
  174. package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.exception.ts +74 -0
  175. package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.module.ts +37 -0
  176. package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.service.ts +430 -0
  177. package/template/apps/api/libs/infra/common/decorators/response.decorator.ts +67 -0
  178. package/template/apps/api/libs/infra/common/decorators/skip-version-check.decorator.ts +27 -0
  179. package/template/apps/api/libs/infra/common/decorators/transaction/index.ts +12 -0
  180. package/template/apps/api/libs/infra/common/decorators/transaction/transactional.decorator.ts +677 -0
  181. package/template/apps/api/libs/infra/common/decorators/ts-rest-controller.decorator.ts +63 -0
  182. package/template/apps/api/libs/infra/common/decorators/validation.decorator.ts +120 -0
  183. package/template/apps/api/libs/infra/common/decorators/version/index.ts +24 -0
  184. package/template/apps/api/libs/infra/common/decorators/version/version.decorator.ts +168 -0
  185. package/template/apps/api/libs/infra/common/decorators/version/version.interceptor.ts +97 -0
  186. package/template/apps/api/libs/infra/common/decorators/version/version.module.ts +21 -0
  187. package/template/apps/api/libs/infra/common/enums/action.enum.ts +7 -0
  188. package/template/apps/api/libs/infra/common/enums/error-codes.ts +71 -0
  189. package/template/apps/api/libs/infra/common/enums/role.enum.ts +4 -0
  190. package/template/apps/api/libs/infra/common/filter/exception/api.exception.ts +168 -0
  191. package/template/apps/api/libs/infra/common/filter/exception/exception.ts +47 -0
  192. package/template/apps/api/libs/infra/common/filter/exception/http.exception.ts +126 -0
  193. package/template/apps/api/libs/infra/common/guards/index.ts +1 -0
  194. package/template/apps/api/libs/infra/common/guards/version.guard.ts +312 -0
  195. package/template/apps/api/libs/infra/common/interceptor/mask/index.ts +1 -0
  196. package/template/apps/api/libs/infra/common/interceptor/mask/mask.interceptor.ts +242 -0
  197. package/template/apps/api/libs/infra/common/interceptor/rate-limit/no-rate-limit.interceptor.ts +14 -0
  198. package/template/apps/api/libs/infra/common/interceptor/rate-limit/rate-limit.interceptor.ts +230 -0
  199. package/template/apps/api/libs/infra/common/interceptor/transform/transform.interceptor.spec.ts +7 -0
  200. package/template/apps/api/libs/infra/common/interceptor/transform/transform.interceptor.ts +75 -0
  201. package/template/apps/api/libs/infra/common/interceptor/version/index.ts +1 -0
  202. package/template/apps/api/libs/infra/common/interceptor/version/version-header.interceptor.ts +62 -0
  203. package/template/apps/api/libs/infra/common/middleware/request.middleware.ts +109 -0
  204. package/template/apps/api/libs/infra/common/package.json +11 -0
  205. package/template/apps/api/libs/infra/common/pipes/transform-root.pipe.ts +12 -0
  206. package/template/apps/api/libs/infra/common/ts-rest/index.ts +26 -0
  207. package/template/apps/api/libs/infra/common/ts-rest/response.helper.ts +233 -0
  208. package/template/apps/api/libs/infra/i18n/en/errors.json +77 -0
  209. package/template/apps/api/libs/infra/i18n/en/events.json +1 -0
  210. package/template/apps/api/libs/infra/i18n/package.json +11 -0
  211. package/template/apps/api/libs/infra/i18n/zh-CN/errors.json +77 -0
  212. package/template/apps/api/libs/infra/i18n/zh-CN/events.json +1 -0
  213. package/template/apps/api/libs/infra/jwt/dto/jwt.dto.ts +1 -0
  214. package/template/apps/api/libs/infra/jwt/jwt.module.ts +26 -0
  215. package/template/apps/api/libs/infra/jwt/package.json +11 -0
  216. package/template/apps/api/libs/infra/prisma/db-metrics/package.json +11 -0
  217. package/template/apps/api/libs/infra/prisma/db-metrics/src/db-metrics.module.ts +141 -0
  218. package/template/apps/api/libs/infra/prisma/db-metrics/src/db-metrics.service.ts +456 -0
  219. package/template/apps/api/libs/infra/prisma/db-metrics/src/index.ts +2 -0
  220. package/template/apps/api/libs/infra/prisma/db-metrics/tsconfig.lib.json +9 -0
  221. package/template/apps/api/libs/infra/prisma/middleware/soft-delete.middleware.ts +179 -0
  222. package/template/apps/api/libs/infra/prisma/package.json +11 -0
  223. package/template/apps/api/libs/infra/prisma/prisma/index.ts +3 -0
  224. package/template/apps/api/libs/infra/prisma/prisma/prisma.module.ts +12 -0
  225. package/template/apps/api/libs/infra/prisma/prisma/prisma.service.ts +18 -0
  226. package/template/apps/api/libs/infra/prisma/prisma/types.ts +6 -0
  227. package/template/apps/api/libs/infra/prisma/prisma-read/prisma-read.module.ts +11 -0
  228. package/template/apps/api/libs/infra/prisma/prisma-read/prisma-read.service.ts +280 -0
  229. package/template/apps/api/libs/infra/prisma/prisma-write/prisma-write.module.ts +11 -0
  230. package/template/apps/api/libs/infra/prisma/prisma-write/prisma-write.service.ts +278 -0
  231. package/template/apps/api/libs/infra/prisma/prometheus/index.ts +1 -0
  232. package/template/apps/api/libs/infra/prisma/prometheus/prometheus.module.ts +231 -0
  233. package/template/apps/api/libs/infra/rabbitmq/package.json +11 -0
  234. package/template/apps/api/libs/infra/rabbitmq/src/dto/rabbitmq.dto.ts +13 -0
  235. package/template/apps/api/libs/infra/rabbitmq/src/index.ts +5 -0
  236. package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq-events.module.ts +132 -0
  237. package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq-events.service.ts +199 -0
  238. package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.module.ts +101 -0
  239. package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.service.spec.ts +18 -0
  240. package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.service.ts +543 -0
  241. package/template/apps/api/libs/infra/rabbitmq/tsconfig.lib.json +9 -0
  242. package/template/apps/api/libs/infra/redis/dto/redis.dto.ts +3 -0
  243. package/template/apps/api/libs/infra/redis/package.json +11 -0
  244. package/template/apps/api/libs/infra/redis/src/index.ts +2 -0
  245. package/template/apps/api/libs/infra/redis/src/redis.module.ts +63 -0
  246. package/template/apps/api/libs/infra/redis/src/redis.service.spec.ts +18 -0
  247. package/template/apps/api/libs/infra/redis/src/redis.service.ts +730 -0
  248. package/template/apps/api/libs/infra/redis/tsconfig.lib.json +9 -0
  249. package/template/apps/api/libs/infra/shared-db/index.ts +14 -0
  250. package/template/apps/api/libs/infra/shared-db/transaction-context.ts +51 -0
  251. package/template/apps/api/libs/infra/shared-db/transaction.module.ts +15 -0
  252. package/template/apps/api/libs/infra/shared-db/transaction.perf.spec.ts +226 -0
  253. package/template/apps/api/libs/infra/shared-db/transactional-service.base.ts +102 -0
  254. package/template/apps/api/libs/infra/shared-db/unit-of-work.service.ts +142 -0
  255. package/template/apps/api/libs/infra/shared-services/email/dto/email.dto.ts +87 -0
  256. package/template/apps/api/libs/infra/shared-services/email/email.module.ts +27 -0
  257. package/template/apps/api/libs/infra/shared-services/email/email.service.ts +258 -0
  258. package/template/apps/api/libs/infra/shared-services/email/index.ts +5 -0
  259. package/template/apps/api/libs/infra/shared-services/file-storage/README.md +376 -0
  260. package/template/apps/api/libs/infra/shared-services/file-storage/bucket-resolver.ts +306 -0
  261. package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.factory.ts +347 -0
  262. package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.module.ts +62 -0
  263. package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.service.ts +849 -0
  264. package/template/apps/api/libs/infra/shared-services/file-storage/index.ts +57 -0
  265. package/template/apps/api/libs/infra/shared-services/file-storage/types.ts +210 -0
  266. package/template/apps/api/libs/infra/shared-services/ip-info/index.ts +2 -0
  267. package/template/apps/api/libs/infra/shared-services/ip-info/ip-info.module.ts +18 -0
  268. package/template/apps/api/libs/infra/shared-services/ip-info/ip-info.service.ts +118 -0
  269. package/template/apps/api/libs/infra/shared-services/sms/index.ts +11 -0
  270. package/template/apps/api/libs/infra/shared-services/sms/sms.factory.ts +367 -0
  271. package/template/apps/api/libs/infra/shared-services/sms/sms.module.ts +27 -0
  272. package/template/apps/api/libs/infra/shared-services/sms/sms.service.ts +315 -0
  273. package/template/apps/api/libs/infra/shared-services/sms/types.ts +297 -0
  274. package/template/apps/api/libs/infra/shared-services/streaming-asr/index.ts +50 -0
  275. package/template/apps/api/libs/infra/shared-services/streaming-asr/streaming-asr.module.ts +47 -0
  276. package/template/apps/api/libs/infra/shared-services/streaming-asr/streaming-asr.service.ts +1336 -0
  277. package/template/apps/api/libs/infra/shared-services/streaming-asr/types.ts +208 -0
  278. package/template/apps/api/libs/infra/shared-services/system-health/index.ts +3 -0
  279. package/template/apps/api/libs/infra/shared-services/system-health/system-health.controller.ts +61 -0
  280. package/template/apps/api/libs/infra/shared-services/system-health/system-health.module.ts +16 -0
  281. package/template/apps/api/libs/infra/shared-services/system-health/system-health.service.ts +69 -0
  282. package/template/apps/api/libs/infra/shared-services/uploader/index.ts +2 -0
  283. package/template/apps/api/libs/infra/shared-services/uploader/uploader.module.ts +11 -0
  284. package/template/apps/api/libs/infra/shared-services/uploader/uploader.service.ts +265 -0
  285. package/template/apps/api/libs/infra/utils/array-buffer.util.ts +8 -0
  286. package/template/apps/api/libs/infra/utils/array.util.ts +3 -0
  287. package/template/apps/api/libs/infra/utils/bcrypt.util.ts +3 -0
  288. package/template/apps/api/libs/infra/utils/bigint.util.ts +3 -0
  289. package/template/apps/api/libs/infra/utils/bytes.convert.util.ts +13 -0
  290. package/template/apps/api/libs/infra/utils/crypto.util.ts +206 -0
  291. package/template/apps/api/libs/infra/utils/download.ts +21 -0
  292. package/template/apps/api/libs/infra/utils/enviroment.util.ts +130 -0
  293. package/template/apps/api/libs/infra/utils/ffmpeg.util.ts +29 -0
  294. package/template/apps/api/libs/infra/utils/file.util.ts +448 -0
  295. package/template/apps/api/libs/infra/utils/folder.util.ts +11 -0
  296. package/template/apps/api/libs/infra/utils/frame.util.ts +24 -0
  297. package/template/apps/api/libs/infra/utils/http-client.ts +133 -0
  298. package/template/apps/api/libs/infra/utils/ip.util.ts +22 -0
  299. package/template/apps/api/libs/infra/utils/json.util.ts +3 -0
  300. package/template/apps/api/libs/infra/utils/load-env.util.ts +53 -0
  301. package/template/apps/api/libs/infra/utils/logger.util.ts +121 -0
  302. package/template/apps/api/libs/infra/utils/object.util.ts +3 -0
  303. package/template/apps/api/libs/infra/utils/package.json +11 -0
  304. package/template/apps/api/libs/infra/utils/prisma-error.util.ts +397 -0
  305. package/template/apps/api/libs/infra/utils/response.ts +23 -0
  306. package/template/apps/api/libs/infra/utils/serialize.util.ts +3 -0
  307. package/template/apps/api/libs/infra/utils/string.util.ts +3 -0
  308. package/template/apps/api/libs/infra/utils/timer.util.ts +3 -0
  309. package/template/apps/api/libs/infra/utils/urlencode.util.ts +3 -0
  310. package/template/apps/api/libs/infra/utils/validate.util.ts +3 -0
  311. package/template/apps/api/nest-cli.json +25 -0
  312. package/template/apps/api/package.json +174 -0
  313. package/template/apps/api/prisma/schema.prisma +352 -0
  314. package/template/apps/api/prisma/seed.ts +30 -0
  315. package/template/apps/api/scripts/generate-db-crud.js +344 -0
  316. package/template/apps/api/scripts/insert-country-codes.ts +325 -0
  317. package/template/apps/api/scripts/link-prisma.js +44 -0
  318. package/template/apps/api/scripts/validate-api-versions.ts +273 -0
  319. package/template/apps/api/src/app.module.ts +208 -0
  320. package/template/apps/api/src/main.ts +298 -0
  321. package/template/apps/api/src/modules/health/health.controller.ts +13 -0
  322. package/template/apps/api/src/modules/health/health.module.ts +7 -0
  323. package/template/apps/api/tsconfig.build.json +4 -0
  324. package/template/apps/api/tsconfig.json +123 -0
  325. package/template/apps/web/.env.example +5 -0
  326. package/template/apps/web/app/globals.css +27 -0
  327. package/template/apps/web/app/layout.tsx +19 -0
  328. package/template/apps/web/app/page.tsx +42 -0
  329. package/template/apps/web/hooks/useAspectRatioSize.ts +187 -0
  330. package/template/apps/web/hooks/useDebouncedValue.ts +25 -0
  331. package/template/apps/web/hooks/useErrorHandler.ts +113 -0
  332. package/template/apps/web/hooks/useHotkeys.ts +251 -0
  333. package/template/apps/web/hooks/useI18nToast.ts +240 -0
  334. package/template/apps/web/hooks/useI18nValidation.ts +262 -0
  335. package/template/apps/web/hooks/useNotificationSSE.ts +270 -0
  336. package/template/apps/web/hooks/useOperationFeedback.ts +108 -0
  337. package/template/apps/web/hooks/usePerformanceMonitor.ts +105 -0
  338. package/template/apps/web/hooks/usePermissions.ts +17 -0
  339. package/template/apps/web/hooks/useTask.ts +489 -0
  340. package/template/apps/web/hooks/useVersionCheck.ts +329 -0
  341. package/template/apps/web/i18n/config.ts +50 -0
  342. package/template/apps/web/i18n/index.ts +30 -0
  343. package/template/apps/web/i18n/navigation.ts +26 -0
  344. package/template/apps/web/i18n/request.ts +50 -0
  345. package/template/apps/web/i18n/routing.ts +21 -0
  346. package/template/apps/web/i18n/types.ts +57 -0
  347. package/template/apps/web/lib/actions/auth.ts +81 -0
  348. package/template/apps/web/lib/actions/chat.ts +129 -0
  349. package/template/apps/web/lib/actions/common.ts +13 -0
  350. package/template/apps/web/lib/actions/task.ts +20 -0
  351. package/template/apps/web/lib/agent/chat-client.ts +42 -0
  352. package/template/apps/web/lib/agent/prompts.ts +43 -0
  353. package/template/apps/web/lib/analytics/components/PageTracker.tsx +137 -0
  354. package/template/apps/web/lib/analytics/hooks/usePageTracking.ts +137 -0
  355. package/template/apps/web/lib/analytics/index.ts +180 -0
  356. package/template/apps/web/lib/api/agents.ts +7 -0
  357. package/template/apps/web/lib/api/agno-chat.ts +263 -0
  358. package/template/apps/web/lib/api/auth-server.ts +244 -0
  359. package/template/apps/web/lib/api/avatar-upload.ts +96 -0
  360. package/template/apps/web/lib/api/cache-config.ts +236 -0
  361. package/template/apps/web/lib/api/client.ts +649 -0
  362. package/template/apps/web/lib/api/contracts/client.ts +336 -0
  363. package/template/apps/web/lib/api/contracts/hooks/index.ts +25 -0
  364. package/template/apps/web/lib/api/contracts/hooks/notification.ts +180 -0
  365. package/template/apps/web/lib/api/contracts/hooks/setting.ts +33 -0
  366. package/template/apps/web/lib/api/contracts/index.ts +18 -0
  367. package/template/apps/web/lib/api/contracts/server-client.ts +145 -0
  368. package/template/apps/web/lib/api/hooks/use-python-task.ts +154 -0
  369. package/template/apps/web/lib/api/queries/analytics.ts +51 -0
  370. package/template/apps/web/lib/api/queries/message.ts +75 -0
  371. package/template/apps/web/lib/api.ts +179 -0
  372. package/template/apps/web/lib/aspect-ratio.ts +10 -0
  373. package/template/apps/web/lib/audio-buffer-queue.ts +273 -0
  374. package/template/apps/web/lib/config.ts +163 -0
  375. package/template/apps/web/lib/data/industry.json +369 -0
  376. package/template/apps/web/lib/data/region.json +501 -0
  377. package/template/apps/web/lib/errors/error-handler.ts +194 -0
  378. package/template/apps/web/lib/errors/index.ts +16 -0
  379. package/template/apps/web/lib/errors/streaming-asr-errors.ts +434 -0
  380. package/template/apps/web/lib/form/index.ts +23 -0
  381. package/template/apps/web/lib/form/use-form.ts +143 -0
  382. package/template/apps/web/lib/icons-usage.md +99 -0
  383. package/template/apps/web/lib/icons.tsx +395 -0
  384. package/template/apps/web/lib/performance/monitor.ts +225 -0
  385. package/template/apps/web/lib/requests.ts +177 -0
  386. package/template/apps/web/lib/storage/index.ts +158 -0
  387. package/template/apps/web/lib/upload/api.ts +260 -0
  388. package/template/apps/web/lib/upload/batch-uploader.ts +286 -0
  389. package/template/apps/web/lib/upload/errors.ts +44 -0
  390. package/template/apps/web/lib/upload/folder-utils.ts +295 -0
  391. package/template/apps/web/lib/upload/uploader.ts +439 -0
  392. package/template/apps/web/lib/utils/reconnect.ts +223 -0
  393. package/template/apps/web/lib/utils/transcript-export.ts +321 -0
  394. package/template/apps/web/lib/version-mismatch.ts +147 -0
  395. package/template/apps/web/lib/version.ts +60 -0
  396. package/template/apps/web/next-env.d.ts +6 -0
  397. package/template/apps/web/next.config.ts +97 -0
  398. package/template/apps/web/package.json +89 -0
  399. package/template/apps/web/providers/app-provider.tsx +45 -0
  400. package/template/apps/web/providers/index.tsx +45 -0
  401. package/template/apps/web/providers/query-provider.tsx +181 -0
  402. package/template/apps/web/providers/theme-provider.tsx +26 -0
  403. package/template/apps/web/tsconfig.json +30 -0
  404. package/template/package.json +91 -0
  405. package/template/packages/config/eslint/base.js +32 -0
  406. package/template/packages/config/eslint/next.js +134 -0
  407. package/template/packages/config/eslint/react-internal.js +41 -0
  408. package/template/packages/config/eslint.config.mjs +26 -0
  409. package/template/packages/config/eslint.nestjs.config.mjs +62 -0
  410. package/template/packages/config/index.ts +2 -0
  411. package/template/packages/config/package.json +44 -0
  412. package/template/packages/config/postcss.config.mjs +8 -0
  413. package/template/packages/config/prettier.config.mjs +14 -0
  414. package/template/packages/config/tsconfig.json +19 -0
  415. package/template/packages/config/typescript/base.json +20 -0
  416. package/template/packages/config/typescript/nextjs.json +12 -0
  417. package/template/packages/config/typescript/react-library.json +8 -0
  418. package/template/packages/constants/README.md +111 -0
  419. package/template/packages/constants/package.json +25 -0
  420. package/template/packages/constants/src/index.ts +243 -0
  421. package/template/packages/constants/tsconfig.build.json +13 -0
  422. package/template/packages/constants/tsconfig.json +12 -0
  423. package/template/packages/contracts/ERROR-MIGRATION.md +179 -0
  424. package/template/packages/contracts/README.md +203 -0
  425. package/template/packages/contracts/jest.config.js +11 -0
  426. package/template/packages/contracts/package.json +60 -0
  427. package/template/packages/contracts/src/api/analytics.contract.ts +45 -0
  428. package/template/packages/contracts/src/api/download.contract.ts +66 -0
  429. package/template/packages/contracts/src/api/index.ts +12 -0
  430. package/template/packages/contracts/src/api/message.contract.ts +70 -0
  431. package/template/packages/contracts/src/api/risk-words.contract.ts +44 -0
  432. package/template/packages/contracts/src/api/setting.contract.ts +127 -0
  433. package/template/packages/contracts/src/api/sign.contract.ts +269 -0
  434. package/template/packages/contracts/src/api/sms.contract.ts +95 -0
  435. package/template/packages/contracts/src/api/system.contract.ts +52 -0
  436. package/template/packages/contracts/src/api/task.contract.ts +58 -0
  437. package/template/packages/contracts/src/api/uploader.contract.ts +93 -0
  438. package/template/packages/contracts/src/api/user.contract.ts +60 -0
  439. package/template/packages/contracts/src/api/webhook.contract.ts +73 -0
  440. package/template/packages/contracts/src/base.ts +319 -0
  441. package/template/packages/contracts/src/errors/codes.ts +55 -0
  442. package/template/packages/contracts/src/errors/domains/common.errors.ts +212 -0
  443. package/template/packages/contracts/src/errors/domains/index.ts +7 -0
  444. package/template/packages/contracts/src/errors/domains/user.errors.ts +51 -0
  445. package/template/packages/contracts/src/errors/error-response.ts +145 -0
  446. package/template/packages/contracts/src/errors/index.ts +16 -0
  447. package/template/packages/contracts/src/errors/messages.ts +240 -0
  448. package/template/packages/contracts/src/index.ts +16 -0
  449. package/template/packages/contracts/src/schemas/analytics.schema.ts +81 -0
  450. package/template/packages/contracts/src/schemas/download.schema.ts +59 -0
  451. package/template/packages/contracts/src/schemas/index.ts +18 -0
  452. package/template/packages/contracts/src/schemas/message.schema.ts +83 -0
  453. package/template/packages/contracts/src/schemas/risk-words.schema.ts +25 -0
  454. package/template/packages/contracts/src/schemas/setting.schema.ts +84 -0
  455. package/template/packages/contracts/src/schemas/sign.schema.ts +171 -0
  456. package/template/packages/contracts/src/schemas/sms.schema.ts +53 -0
  457. package/template/packages/contracts/src/schemas/sse.schema.ts +30 -0
  458. package/template/packages/contracts/src/schemas/system.schema.ts +26 -0
  459. package/template/packages/contracts/src/schemas/tag.schema.ts +65 -0
  460. package/template/packages/contracts/src/schemas/task.schema.ts +47 -0
  461. package/template/packages/contracts/src/schemas/uploader.schema.ts +121 -0
  462. package/template/packages/contracts/src/schemas/user.schema.ts +75 -0
  463. package/template/packages/contracts/src/schemas/webhook.schema.ts +72 -0
  464. package/template/packages/contracts/tsconfig.build.json +20 -0
  465. package/template/packages/contracts/tsconfig.json +12 -0
  466. package/template/packages/types/README.md +143 -0
  467. package/template/packages/types/ai.ts +30 -0
  468. package/template/packages/types/auth.ts +99 -0
  469. package/template/packages/types/common.ts +13 -0
  470. package/template/packages/types/creative.ts +68 -0
  471. package/template/packages/types/image-factory.ts +122 -0
  472. package/template/packages/types/index.ts +8 -0
  473. package/template/packages/types/package.json +21 -0
  474. package/template/packages/types/task.ts +27 -0
  475. package/template/packages/types/tsconfig.json +11 -0
  476. package/template/packages/ui/README.md +30 -0
  477. package/template/packages/ui/components.json +22 -0
  478. package/template/packages/ui/eslint.config.js +4 -0
  479. package/template/packages/ui/package.json +58 -0
  480. package/template/packages/ui/postcss.config.mjs +6 -0
  481. package/template/packages/ui/src/components/accordion.tsx +66 -0
  482. package/template/packages/ui/src/components/alert.tsx +61 -0
  483. package/template/packages/ui/src/components/avatar.tsx +57 -0
  484. package/template/packages/ui/src/components/badge.tsx +38 -0
  485. package/template/packages/ui/src/components/button.tsx +60 -0
  486. package/template/packages/ui/src/components/calendar.tsx +71 -0
  487. package/template/packages/ui/src/components/card.tsx +92 -0
  488. package/template/packages/ui/src/components/carousel.tsx +241 -0
  489. package/template/packages/ui/src/components/checkbox.tsx +32 -0
  490. package/template/packages/ui/src/components/command.tsx +184 -0
  491. package/template/packages/ui/src/components/dialog.tsx +134 -0
  492. package/template/packages/ui/src/components/dropdown-menu.tsx +257 -0
  493. package/template/packages/ui/src/components/empty.tsx +104 -0
  494. package/template/packages/ui/src/components/field.tsx +248 -0
  495. package/template/packages/ui/src/components/form.tsx +172 -0
  496. package/template/packages/ui/src/components/input-group.tsx +170 -0
  497. package/template/packages/ui/src/components/input.tsx +21 -0
  498. package/template/packages/ui/src/components/item.tsx +193 -0
  499. package/template/packages/ui/src/components/label.tsx +24 -0
  500. package/template/packages/ui/src/components/password-strength.tsx +248 -0
  501. package/template/packages/ui/src/components/popover.tsx +48 -0
  502. package/template/packages/ui/src/components/progress.tsx +35 -0
  503. package/template/packages/ui/src/components/scroll-area.tsx +48 -0
  504. package/template/packages/ui/src/components/select.tsx +190 -0
  505. package/template/packages/ui/src/components/separator.tsx +28 -0
  506. package/template/packages/ui/src/components/sheet.tsx +139 -0
  507. package/template/packages/ui/src/components/sidebar.tsx +729 -0
  508. package/template/packages/ui/src/components/skeleton.tsx +13 -0
  509. package/template/packages/ui/src/components/slider.tsx +87 -0
  510. package/template/packages/ui/src/components/sonner.tsx +40 -0
  511. package/template/packages/ui/src/components/switch.tsx +31 -0
  512. package/template/packages/ui/src/components/tabs.tsx +66 -0
  513. package/template/packages/ui/src/components/textarea.tsx +18 -0
  514. package/template/packages/ui/src/components/tooltip.tsx +61 -0
  515. package/template/packages/ui/src/hooks/use-mobile.ts +21 -0
  516. package/template/packages/ui/src/index.ts +38 -0
  517. package/template/packages/ui/src/lib/utils.ts +6 -0
  518. package/template/packages/ui/src/styles/globals.css +134 -0
  519. package/template/packages/ui/tsconfig.json +11 -0
  520. package/template/packages/ui/tsconfig.lint.json +8 -0
  521. package/template/packages/utils/README.md +173 -0
  522. package/template/packages/utils/array.util.ts +335 -0
  523. package/template/packages/utils/bcrypt.util.ts +10 -0
  524. package/template/packages/utils/bigint.util.ts +111 -0
  525. package/template/packages/utils/cn.ts +6 -0
  526. package/template/packages/utils/encrypt.ts +104 -0
  527. package/template/packages/utils/fetch.ts +170 -0
  528. package/template/packages/utils/file.ts +275 -0
  529. package/template/packages/utils/headers.ts +116 -0
  530. package/template/packages/utils/index.ts +22 -0
  531. package/template/packages/utils/jest.config.js +28 -0
  532. package/template/packages/utils/json.util.ts +9 -0
  533. package/template/packages/utils/mask.util.ts +348 -0
  534. package/template/packages/utils/object.util.ts +149 -0
  535. package/template/packages/utils/package.json +112 -0
  536. package/template/packages/utils/serialize.util.ts +17 -0
  537. package/template/packages/utils/string.util.ts +159 -0
  538. package/template/packages/utils/timer.util.ts +210 -0
  539. package/template/packages/utils/tsconfig.build.json +17 -0
  540. package/template/packages/utils/tsconfig.json +13 -0
  541. package/template/packages/utils/urlencode.util.ts +18 -0
  542. package/template/packages/utils/validate.util.ts +25 -0
  543. package/template/packages/validators/README.md +149 -0
  544. package/template/packages/validators/jest.config.js +20 -0
  545. package/template/packages/validators/package.json +32 -0
  546. package/template/packages/validators/src/index.ts +178 -0
  547. package/template/packages/validators/tsconfig.build.json +19 -0
  548. package/template/packages/validators/tsconfig.json +12 -0
  549. package/template/pnpm-lock.yaml +21574 -0
  550. package/template/pnpm-workspace.yaml +4 -0
  551. package/template/scripts/generate-i18n-errors.ts +371 -0
  552. package/template/scripts/generate-prisma-enums.js +170 -0
  553. package/template/scripts/generate-prisma-enums.ts +172 -0
  554. package/template/scripts/init-project.js +232 -0
  555. package/template/turbo.json +55 -0
@@ -0,0 +1,582 @@
1
+ /**
2
+ * YAML Configuration Validation Schema
3
+ *
4
+ * Validates the YAML configuration file (config.local.yaml) using Zod.
5
+ * Ensures all required application settings are correctly configured.
6
+ */
7
+ import { z } from 'zod';
8
+ import enviroment from '@/utils/enviroment.util';
9
+
10
+ // ============================================================================
11
+ // Exported Schemas (用于类型推断和外部使用)
12
+ // ============================================================================
13
+
14
+ /**
15
+ * Microservice configuration schema
16
+ */
17
+ export const microServiceSchema = z.object({
18
+ name: z.string().min(1),
19
+ ChineseName: z.string().optional(),
20
+ version: z.string().optional(),
21
+ port: z.number().int().positive().max(65535),
22
+ logger: z.boolean().default(true),
23
+ transport: z.enum(['TCP', 'UDP', 'HTTP']).default('TCP'),
24
+ host: z.string().optional(),
25
+ });
26
+
27
+ /**
28
+ * Zone configuration schema
29
+ */
30
+ export const zoneSchema = z.object({
31
+ zone: z.string().min(1),
32
+ locale: z.enum(['zh-CN', 'en']),
33
+ defaultPrivateBucket: z.string().min(1),
34
+ defaultPublicBucket: z.string().min(1),
35
+ transcodeBucket: z.string().min(1),
36
+ });
37
+
38
+ /**
39
+ * App configuration schema
40
+ */
41
+ export const appConfigSchema = microServiceSchema.extend({
42
+ domain: z.string().min(1),
43
+ MaxPageSize: z.number().int().positive().default(500),
44
+ defaultPageSize: z.number().int().positive().default(100),
45
+ defaultMiniPageSize: z.number().int().positive().default(30),
46
+ canCreateTrail: z.boolean().default(true),
47
+ defaultVendor: z
48
+ .enum(['tos', 'oss', 'us3', 'qiniu', 'gcs', 's3'])
49
+ .default('tos'),
50
+ defaultBucketPublic: z.boolean().default(false),
51
+
52
+ // S3 重试配置 (从 .env 迁移)
53
+ enableRetryMechanism: z.boolean().default(true),
54
+ enableEnhancedLogging: z.boolean().default(true),
55
+ maxRetries: z.number().int().positive().default(3),
56
+ baseRetryDelay: z.number().int().positive().default(1000),
57
+
58
+ // 日志输出配置 (从 .env 迁移)
59
+ nestLogOutput: z.enum(['console', 'file', 'both']).default('file'),
60
+
61
+ // 音频转写状态更新模式配置
62
+ audioTranscribe: z
63
+ .object({
64
+ /** 状态更新模式:webhook(回调)或 polling(轮询) */
65
+ statusUpdateMode: z.enum(['webhook', 'polling']).default('webhook'),
66
+ /** 轮询间隔(秒),仅在 polling 模式下有效 */
67
+ pollingInterval: z.number().int().positive().default(30),
68
+ })
69
+ .optional()
70
+ .default({
71
+ statusUpdateMode: 'webhook',
72
+ pollingInterval: 30,
73
+ }),
74
+
75
+ admin: microServiceSchema.optional(),
76
+ zones: z.array(zoneSchema).min(1),
77
+ });
78
+
79
+ /**
80
+ * Upload configuration schema
81
+ */
82
+ export const uploadConfigSchema = z.object({
83
+ chrunkSize: z.number().int().positive().default(8388608), // 8MB
84
+ });
85
+
86
+ /**
87
+ * IP info configuration schema
88
+ */
89
+ export const ipInfoConfigSchema = z.object({
90
+ url: z.string().url(),
91
+ token: z.string().min(1),
92
+ });
93
+
94
+ /**
95
+ * Video quality enum values
96
+ */
97
+ export const videoQualitySchema = z.enum([
98
+ 'VIDEO_360P',
99
+ 'VIDEO_720P',
100
+ 'VIDEO_1080P',
101
+ 'VIDEO_4K',
102
+ 'VIDEO_ORIGIN',
103
+ ]);
104
+
105
+ /**
106
+ * JWT configuration schema
107
+ */
108
+ export const jwtConfigSchema = z.object({
109
+ secret: z.string().min(8, 'JWT secret must be at least 8 characters'),
110
+ expireIn: z.number().int().positive(),
111
+ });
112
+
113
+ /**
114
+ * Crypto configuration schema
115
+ */
116
+ export const cryptoConfigSchema = z.object({
117
+ key: z.string().min(1),
118
+ iv: z.string().min(1),
119
+ });
120
+
121
+ /**
122
+ * CDN zone configuration schema
123
+ */
124
+ export const cdnZoneSchema = z.object({
125
+ url: z.string().url(),
126
+ downloaderUrl: z.string().url(),
127
+ vodUrl: z.string().url(),
128
+ thumbTemplate: z.string().optional(),
129
+ });
130
+
131
+ /**
132
+ * CDN configuration schema
133
+ */
134
+ export const cdnConfigSchema = z.object({
135
+ cn: cdnZoneSchema.optional(),
136
+ us: cdnZoneSchema.optional(),
137
+ ap: cdnZoneSchema.optional(),
138
+ });
139
+
140
+ /**
141
+ * Redis cache key configuration schema
142
+ */
143
+ export const redisCacheKeySchema = z.object({
144
+ name: z.string().min(1),
145
+ key: z.string().min(1),
146
+ expireIn: z.number().int().optional(),
147
+ });
148
+
149
+ /**
150
+ * Path configuration schema
151
+ */
152
+ export const pathConfigSchema = z.object({
153
+ post: z.array(z.string()).optional(),
154
+ get: z.array(z.string()).optional(),
155
+ });
156
+
157
+ /**
158
+ * Permission configuration schema
159
+ */
160
+ export const rolePermissionSchema = z.object({
161
+ role: z.string().min(1),
162
+ permission: z.array(z.string()),
163
+ });
164
+
165
+ /**
166
+ * Bucket configuration schema
167
+ */
168
+ export const bucketConfigSchema = z.object({
169
+ bucket: z.string().min(1),
170
+ region: z.string().min(1),
171
+ zone: z.string().min(1),
172
+ endpoint: z.string().url(),
173
+ internalEndpoint: z.string(),
174
+ domain: z.string().url(),
175
+ vendor: z.enum(['tos', 'oss', 'us3', 'qiniu', 'gcs', 's3']),
176
+ webhook: z.string().optional(),
177
+ locale: z.string().optional(),
178
+ isPublic: z.boolean().default(false),
179
+ isDefault: z.boolean().default(false),
180
+ tosEndpoint: z.string().optional(),
181
+ tosInternalEndpoint: z.string().optional(),
182
+ });
183
+
184
+ /**
185
+ * Feature flag provider type
186
+ */
187
+ export const featureFlagProviderSchema = z.enum(['memory', 'redis', 'unleash']);
188
+
189
+ /**
190
+ * Redis feature flag configuration schema
191
+ */
192
+ export const featureFlagRedisConfigSchema = z.object({
193
+ /** Redis key prefix (default: 'pardx:feature:') */
194
+ keyPrefix: z.string().default('pardx:feature:'),
195
+ /** Default TTL in seconds, 0 = never expire (default: 0) */
196
+ defaultTTL: z.number().int().min(0).default(0),
197
+ });
198
+
199
+ /**
200
+ * Unleash configuration schema
201
+ */
202
+ export const unleashConfigSchema = z.object({
203
+ /** Unleash server URL */
204
+ url: z.string().url(),
205
+ /** Application name registered in Unleash */
206
+ appName: z.string().min(1),
207
+ /** Unique instance identifier */
208
+ instanceId: z.string().optional(),
209
+ /** Environment name (dev, staging, production) */
210
+ environment: z.string().optional(),
211
+ /** Refresh interval in milliseconds (default: 15000) */
212
+ refreshInterval: z.number().int().positive().default(15000),
213
+ /** Metrics reporting interval in milliseconds (default: 60000) */
214
+ metricsInterval: z.number().int().positive().default(60000),
215
+ /** Custom headers for authentication */
216
+ customHeaders: z.record(z.string()).optional(),
217
+ });
218
+
219
+ /**
220
+ * Feature flags configuration schema
221
+ */
222
+ export const featureFlagsConfigSchema = z
223
+ .object({
224
+ /** Feature flag provider: memory (dev), redis (prod), unleash (enterprise) */
225
+ provider: featureFlagProviderSchema.default('memory'),
226
+ /** Redis configuration (used when provider is 'redis') */
227
+ redis: featureFlagRedisConfigSchema.optional(),
228
+ /** Unleash configuration (required if provider is 'unleash') */
229
+ unleash: unleashConfigSchema.optional(),
230
+ /** Default feature flags (key-value pairs) */
231
+ defaultFlags: z.record(z.boolean()).optional(),
232
+ })
233
+ .refine(
234
+ (data) => {
235
+ // If provider is 'unleash', unleash config must be provided
236
+ if (data.provider === 'unleash' && !data.unleash) {
237
+ return false;
238
+ }
239
+ return true;
240
+ },
241
+ {
242
+ message: "Unleash configuration is required when provider is 'unleash'",
243
+ path: ['unleash'],
244
+ },
245
+ );
246
+
247
+ // ============================================================================
248
+ // Rate Limit Configuration Schemas
249
+ // ============================================================================
250
+
251
+ // ============================================================================
252
+ // Database Metrics Configuration Schemas
253
+ // ============================================================================
254
+
255
+ /**
256
+ * Slow query thresholds configuration schema
257
+ * 慢查询阈值配置
258
+ */
259
+ export const slowQueryThresholdsSchema = z.object({
260
+ /** INFO level threshold in ms (default: 100) */
261
+ info: z.number().int().positive().default(100),
262
+ /** WARN level threshold in ms (default: 500) */
263
+ warn: z.number().int().positive().default(500),
264
+ /** ERROR level threshold in ms (default: 1000) */
265
+ error: z.number().int().positive().default(1000),
266
+ });
267
+
268
+ /**
269
+ * Database metrics configuration schema
270
+ * 数据库监控配置
271
+ */
272
+ export const dbMetricsConfigSchema = z.object({
273
+ /** Enable/disable database metrics (default: true) */
274
+ enabled: z.boolean().default(true),
275
+ /** Slow query thresholds by log level */
276
+ slowQueryThresholds: slowQueryThresholdsSchema.default({
277
+ info: 100,
278
+ warn: 500,
279
+ error: 1000,
280
+ }),
281
+ /** Log query parameters (default: true) */
282
+ logQueryParams: z.boolean().default(true),
283
+ /** Log query results (default: false, for security) */
284
+ logQueryResult: z.boolean().default(false),
285
+ /** Maximum length for logged parameters (default: 1000) */
286
+ maxParamLogLength: z.number().int().positive().default(1000),
287
+ });
288
+
289
+ // ============================================================================
290
+ // Transaction Configuration Schemas
291
+ // ============================================================================
292
+
293
+ /**
294
+ * Transaction retry configuration schema
295
+ * 事务重试配置
296
+ */
297
+ export const transactionRetryConfigSchema = z.object({
298
+ /** Enable retry mechanism (default: true) */
299
+ enabled: z.boolean().default(true),
300
+ /** Maximum retry attempts (default: 3) */
301
+ maxRetries: z.number().int().positive().default(3),
302
+ /** Base delay between retries in ms (default: 100) */
303
+ baseDelay: z.number().int().positive().default(100),
304
+ /** Exponential backoff multiplier (default: 2) */
305
+ backoffMultiplier: z.number().positive().default(2),
306
+ /** Maximum delay between retries in ms (default: 5000) */
307
+ maxDelay: z.number().int().positive().default(5000),
308
+ });
309
+
310
+ /**
311
+ * Transaction configuration schema
312
+ * 事务配置
313
+ */
314
+ export const transactionConfigSchema = z.object({
315
+ /** Retry configuration */
316
+ retry: transactionRetryConfigSchema.default({
317
+ enabled: true,
318
+ maxRetries: 3,
319
+ baseDelay: 100,
320
+ backoffMultiplier: 2,
321
+ maxDelay: 5000,
322
+ }),
323
+ /** Default max wait time for transaction lock in ms (default: 5000) */
324
+ defaultMaxWait: z.number().int().positive().default(5000),
325
+ /** Default transaction timeout in ms (default: 30000) */
326
+ defaultTimeout: z.number().int().positive().default(30000),
327
+ });
328
+
329
+ // ============================================================================
330
+ // Rate Limit Configuration Schemas
331
+ // ============================================================================
332
+
333
+ /**
334
+ * Rate limit dimension type
335
+ */
336
+ export const rateLimitDimensionSchema = z.enum([
337
+ 'ip',
338
+ 'userId',
339
+ 'tenantId',
340
+ 'apiKey',
341
+ 'composite',
342
+ ]);
343
+
344
+ /**
345
+ * Rate limit dimension config schema (limit + window)
346
+ */
347
+ export const rateLimitDimensionConfigSchema = z.object({
348
+ /** Maximum requests allowed in the window */
349
+ limit: z.number().int().positive(),
350
+ /** Time window in seconds */
351
+ window: z.number().int().positive(),
352
+ });
353
+
354
+ /**
355
+ * Rate limit whitelist configuration schema
356
+ */
357
+ export const rateLimitWhitelistSchema = z.object({
358
+ /** Whitelisted IP addresses (supports CIDR notation) */
359
+ ips: z.array(z.string()).default(['127.0.0.1', '::1']),
360
+ /** Whitelisted user IDs */
361
+ userIds: z.array(z.string()).default([]),
362
+ /** Whitelisted API keys */
363
+ apiKeys: z.array(z.string()).default([]),
364
+ });
365
+
366
+ /**
367
+ * Rate limit Redis configuration schema
368
+ */
369
+ export const rateLimitRedisConfigSchema = z.object({
370
+ /** Redis key prefix (default: 'pardx:ratelimit:') */
371
+ keyPrefix: z.string().default('pardx:ratelimit:'),
372
+ });
373
+
374
+ /**
375
+ * Rate limit dimensions configuration schema
376
+ */
377
+ export const rateLimitDimensionsSchema = z.object({
378
+ /** IP-based rate limiting */
379
+ ip: rateLimitDimensionConfigSchema.default({ limit: 200, window: 60 }),
380
+ /** User-based rate limiting */
381
+ userId: rateLimitDimensionConfigSchema.default({ limit: 500, window: 60 }),
382
+ /** Tenant-based rate limiting */
383
+ tenantId: rateLimitDimensionConfigSchema.default({
384
+ limit: 2000,
385
+ window: 60,
386
+ }),
387
+ /** API key-based rate limiting */
388
+ apiKey: rateLimitDimensionConfigSchema.default({ limit: 1000, window: 60 }),
389
+ });
390
+
391
+ /**
392
+ * Rate limit configuration schema
393
+ */
394
+ export const rateLimitConfigSchema = z.object({
395
+ /** Enable/disable rate limiting (static, requires restart) */
396
+ enabled: z.boolean().default(true),
397
+ /** Feature flag name for dynamic control (optional) */
398
+ featureFlag: z.string().optional(),
399
+ /** Default rate limit configuration (fallback) */
400
+ default: rateLimitDimensionConfigSchema.default({ limit: 100, window: 60 }),
401
+ /** Dimension-specific configurations */
402
+ dimensions: rateLimitDimensionsSchema.optional(),
403
+ /** Redis configuration */
404
+ redis: rateLimitRedisConfigSchema.optional(),
405
+ /** Whitelist configuration */
406
+ whitelist: rateLimitWhitelistSchema.optional(),
407
+ });
408
+
409
+ /**
410
+ * Full YAML configuration schema
411
+ */
412
+ export const yamlConfigSchema = z.object({
413
+ app: appConfigSchema,
414
+ uploadConfig: uploadConfigSchema.optional(),
415
+ ipinfo: ipInfoConfigSchema.optional(),
416
+ outOfAnonymityPath: pathConfigSchema.optional(),
417
+ outOfUserPath: pathConfigSchema.optional(),
418
+ pinecone: z.object({ apiKey: z.string() }).optional(),
419
+ jwt: jwtConfigSchema,
420
+ crypto: cryptoConfigSchema,
421
+ cdn: cdnConfigSchema.optional(),
422
+ redis: z.array(redisCacheKeySchema).optional(),
423
+ buckets: z.array(bucketConfigSchema).optional(),
424
+ featureFlags: featureFlagsConfigSchema.optional(),
425
+ rateLimit: rateLimitConfigSchema.optional(),
426
+ // Database monitoring and transaction configuration
427
+ dbMetrics: dbMetricsConfigSchema.optional(),
428
+ transaction: transactionConfigSchema.optional(),
429
+ });
430
+
431
+ // ============================================================================
432
+ // Inferred Types (从 Zod schema 推断的类型)
433
+ // ============================================================================
434
+
435
+ /** 完整 YAML 配置类型 */
436
+ export type YamlConfig = z.infer<typeof yamlConfigSchema>;
437
+
438
+ /** 微服务配置类型 */
439
+ export type MicroServiceConfig = z.infer<typeof microServiceSchema>;
440
+
441
+ /** 应用配置类型 (扩展自 MicroServiceConfig) */
442
+ export type AppConfig = z.infer<typeof appConfigSchema>;
443
+
444
+ /** 区域配置类型 */
445
+ export type ZoneConfig = z.infer<typeof zoneSchema>;
446
+
447
+ /** 上传配置类型 */
448
+ export type UploadConfig = z.infer<typeof uploadConfigSchema>;
449
+
450
+ /** IP 信息配置类型 */
451
+ export type IpInfoConfig = z.infer<typeof ipInfoConfigSchema>;
452
+
453
+ /** JWT 配置类型 */
454
+ export type JwtConfig = z.infer<typeof jwtConfigSchema>;
455
+
456
+ /** 加密配置类型 */
457
+ export type CryptoConfig = z.infer<typeof cryptoConfigSchema>;
458
+
459
+ /** CDN 区域配置类型 */
460
+ export type CdnZoneConfig = z.infer<typeof cdnZoneSchema>;
461
+
462
+ /** CDN 配置类型 */
463
+ export type CdnConfig = z.infer<typeof cdnConfigSchema>;
464
+
465
+ /** Redis 缓存键配置类型 */
466
+ export type RedisCacheKeyConfig = z.infer<typeof redisCacheKeySchema>;
467
+
468
+ /** 路径配置类型 */
469
+ export type PathConfig = z.infer<typeof pathConfigSchema>;
470
+
471
+ /** 角色权限配置类型 */
472
+ export type RolePermissionConfig = z.infer<typeof rolePermissionSchema>;
473
+
474
+ /** 存储桶配置类型 */
475
+ export type BucketConfig = z.infer<typeof bucketConfigSchema>;
476
+
477
+ /** 视频质量枚举类型 */
478
+ export type VideoQuality = z.infer<typeof videoQualitySchema>;
479
+
480
+ /** 功能开关 Provider 类型 */
481
+ export type FeatureFlagProvider = z.infer<typeof featureFlagProviderSchema>;
482
+
483
+ /** 功能开关 Redis 配置类型 */
484
+ export type FeatureFlagRedisConfig = z.infer<
485
+ typeof featureFlagRedisConfigSchema
486
+ >;
487
+
488
+ /** Unleash 配置类型 */
489
+ export type UnleashConfig = z.infer<typeof unleashConfigSchema>;
490
+
491
+ /** 功能开关配置类型 */
492
+ export type FeatureFlagsConfig = z.infer<typeof featureFlagsConfigSchema>;
493
+
494
+ /** 限流维度类型 */
495
+ export type RateLimitDimension = z.infer<typeof rateLimitDimensionSchema>;
496
+
497
+ /** 限流维度配置类型 */
498
+ export type RateLimitDimensionConfig = z.infer<
499
+ typeof rateLimitDimensionConfigSchema
500
+ >;
501
+
502
+ /** 限流白名单配置类型 */
503
+ export type RateLimitWhitelistConfig = z.infer<typeof rateLimitWhitelistSchema>;
504
+
505
+ /** 限流 Redis 配置类型 */
506
+ export type RateLimitRedisConfig = z.infer<typeof rateLimitRedisConfigSchema>;
507
+
508
+ /** 限流维度集合配置类型 */
509
+ export type RateLimitDimensionsConfig = z.infer<
510
+ typeof rateLimitDimensionsSchema
511
+ >;
512
+
513
+ /** 限流配置类型 */
514
+ export type RateLimitConfig = z.infer<typeof rateLimitConfigSchema>;
515
+
516
+ /** 慢查询阈值配置类型 */
517
+ export type SlowQueryThresholdsConfig = z.infer<
518
+ typeof slowQueryThresholdsSchema
519
+ >;
520
+
521
+ /** 数据库监控配置类型 */
522
+ export type DbMetricsConfig = z.infer<typeof dbMetricsConfigSchema>;
523
+
524
+ /** 事务重试配置类型 */
525
+ export type TransactionRetryConfig = z.infer<
526
+ typeof transactionRetryConfigSchema
527
+ >;
528
+
529
+ /** 事务配置类型 */
530
+ export type TransactionConfig = z.infer<typeof transactionConfigSchema>;
531
+
532
+ /**
533
+ * Validation result type
534
+ */
535
+ export interface YamlValidationResult {
536
+ success: boolean;
537
+ data?: YamlConfig;
538
+ errors?: z.ZodError;
539
+ }
540
+
541
+ /**
542
+ * Validates YAML configuration against the schema
543
+ *
544
+ * @param config - Parsed YAML configuration object
545
+ * @returns Validated configuration
546
+ * @throws Error if validation fails
547
+ */
548
+ export function validateYamlConfig(config: unknown): YamlConfig {
549
+ const result = yamlConfigSchema.safeParse(config);
550
+
551
+ if (!result.success) {
552
+ const errorMessages = result.error.errors
553
+ .map((err) => ` - ${err.path.join('.')}: ${err.message}`)
554
+ .join('\n');
555
+
556
+ console.error('❌ YAML configuration validation failed:');
557
+ console.error(errorMessages);
558
+
559
+ throw new Error(`YAML configuration validation failed:\n${errorMessages}`);
560
+ }
561
+
562
+ if (enviroment.isProduction()) {
563
+ console.log('✅ YAML configuration validated successfully');
564
+ }
565
+ return result.data;
566
+ }
567
+
568
+ /**
569
+ * Validates YAML configuration and returns detailed result
570
+ *
571
+ * @param config - Parsed YAML configuration object
572
+ * @returns Validation result with success status and data or errors
573
+ */
574
+ export function validateYamlConfigSafe(config: unknown): YamlValidationResult {
575
+ const result = yamlConfigSchema.safeParse(config);
576
+
577
+ if (result.success) {
578
+ return { success: true, data: result.data };
579
+ }
580
+
581
+ return { success: false, errors: result.error };
582
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * App Version Controller
3
+ *
4
+ * 提供版本检查 API 端点。
5
+ *
6
+ * **重要**: 此控制器使用 VERSION_NEUTRAL,不需要版本 header。
7
+ * 前端应在启动时调用此 API 获取当前 API 版本,然后在后续请求中携带版本 header。
8
+ */
9
+
10
+ import { Get, Query, Header } from '@nestjs/common';
11
+ import { ApiTags, ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger';
12
+ import {
13
+ AppVersionService,
14
+ AppVersionInfo,
15
+ VersionCheckResult,
16
+ } from './app-version.service';
17
+ import { TsRestController } from '../ts-rest-controller.decorator';
18
+
19
+ @ApiTags('Version')
20
+ @TsRestController('version')
21
+ export class AppVersionController {
22
+ constructor(private readonly appVersionService: AppVersionService) {}
23
+
24
+ /**
25
+ * 获取服务端版本信息
26
+ */
27
+ @Get()
28
+ @ApiOperation({ summary: '获取服务端版本信息' })
29
+ @ApiResponse({
30
+ status: 200,
31
+ description: '版本信息',
32
+ schema: {
33
+ type: 'object',
34
+ properties: {
35
+ appVersion: { type: 'string', example: '1.0.0' },
36
+ apiVersion: { type: 'string', example: '1' },
37
+ buildVersion: { type: 'string', example: 'a1b2c3d4' },
38
+ buildTime: {
39
+ type: 'string',
40
+ example: '2025-01-15T10:00:00.000Z',
41
+ },
42
+ environment: { type: 'string', example: 'production' },
43
+ },
44
+ },
45
+ })
46
+ getVersion(): AppVersionInfo {
47
+ return this.appVersionService.getVersionInfo();
48
+ }
49
+
50
+ /**
51
+ * 检查客户端版本兼容性
52
+ */
53
+ @Get('check')
54
+ @ApiOperation({ summary: '检查客户端版本兼容性' })
55
+ @ApiQuery({
56
+ name: 'clientVersion',
57
+ description: '客户端版本号',
58
+ required: false,
59
+ example: '1.0.0',
60
+ })
61
+ @ApiQuery({
62
+ name: 'buildVersion',
63
+ description: '客户端构建版本',
64
+ required: false,
65
+ example: 'a1b2c3d4',
66
+ })
67
+ @ApiResponse({
68
+ status: 200,
69
+ description: '版本检查结果',
70
+ schema: {
71
+ type: 'object',
72
+ properties: {
73
+ needsRefresh: { type: 'boolean', example: false },
74
+ reason: {
75
+ type: 'string',
76
+ enum: ['outdated', 'incompatible', 'major_update'],
77
+ },
78
+ serverVersion: { type: 'string', example: '1.0.0' },
79
+ clientVersion: { type: 'string', example: '1.0.0' },
80
+ action: { type: 'string', enum: ['refresh', 'update', 'none'] },
81
+ message: { type: 'string' },
82
+ },
83
+ },
84
+ })
85
+ checkVersion(
86
+ @Query('clientVersion') clientVersion?: string,
87
+ @Query('buildVersion') buildVersion?: string,
88
+ ): VersionCheckResult {
89
+ const result = this.appVersionService.checkClientVersion(
90
+ clientVersion || '',
91
+ );
92
+
93
+ // 如果版本匹配,额外检查构建版本
94
+ if (!result.needsRefresh && buildVersion) {
95
+ const buildMatch = this.appVersionService.checkBuildVersion(buildVersion);
96
+ if (!buildMatch) {
97
+ return {
98
+ ...result,
99
+ needsRefresh: true,
100
+ reason: 'outdated',
101
+ action: 'refresh',
102
+ message: '检测到代码更新,建议刷新页面',
103
+ };
104
+ }
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ /**
111
+ * 简单的版本哈希检查 (轻量级)
112
+ * 用于前端轮询检测
113
+ */
114
+ @Get('hash')
115
+ @ApiOperation({ summary: '获取构建哈希 (轻量级检查)' })
116
+ @Header('Cache-Control', 'no-cache, no-store, must-revalidate')
117
+ @ApiResponse({
118
+ status: 200,
119
+ description: '构建哈希',
120
+ schema: {
121
+ type: 'object',
122
+ properties: {
123
+ hash: { type: 'string', example: 'a1b2c3d4' },
124
+ time: { type: 'string', example: '2025-01-15T10:00:00.000Z' },
125
+ },
126
+ },
127
+ })
128
+ getBuildHash(): { hash: string; time: string } {
129
+ const info = this.appVersionService.getVersionInfo();
130
+ return {
131
+ hash: info.buildVersion,
132
+ time: info.buildTime,
133
+ };
134
+ }
135
+ }