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,762 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ PardxAI is a multi-agent driven content creation and operations platform. This repository serves as a **scaffold/template**: it retains **all files except logs**; `logs/` and `*.log` are excluded via `.gitignore`. See [docs/脚手架说明.md](docs/脚手架说明.md) for scope and exclusions.
8
+
9
+ This is a full-stack monorepo built with pnpm workspaces + Turborepo, containing:
10
+ - **Next.js 16 frontend** (React 19)
11
+ - **NestJS backend** (Fastify + Prisma)
12
+ - **Shared packages** for code reuse across frontend and backend
13
+
14
+ ## Development Commands
15
+
16
+ ```bash
17
+ # Install dependencies
18
+ pnpm install
19
+
20
+ # Development (all apps)
21
+ pnpm dev
22
+
23
+ # Development (specific apps)
24
+ pnpm dev:web # Next.js frontend only
25
+ pnpm dev:api # NestJS backend only
26
+
27
+ # Build
28
+ pnpm build
29
+ pnpm build:web # Build web only
30
+ pnpm build:api # Build api only
31
+
32
+ # Lint
33
+ pnpm lint
34
+ pnpm lint:web
35
+ pnpm lint:api
36
+
37
+ # Type check
38
+ pnpm type-check
39
+
40
+ # Test
41
+ pnpm test
42
+ pnpm test:api
43
+
44
+ # Database (NestJS/Prisma)
45
+ pnpm db:generate # Generate Prisma client
46
+ pnpm db:migrate:dev # Run migrations (development)
47
+ pnpm db:migrate:deploy # Run migrations (production)
48
+ pnpm db:push # Push schema changes
49
+
50
+ # Clean
51
+ pnpm clean
52
+ ```
53
+
54
+ ## Architecture
55
+
56
+ ### Monorepo Structure
57
+
58
+ ```
59
+ pardx-ai/
60
+ ├── apps/
61
+ │ ├── web/ # @repo/web - Next.js 16 frontend
62
+ │ │ ├── app/ # App Router pages
63
+ │ │ ├── components/ # React components
64
+ │ │ ├── lib/ # API client, queries, utilities
65
+ │ │ └── hooks/ # Custom React hooks
66
+ │ │
67
+ │ └── api/ # @repo/api - NestJS backend
68
+ │ ├── src/ # Main application source
69
+ │ │ └── modules/ # Feature modules (API layer)
70
+ │ ├── libs/ # Backend-only shared libraries (infra + domain)
71
+ │ │ ├── infra/ # 基础设施:与产品无关,可复用
72
+ │ │ │ ├── common/ # Decorators, interceptors, pipes, config, filter
73
+ │ │ │ ├── clients/ # Third-party API clients
74
+ │ │ │ ├── prisma/ # DB connection, read/write split
75
+ │ │ │ ├── redis/ # Cache
76
+ │ │ │ ├── rabbitmq/ # Message queue
77
+ │ │ │ ├── jwt/ # JWT
78
+ │ │ │ ├── utils/ # Pure utilities
79
+ │ │ │ ├── i18n/ # i18n assets
80
+ │ │ │ ├── shared-db/ # TransactionalServiceBase, UnitOfWork
81
+ │ │ │ └── shared-services/ # email, sms, ip-info, file-storage, etc.
82
+ │ │ └── domain/ # 业务:与 Pardx 领域/流程强相关
83
+ │ │ ├── auth/ # Authentication / identity
84
+ │ │ └── db/ # Business entity DB (user-info, message, …)
85
+ │ └── prisma/ # Database schema & migrations
86
+
87
+ └── packages/ # Shared packages (frontend + backend)
88
+ ├── ui/ # @repo/ui - UI components (shadcn/ui)
89
+ ├── utils/ # @repo/utils - Utility functions
90
+ ├── types/ # @repo/types - TypeScript types
91
+ ├── config/ # @repo/config - Shared configs (tsconfig, eslint)
92
+ ├── constants/ # @repo/constants - Shared constants
93
+ ├── validators/ # @repo/validators - Zod validation schemas
94
+ └── contracts/ # @repo/contracts - API contracts (ts-rest)
95
+ ```
96
+
97
+ ### Import Aliases
98
+
99
+ **Frontend (apps/web):**
100
+ - `@/*` - App-internal imports
101
+ - `@repo/ui` - UI components
102
+ - `@repo/utils` - Utilities
103
+ - `@repo/types` - Types
104
+ - `@repo/config` - Configs
105
+ - `@repo/constants` - Shared constants
106
+ - `@repo/validators` - Shared validators
107
+ - `@repo/contracts` - API contracts and types
108
+
109
+ **Backend (apps/api):**
110
+ - `@/common/*` - Common utilities (→ `libs/infra/common/*`)
111
+ - `@/config/*` - Configuration (→ `libs/infra/common/config/*`)
112
+ - `@/utils/*` - Utility functions (→ `libs/infra/utils/*`)
113
+ - `@/prisma/*` - Prisma module (→ `libs/infra/prisma/*`)
114
+ - `@app/<lib>` - Backend libraries (e.g. `@app/redis`, `@app/auth`, `@app/db`)
115
+ - `@app/clients/internal/*` - Third-party API clients (→ `libs/infra/clients/internal/*`)
116
+ - `@app/shared-services/*` - Shared services (→ `libs/infra/shared-services/*`)
117
+ - `@app/auth`, `@app/db` - Domain libs (→ `libs/domain/auth`, `libs/domain/db`)
118
+ - `@repo/constants` - Shared constants
119
+ - `@repo/validators` - Shared validators
120
+ - `@repo/contracts` - API contracts
121
+
122
+ **Backend libs: infra vs domain boundary**
123
+ - **infra** (`libs/infra/`): common, clients, prisma, redis, rabbitmq, jwt, utils, i18n, shared-db, shared-services. 与产品/领域无关,可复用。**禁止**依赖 `libs/domain/**`。
124
+ - **domain** (`libs/domain/`): auth, db。与 Pardx 领域/业务流程强相关。**可**依赖 infra。
125
+ - **依赖方向**:`src` → `domain` → `infra`。infra 内模块可相互依赖,但不得 import domain。
126
+ - 详见 `apps/api/docs/业务与基础设施拆分方案.md`。
127
+
128
+ ### Key Technologies
129
+
130
+ **Frontend:**
131
+ - **Framework**: Next.js 16 with App Router, React 19
132
+ - **AI Integration**: CopilotKit, AG-UI/Agno for multi-agent
133
+ - **State Management**: React Query (@tanstack/react-query)
134
+ - **Styling**: Tailwind CSS 4 + class-variance-authority
135
+ - **API Client**: ts-rest + React Query
136
+
137
+ **Backend:**
138
+ - **Framework**: NestJS 11 with Fastify
139
+ - **Database**: PostgreSQL with Prisma ORM
140
+ - **Cache**: Redis (ioredis)
141
+ - **Queue**: RabbitMQ + BullMQ
142
+ - **Auth**: Passport (JWT, OAuth2)
143
+ - **API Contract**: ts-rest
144
+
145
+ ### Build Configuration
146
+
147
+ Shared packages use **CommonJS** output format for compatibility with both NestJS (tsc) and Next.js (webpack):
148
+
149
+ ```json
150
+ // packages/*/tsconfig.build.json
151
+ {
152
+ "compilerOptions": {
153
+ "module": "commonjs",
154
+ "moduleResolution": "node",
155
+ "noEmit": false,
156
+ "declaration": true
157
+ }
158
+ }
159
+ ```
160
+
161
+ ### API Architecture
162
+
163
+ **API Contract Pattern** (ts-rest):
164
+ ```typescript
165
+ // packages/contracts - Define contract
166
+ export const teamContract = contract.router({
167
+ list: { method: 'GET', path: '/list', responses: { 200: TeamListSchema } }
168
+ });
169
+
170
+ // apps/api - Implement contract
171
+ @TsRestHandler(c.list)
172
+ async list() { return tsRestHandler(...); }
173
+
174
+ // apps/web - Consume contract
175
+ const { data } = useTeamList();
176
+ ```
177
+
178
+ **Frontend API Client** (`apps/web/lib/api/client.ts`):
179
+ - `apiClient.get/post/put/delete()` - Returns parsed `data` from `{code, msg, data}`
180
+ - `apiClient.getFullResponse()` - Returns full response
181
+ - `ApiError` class with typed error handling
182
+
183
+ **Backend API Pattern**:
184
+ - Controllers handle HTTP requests
185
+ - Services contain business logic
186
+ - Modules organize features
187
+ - Guards/Interceptors for cross-cutting concerns
188
+
189
+ ### API List Standardization Pattern
190
+
191
+ **ALL GET list endpoints MUST follow this standardization pattern:**
192
+
193
+ #### 1. Query Schema (Request)
194
+
195
+ **Rule**: Use `PaginationQuerySchema` or extend it for additional filters.
196
+
197
+ ```typescript
198
+ // packages/contracts/src/base.ts - Base schema definition
199
+ export const PaginationQuerySchema = z.object({
200
+ limit: z.coerce.number().positive().optional().default(20),
201
+ page: z.coerce.number().positive().min(1).optional().default(1),
202
+ sort: z.enum(['createdAt', 'name', 'fsize', 'disable', 'frameTime', 'expireAt']).optional(),
203
+ asc: z.enum(['asc', 'desc']).optional(),
204
+ });
205
+
206
+ // Example 1: Use directly (no additional filters)
207
+ export const GetCommentsQuerySchema = PaginationQuerySchema;
208
+
209
+ // Example 2: Extend with additional filters
210
+ export const GetRecommendationsQuerySchema = PaginationQuerySchema.extend({
211
+ recommendTypes: z.array(RecommendTypeSchema).optional(),
212
+ context: z.string().optional(),
213
+ });
214
+
215
+ // Example 3: Complex filters
216
+ export const GetUserBehaviorsQuerySchema = PaginationQuerySchema.extend({
217
+ userId: z.string().uuid().optional(),
218
+ knowledgeUnitId: z.string().uuid().optional(),
219
+ behaviorType: BehaviorTypeSchema.optional(),
220
+ sessionId: z.string().optional(),
221
+ startDate: z.coerce.date().optional(),
222
+ endDate: z.coerce.date().optional(),
223
+ });
224
+ ```
225
+
226
+ #### 2. Response Schema
227
+
228
+ **Rule**: Use `PaginatedResponseSchema` factory function.
229
+
230
+ ```typescript
231
+ // packages/contracts/src/base.ts - Factory function definition
232
+ export const PaginatedResponseSchema = <T extends z.ZodTypeAny>(
233
+ itemSchema: T,
234
+ ) =>
235
+ z.object({
236
+ list: z.array(itemSchema),
237
+ total: z.number(),
238
+ page: z.number(),
239
+ limit: z.number(),
240
+ });
241
+
242
+ // Usage: Wrap your item schema
243
+ export const UserBehaviorsResponseSchema = PaginatedResponseSchema(
244
+ UserBehaviorItemSchema,
245
+ );
246
+
247
+ export const RecommendationListResponseSchema = PaginatedResponseSchema(
248
+ RecommendationItemSchema,
249
+ );
250
+
251
+ // Special case: Extend with additional fields
252
+ export const NotificationListResponseSchema = PaginatedResponseSchema(
253
+ NotificationListItemSchema,
254
+ ).extend({
255
+ unreadCount: z.number(),
256
+ });
257
+ ```
258
+
259
+ **Standard response structure:**
260
+ ```typescript
261
+ {
262
+ list: T[], // Array of items (NOT: items, data, recommendations, etc.)
263
+ total: number, // Total count
264
+ page: number, // Current page number
265
+ limit: number // Items per page
266
+ }
267
+ ```
268
+
269
+ #### 3. Contract Definition
270
+
271
+ ```typescript
272
+ // packages/contracts/src/api/*.contract.ts
273
+ import { initContract } from '@ts-rest/core';
274
+ import { createApiResponse } from '../base';
275
+
276
+ const c = initContract();
277
+
278
+ export const userBehaviorContract = c.router({
279
+ list: {
280
+ method: 'GET',
281
+ path: '/user-behavior',
282
+ query: GetUserBehaviorsQuerySchema,
283
+ responses: {
284
+ 200: createApiResponse(UserBehaviorsResponseSchema),
285
+ },
286
+ summary: '获取用户行为列表',
287
+ description: '查询用户行为记录,支持多维度过滤',
288
+ },
289
+ });
290
+ ```
291
+
292
+ #### 4. Backend Implementation
293
+
294
+ **Controller Layer** (`apps/api/src/modules/*/controller.ts`):
295
+ ```typescript
296
+ @TsRestHandler(c.list)
297
+ async list(@Req() req: FastifyRequest) {
298
+ const { userId, teamId } = req;
299
+ return tsRestHandler(c.list, async ({ query }) => {
300
+ const result = await this.service.list(teamId, query);
301
+ return { success: true, body: result };
302
+ });
303
+ }
304
+ ```
305
+
306
+ **Service Layer** (`apps/api/src/modules/*/service.ts`):
307
+ ```typescript
308
+ async list(
309
+ teamId: string,
310
+ query: GetUserBehaviorsQuery,
311
+ ): Promise<UserBehaviorsResponse> {
312
+ // 1. Extract pagination params with defaults
313
+ const { limit = 20, page = 1, ...filters } = query;
314
+
315
+ // 2. Convert page-based to offset-based pagination for Prisma
316
+ const offset = (page - 1) * limit;
317
+
318
+ // 3. Call business service or DB service
319
+ const { behaviors, total } = await this.businessService.getUserBehaviors(
320
+ { teamId, ...filters },
321
+ { limit, offset },
322
+ );
323
+
324
+ // 4. Return standardized response
325
+ return {
326
+ list: behaviors.map((b) => ({
327
+ id: b.id,
328
+ // ... map fields
329
+ })),
330
+ total,
331
+ page, // Return page (NOT offset)
332
+ limit,
333
+ };
334
+ }
335
+ ```
336
+
337
+ **Key implementation points:**
338
+ - ✅ Extract `limit` and `page` with defaults: `const { limit = 20, page = 1, ...filters } = query`
339
+ - ✅ Calculate offset: `const offset = (page - 1) * limit`
340
+ - ✅ Return `page` in response (NOT offset)
341
+ - ✅ Response field must be `list` (NOT: items, data, behaviors, recommendations, etc.)
342
+
343
+ #### 5. Frontend Usage (ts-rest + React Query)
344
+
345
+ ```typescript
346
+ // apps/web/lib/api/queries/user-behavior.ts
347
+ import { tsRestClient } from '@repo/contracts';
348
+
349
+ export const useUserBehaviors = (query: GetUserBehaviorsQuery) => {
350
+ return tsRestClient.userBehavior.list.useQuery({
351
+ queryKey: ['user-behaviors', query],
352
+ queryData: { query },
353
+ });
354
+ };
355
+
356
+ // Component usage
357
+ const { data } = useUserBehaviors({ page: 1, limit: 20, userId: 'xxx' });
358
+ // data.body.list - Array of items
359
+ // data.body.total - Total count
360
+ // data.body.page - Current page
361
+ // data.body.limit - Items per page
362
+ ```
363
+
364
+ #### 6. Standardized Examples
365
+
366
+ **Fully standardized APIs** (reference these as examples):
367
+ - [knowledge-recommendation.contract.ts:29](packages/contracts/src/api/knowledge-recommendation.contract.ts#L29) - `getRecommendations`
368
+ - [user-behavior.contract.ts:58](packages/contracts/src/api/user-behavior.contract.ts#L58) - `list`
369
+ - [recruitment.contract.ts](packages/contracts/src/schemas/recruitment.schema.ts) - `JobDescriptionQuerySchema`, `CandidateListQuerySchema`, etc.
370
+ - [meeting.contract.ts](packages/contracts/src/schemas/meeting.schema.ts) - `ListMeetingsQuerySchema`
371
+ - [notification.contract.ts](packages/contracts/src/schemas/notification.schema.ts) - `GetNotificationListRequestSchema` (with extended response)
372
+ - [comment.contract.ts](packages/contracts/src/schemas/comment.schema.ts) - `CommentsListResponseSchema`
373
+ - [message.contract.ts](packages/contracts/src/schemas/message.schema.ts) - `MessageListQuerySchema`
374
+
375
+ #### 7. Common Violations to Avoid
376
+
377
+ ❌ **Wrong - Custom pagination fields:**
378
+ ```typescript
379
+ const query = z.object({
380
+ offset: z.number(), // ❌ Use page instead
381
+ size: z.number(), // ❌ Use limit instead
382
+ });
383
+ ```
384
+
385
+ ❌ **Wrong - Non-standard response structure:**
386
+ ```typescript
387
+ const response = z.object({
388
+ data: z.array(ItemSchema), // ❌ Use list instead
389
+ totalCount: z.number(), // ❌ Use total instead
390
+ recommendations: z.array(...), // ❌ Use list instead
391
+ });
392
+ ```
393
+
394
+ ❌ **Wrong - Missing pagination entirely:**
395
+ ```typescript
396
+ const query = z.object({
397
+ userId: z.string(),
398
+ // ❌ No pagination fields
399
+ });
400
+
401
+ const response = z.object({
402
+ items: z.array(ItemSchema),
403
+ // ❌ No total/page/limit
404
+ });
405
+ ```
406
+
407
+ ❌ **Wrong - Backend returning offset:**
408
+ ```typescript
409
+ return {
410
+ list: items,
411
+ total,
412
+ offset, // ❌ Return page instead
413
+ limit,
414
+ };
415
+ ```
416
+
417
+ ✅ **Correct - Full standardization:**
418
+ ```typescript
419
+ // Contract
420
+ export const ListQuerySchema = PaginationQuerySchema.extend({
421
+ status: StatusSchema.optional(),
422
+ });
423
+
424
+ export const ListResponseSchema = PaginatedResponseSchema(ItemSchema);
425
+
426
+ // Backend
427
+ const { limit = 20, page = 1, ...filters } = query;
428
+ const offset = (page - 1) * limit;
429
+ const { items, total } = await this.service.find({ ...filters }, { limit, offset });
430
+
431
+ return {
432
+ list: items,
433
+ total,
434
+ page,
435
+ limit,
436
+ };
437
+ ```
438
+
439
+ ### Environment Variables
440
+
441
+ **Frontend** (`apps/web/.env.local`):
442
+ ```
443
+ NEXT_PUBLIC_API_BASE_URL=http://localhost:3100/api
444
+ NEXT_AGNO_API_BASE_URL=http://127.0.0.1:8000/api
445
+ NEXT_AGUI_BASEURL=http://127.0.0.1:8000/agui
446
+ ```
447
+
448
+ **Backend** (`apps/api/.env`):
449
+ ```
450
+ NODE_ENV=dev
451
+ DATABASE_URL=postgresql://...
452
+ REDIS_URL=redis://localhost:6379
453
+ RABBITMQ_URL=amqp://localhost:5672
454
+ ```
455
+
456
+ ## Code Patterns
457
+
458
+ ### Adding UI Components
459
+
460
+ UI components go in `packages/ui/` and must be exported from `packages/ui/index.ts`.
461
+
462
+ ### Adding API Endpoints (Frontend)
463
+
464
+ API modules go in `apps/web/lib/api/`. Use `apiClient` from `./client.ts` or ts-rest hooks from `./contracts/`.
465
+
466
+ ### Adding API Endpoints (Backend)
467
+
468
+ ```bash
469
+ # Generate NestJS artifacts
470
+ cd apps/api
471
+ npx nest g module <name> src/modules
472
+ npx nest g controller <name> src/modules
473
+ npx nest g service <name> src/modules
474
+ ```
475
+
476
+ ### Adding Backend Libraries
477
+
478
+ Backend-only shared code goes in `apps/api/libs/`. Use NestJS schematics:
479
+ ```bash
480
+ cd apps/api
481
+ npx nest g library <name>
482
+ ```
483
+
484
+ ### Adding Shared Packages
485
+
486
+ Code shared between frontend and backend goes in `packages/`:
487
+ - `packages/constants/` - Constants (HTTP codes, limits, etc.)
488
+ - `packages/validators/` - Validation schemas (zod)
489
+ - `packages/contracts/` - API contracts (ts-rest)
490
+
491
+ **Important**: When adding a new shared package:
492
+ 1. Create in `packages/` directory
493
+ 2. Set `name` to `@repo/<package-name>` in package.json
494
+ 3. Configure `tsconfig.build.json` with:
495
+ ```json
496
+ {
497
+ "compilerOptions": {
498
+ "noEmit": false,
499
+ "module": "commonjs",
500
+ "moduleResolution": "node"
501
+ }
502
+ }
503
+ ```
504
+ 4. Add to consumer's dependencies: `"@repo/<package-name>": "workspace:*"`
505
+
506
+ ### Server Components vs Client Components
507
+
508
+ Next.js 16 App Router is used. Client components must include `'use client'` directive.
509
+
510
+ ## 📋 Code Quality Standards
511
+
512
+ All code MUST follow these quality standards:
513
+
514
+ 1. **Follow Architecture Layering Standards**
515
+ - Strictly follow 4-layer architecture: API Layer → Service Layer → DB Layer/Client Layer
516
+ - API layer cannot directly access database or external APIs
517
+ - Service layer accesses database through DB Service, external APIs through Client layer
518
+ - DB layer handles data access, Client layer handles external API calls
519
+
520
+ 2. **Use Zod-first Validation**
521
+ - All API requests/responses MUST use Zod Schema for validation
522
+ - Forbidden: Manual type assertions in Controller or Service layer
523
+ - Must rely on Zod Schema validation for type safety
524
+
525
+ 3. **Type-safe API Contracts**
526
+ - Use `@repo/contracts` to define API contracts
527
+ - Use ts-rest for type-safe frontend-backend communication
528
+ - Backend: `@ts-rest/nest`, Frontend: `@ts-rest/react-query`
529
+ - Compile-time type checking, runtime Zod validation
530
+
531
+ 4. **Unified Winston Logger Usage**
532
+ - Forbidden: NestJS built-in `Logger`
533
+ - Forbidden: `console.log`, `console.error`, etc. (except startup logs)
534
+ - Must use Winston Logger (injected via `WINSTON_MODULE_PROVIDER`)
535
+ - Unified log levels: `info`, `warn`, `error`, `debug`
536
+
537
+ ---
538
+
539
+ ## ⚠️ Core Architecture Rules (MUST Follow)
540
+
541
+ **Before making any code changes, AI assistants MUST strictly follow these three core rules:**
542
+
543
+ ### 1. **DO NOT perform database read/write operations outside DB Service layer**
544
+
545
+ - **Allowed**: Use Prisma **type definitions** (e.g., `Prisma.MeetingRecordUpdateInput`, `Prisma.MeetingRecordWhereInput`) in non-DB layers
546
+ - **Forbidden**: Direct database read/write operations in non-DB layers
547
+ - **Only DB Service layer** (services extending `TransactionalServiceBase`) can directly perform database operations
548
+ - **Service layer** (e.g., `MeetingService`, `WebhookService`) MUST access database through DB Service functions
549
+ - **Forbidden** in Service layer:
550
+ - Direct use of `prisma.write`, `prisma.read`
551
+ - Direct use of `getWriteClient()`, `getReadClient()` (these are protected methods)
552
+ - Direct calls to Prisma database methods (`updateMany`, `findMany`, `create`, `update`, `delete`, etc.)
553
+ - **Allowed** in Service layer:
554
+ - Use Prisma type definitions as function parameter types or return types
555
+ - Use Prisma type definitions to build query condition objects (passed to DB Service)
556
+
557
+ **Example violations:**
558
+ ```typescript
559
+ // ❌ WRONG: Service layer performing direct database operations
560
+ @Injectable()
561
+ export class MeetingService {
562
+ constructor(private readonly meetingRecordDb: MeetingRecordService) {}
563
+
564
+ async batchUpdate(ids: string[]) {
565
+ // ❌ Forbidden: Direct database write operation in Service layer
566
+ await this.meetingRecordDb.getWriteClient().meetingRecord.updateMany({...});
567
+ }
568
+ }
569
+
570
+ // ✅ CORRECT: Implement in DB Service layer
571
+ @Injectable()
572
+ export class MeetingRecordService extends TransactionalServiceBase {
573
+ async batchUpdateTranscripts(ids: string[], data: Prisma.MeetingRecordUpdateInput) {
574
+ // ✅ Correct: Prisma access in DB Service layer
575
+ return await this.getWriteClient().meetingRecord.updateMany({...});
576
+ }
577
+ }
578
+
579
+ // ✅ CORRECT: Service layer uses Prisma types but calls DB Service methods
580
+ @Injectable()
581
+ export class MeetingService {
582
+ constructor(private readonly meetingRecordDb: MeetingRecordService) {}
583
+
584
+ // ✅ Correct: Use Prisma type definition as parameter type
585
+ async updateMeeting(id: string, data: Prisma.MeetingRecordUpdateInput) {
586
+ // ✅ Correct: Database operation through DB Service function
587
+ return await this.meetingRecordDb.updateMeetingRecord(id, data);
588
+ }
589
+
590
+ // ✅ Correct: Use Prisma type to build query conditions (passed to DB Service)
591
+ async listMeetings(where: Prisma.MeetingRecordWhereInput) {
592
+ // ✅ Correct: Database query through DB Service function
593
+ return await this.meetingRecordDb.listMeetingRecords(where, {});
594
+ }
595
+
596
+ async batchUpdate(ids: string[]) {
597
+ // ✅ Correct: Database operation through DB Service function
598
+ await this.meetingRecordDb.batchUpdateTranscripts(ids, data);
599
+ }
600
+ }
601
+ ```
602
+
603
+ ### 2. **Zod-first: All APIs MUST use Zod Schema for validation**
604
+
605
+ - All API requests/responses MUST use Zod Schema for validation
606
+ - When using `tsRestHandler`, Zod Schema from contract is automatically used for validation
607
+ - **Forbidden**: Manual type assertions in Controller or Service layer
608
+ - **Required**: Depend on Zod Schema validation
609
+ - External interfaces (webhooks, callbacks) MUST also use Zod Schema (use `z.any()` only with valid reason)
610
+
611
+ **Example:**
612
+ ```typescript
613
+ // ✅ CORRECT: Contract defines Zod Schema
614
+ export const webhookContract = c.router({
615
+ audioTranscribe: {
616
+ method: 'POST',
617
+ path: '/audio-transcribe/:vendor',
618
+ body: AudioTranscribeWebhookRequestSchema, // Zod Schema
619
+ responses: { 200: WebhookSuccessResponseSchema },
620
+ },
621
+ });
622
+
623
+ // ✅ CORRECT: Controller uses tsRestHandler (auto-validates with Zod)
624
+ @TsRestHandler(webhookContract.audioTranscribe)
625
+ async handleWebhook() {
626
+ return tsRestHandler(webhookContract.audioTranscribe, async ({ body }) => {
627
+ // body is automatically validated by Zod Schema
628
+ await this.webhook.handleAudioTranscribeWebhook(body);
629
+ });
630
+ }
631
+ ```
632
+
633
+ ### 3. **All external service calls MUST be in Client layer, using @nestjs/axios**
634
+
635
+ - **All third-party API calls and external service integrations** MUST be encapsulated in Client layer (`apps/api/libs/clients/`)
636
+ - **Client layer MUST use** `@nestjs/axios`'s `HttpService`, **forbidden** to use `axios` directly
637
+ - **Service layer** (business logic layer) **MUST NOT** directly call external APIs, must go through Client layer
638
+ - **Client layer responsibilities**: Only HTTP calls, no business logic, no database access
639
+ - Import `HttpModule` in Module, inject `HttpService` in Client
640
+ - Use `firstValueFrom` to convert RxJS Observable to Promise
641
+
642
+ **Example violations:**
643
+ ```typescript
644
+ // ❌ WRONG: Service layer directly calling external API
645
+ @Injectable()
646
+ export class MeetingService {
647
+ constructor(private readonly httpService: HttpService) {}
648
+
649
+ async fetchExternalData() {
650
+ // ❌ Forbidden: Direct external API call in Service layer
651
+ const response = await axios.get('https://api.example.com/data');
652
+ return response.data;
653
+ }
654
+ }
655
+
656
+ // ❌ WRONG: Using axios directly instead of @nestjs/axios
657
+ @Injectable()
658
+ export class ExternalApiClient {
659
+ async fetchData() {
660
+ // ❌ Forbidden: Direct axios import
661
+ const response = await axios.get('https://api.example.com/data');
662
+ return response.data;
663
+ }
664
+ }
665
+ ```
666
+
667
+ **Correct implementation:**
668
+ ```typescript
669
+ // ✅ CORRECT: Client layer encapsulates external API calls
670
+ @Module({
671
+ imports: [HttpModule.register({ timeout: 10000 })],
672
+ providers: [ExternalApiClient],
673
+ exports: [ExternalApiClient],
674
+ })
675
+ export class ExternalApiClientModule {}
676
+
677
+ @Injectable()
678
+ export class ExternalApiClient {
679
+ constructor(private readonly httpService: HttpService) {}
680
+
681
+ async fetchData() {
682
+ // ✅ Correct: Using @nestjs/axios HttpService
683
+ const response = await firstValueFrom(
684
+ this.httpService.get('https://api.example.com/data')
685
+ );
686
+ return response.data;
687
+ }
688
+ }
689
+
690
+ // ✅ CORRECT: Service layer uses Client layer
691
+ @Injectable()
692
+ export class MeetingService {
693
+ constructor(private readonly externalApiClient: ExternalApiClient) {}
694
+
695
+ async processData() {
696
+ // ✅ Correct: Access external API through Client layer
697
+ const data = await this.externalApiClient.fetchData();
698
+ // ... business logic processing
699
+ }
700
+ }
701
+ ```
702
+
703
+ **Reference implementations:**
704
+ - `apps/api/libs/clients/internal/agentx/agentx-client.service.ts` - AgentX API client
705
+ - `apps/api/libs/clients/internal/ocr/ocr.client.ts` - OCR service client
706
+ - `apps/api/libs/clients/internal/sms/sms-zxjc.client.ts` - SMS service client
707
+
708
+ ## ⚠️ Required Reading Before Coding
709
+
710
+ When using Cursor or Claude for vibecoding (real-time coding), **MUST** read and understand the following specification documents before making any code changes:
711
+
712
+ ### Frontend Specifications
713
+
714
+ 1. **代码质量与类型定义规范** (`apps/web/docs/代码质量与类型定义规范.md`)
715
+ - Type definition standards
716
+ - Type import conventions (`import type`)
717
+ - Props type definitions (use `interface`, not `React.FC`)
718
+ - Utility types usage
719
+ - Type checking checklist
720
+
721
+ 2. **前端架构与交互优化方案** (`apps/web/docs/前端架构与交互优化方案.md`)
722
+ - Architecture design
723
+ - Performance optimization strategies
724
+ - Code splitting strategies
725
+ - Network request optimization
726
+ - Image loading optimization
727
+
728
+ ### Backend Specifications
729
+
730
+ 3. **架构分层与事务管理方案** (`apps/api/docs/架构分层与事务管理方案-new.md`)
731
+ - Architecture layering design
732
+ - Transaction management patterns
733
+ - Error handling (`@HandlePrismaError`)
734
+ - Soft delete middleware
735
+ - Batch operations
736
+ - Cache strategies
737
+ - **CRITICAL**: API Service layer MUST NOT directly access Prisma (must go through DB Service)
738
+ - **⚠️ Rule 1**: DO NOT perform database read/write operations outside DB Service layer (Prisma type definitions are allowed)
739
+ - **⚠️ Rule 3**: All external service calls MUST be in Client layer, using @nestjs/axios
740
+
741
+ 4. **API 版本兼容方案** (`apps/api/docs/API版本兼容方案-统一设计.md`)
742
+ - Version system design (Generation for Web, Contract for APP)
743
+ - Contract adapter pattern
744
+ - Version validation flow
745
+
746
+ 5. **业务与基础设施拆分方案** (`apps/api/docs/业务与基础设施拆分方案.md`)
747
+ - libs split into **infra** (`libs/infra/`) and **domain** (`libs/domain/`)
748
+ - **infra**: common, clients, prisma, redis, rabbitmq, jwt, utils, i18n, shared-db, shared-services. MUST NOT depend on `libs/domain/**`.
749
+ - **domain**: auth, db. MAY depend on infra.
750
+ - **Dependency direction**: `src` → `domain` → `infra`. When adding or changing code under `apps/api/libs/`, obey this boundary.
751
+
752
+ ### API Contract Design
753
+
754
+ 6. **ts-rest Zod-first REST 协议框架设计方案** (`docs/ts-rest_Zod-first_REST_协议框架设计方案.md`)
755
+ - API contract definition using `@repo/contracts`
756
+ - Type-safe API design
757
+ - Zod Schema definitions
758
+ - Backend: `@ts-rest/nest`
759
+ - Frontend: `@ts-rest/react-query`
760
+ - **⚠️ Rule 2**: Zod-first - All APIs MUST use Zod Schema for validation
761
+
762
+ **See `.cursorrules` file for detailed coding guidelines and violation patterns.**