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.
- package/README.md +45 -0
- package/cli.js +104 -0
- package/package.json +15 -0
- package/template/.cursorrules +479 -0
- package/template/.prettierignore +29 -0
- package/template/.prettierrc +11 -0
- package/template/.vscode/extensions.json +8 -0
- package/template/.vscode/settings.json +122 -0
- package/template/CLAUDE.md +762 -0
- package/template/README.md +125 -0
- package/template/apps/api/.env.example +11 -0
- package/template/apps/api/.eslintrc.js +222 -0
- package/template/apps/api/config.local.yaml +397 -0
- package/template/apps/api/libs/domain/auth/package.json +11 -0
- package/template/apps/api/libs/domain/auth/src/README.md +189 -0
- package/template/apps/api/libs/domain/auth/src/auth-validation.service.ts +37 -0
- package/template/apps/api/libs/domain/auth/src/auth.guard.ts +173 -0
- package/template/apps/api/libs/domain/auth/src/auth.module.ts +23 -0
- package/template/apps/api/libs/domain/auth/src/auth.service.ts +198 -0
- package/template/apps/api/libs/domain/auth/src/auth.ts +66 -0
- package/template/apps/api/libs/domain/auth/src/decorators/presets.decorator.ts +50 -0
- package/template/apps/api/libs/domain/auth/src/decorators/rbac.decorator.ts +67 -0
- package/template/apps/api/libs/domain/auth/src/decorators/resource-owner.decorator.ts +67 -0
- package/template/apps/api/libs/domain/auth/src/dto/auth.dto.ts +10 -0
- package/template/apps/api/libs/domain/auth/src/guards/streaming-asr-session.guard.ts +179 -0
- package/template/apps/api/libs/domain/auth/src/index.ts +12 -0
- package/template/apps/api/libs/domain/auth/src/types/auth.interface.ts +52 -0
- package/template/apps/api/libs/domain/auth/tsconfig.lib.json +9 -0
- package/template/apps/api/libs/domain/db/package.json +11 -0
- package/template/apps/api/libs/domain/db/src/index.ts +14 -0
- package/template/apps/api/libs/domain/db/src/modules/country-code/country-code.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/country-code/country-code.service.ts +140 -0
- package/template/apps/api/libs/domain/db/src/modules/country-code/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/discord-auth/discord-auth.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/discord-auth/discord-auth.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/discord-auth/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/email-auth/email-auth.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/email-auth/email-auth.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/email-auth/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/file-source/file-source.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/file-source/file-source.service.ts +109 -0
- package/template/apps/api/libs/domain/db/src/modules/file-source/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/google-auth/google-auth.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/google-auth/google-auth.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/google-auth/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/message/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/message/message.module.ts +10 -0
- package/template/apps/api/libs/domain/db/src/modules/message/message.service.ts +314 -0
- package/template/apps/api/libs/domain/db/src/modules/mobile-auth/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/mobile-auth/mobile-auth.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/mobile-auth/mobile-auth.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/risk-detection-record.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/risk-detection-record/risk-detection-record.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/system-task-queue/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/system-task-queue/system-task-queue.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/system-task-queue/system-task-queue.service.ts +101 -0
- package/template/apps/api/libs/domain/db/src/modules/user-info/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/user-info/user-info.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/user-info/user-info.service.ts +139 -0
- package/template/apps/api/libs/domain/db/src/modules/wechat-auth/index.ts +2 -0
- package/template/apps/api/libs/domain/db/src/modules/wechat-auth/wechat-auth.module.ts +12 -0
- package/template/apps/api/libs/domain/db/src/modules/wechat-auth/wechat-auth.service.ts +101 -0
- package/template/apps/api/libs/domain/db/tsconfig.lib.json +9 -0
- package/template/apps/api/libs/infra/clients/internal/ai/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/ai/risk-detection.client.ts +301 -0
- package/template/apps/api/libs/infra/clients/internal/ai/risk-detection.module.ts +22 -0
- package/template/apps/api/libs/infra/clients/internal/crypt/crypt-client.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/clients/internal/crypt/crypt.client.ts +37 -0
- package/template/apps/api/libs/infra/clients/internal/crypt/crypt.module.ts +10 -0
- package/template/apps/api/libs/infra/clients/internal/crypt/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/email/dto/email.dto.ts +75 -0
- package/template/apps/api/libs/infra/clients/internal/email/index.ts +11 -0
- package/template/apps/api/libs/infra/clients/internal/email/sendcloud.client.ts +400 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/README.md +255 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/dto/file-cdn.dto.ts +96 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn-client.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn.client.ts +620 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/file-cdn.module.ts +19 -0
- package/template/apps/api/libs/infra/clients/internal/file-cdn/index.ts +40 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/config/file.config.ts +14 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/dto/file.dto.ts +127 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-gcs.client.ts +154 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-qiniu.client.ts +729 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-s3.client.ts +1097 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-storage.interface.ts +114 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-tos.client.ts +767 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/file-us3.client.ts +176 -0
- package/template/apps/api/libs/infra/clients/internal/file-storage/index.ts +16 -0
- package/template/apps/api/libs/infra/clients/internal/ocr/dto/ocr.dto.ts +61 -0
- package/template/apps/api/libs/infra/clients/internal/ocr/index.ts +3 -0
- package/template/apps/api/libs/infra/clients/internal/ocr/ocr.client.ts +123 -0
- package/template/apps/api/libs/infra/clients/internal/ocr/ocr.module.ts +15 -0
- package/template/apps/api/libs/infra/clients/internal/openai/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/openai/openai.client.ts +135 -0
- package/template/apps/api/libs/infra/clients/internal/openai/openai.module.ts +17 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/README.md +508 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/index.ts +44 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.client.ts +441 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.factory.ts +450 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/openspeech.module.ts +56 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/providers/aliyun.provider.ts +308 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/providers/base.provider.ts +114 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/providers/index.ts +10 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/providers/volcengine-streaming.provider.ts +1689 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/providers/volcengine.provider.ts +387 -0
- package/template/apps/api/libs/infra/clients/internal/openspeech/types.ts +467 -0
- package/template/apps/api/libs/infra/clients/internal/sms/dto/sms.dto.ts +97 -0
- package/template/apps/api/libs/infra/clients/internal/sms/index.ts +15 -0
- package/template/apps/api/libs/infra/clients/internal/sms/sms-aliyun.client.ts +52 -0
- package/template/apps/api/libs/infra/clients/internal/sms/sms-http.client.ts +111 -0
- package/template/apps/api/libs/infra/clients/internal/sms/sms-tencent.client.ts +54 -0
- package/template/apps/api/libs/infra/clients/internal/sms/sms-volcengine.client.ts +165 -0
- package/template/apps/api/libs/infra/clients/internal/sms/sms-zxjc.client.ts +47 -0
- package/template/apps/api/libs/infra/clients/internal/sse/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/sse/sse-client.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/clients/internal/sse/sse.client.ts +360 -0
- package/template/apps/api/libs/infra/clients/internal/sse/sse.module.ts +17 -0
- package/template/apps/api/libs/infra/clients/internal/third-party-sse/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.client.ts +51 -0
- package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.module.ts +10 -0
- package/template/apps/api/libs/infra/clients/internal/third-party-sse/third-party-sse.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/clients/internal/verify/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/verify/verify.client.ts +42 -0
- package/template/apps/api/libs/infra/clients/internal/verify/verify.module.ts +10 -0
- package/template/apps/api/libs/infra/clients/internal/volcengine-tts/dto/tts.dto.ts +64 -0
- package/template/apps/api/libs/infra/clients/internal/volcengine-tts/index.ts +3 -0
- package/template/apps/api/libs/infra/clients/internal/volcengine-tts/volcengine-tts.client.ts +846 -0
- package/template/apps/api/libs/infra/clients/internal/volcengine-tts/volcengine-tts.module.ts +21 -0
- package/template/apps/api/libs/infra/clients/internal/wechat/index.ts +2 -0
- package/template/apps/api/libs/infra/clients/internal/wechat/wechat-client.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/clients/internal/wechat/wechat.client.ts +4 -0
- package/template/apps/api/libs/infra/clients/internal/wechat/wechat.module.ts +8 -0
- package/template/apps/api/libs/infra/clients/plugin/decorators/inject-client.decorator.ts +60 -0
- package/template/apps/api/libs/infra/clients/plugin/index.ts +21 -0
- package/template/apps/api/libs/infra/clients/plugin/interceptors/http-logging.interceptor.ts +130 -0
- package/template/apps/api/libs/infra/clients/plugin/interfaces/client.interface.ts +86 -0
- package/template/apps/api/libs/infra/clients/plugin/utils/retry.util.ts +157 -0
- package/template/apps/api/libs/infra/common/adapters/base.adapter.ts +94 -0
- package/template/apps/api/libs/infra/common/adapters/index.ts +38 -0
- package/template/apps/api/libs/infra/common/config/README.md +254 -0
- package/template/apps/api/libs/infra/common/config/agentx.config.ts +91 -0
- package/template/apps/api/libs/infra/common/config/configuration.ts +289 -0
- package/template/apps/api/libs/infra/common/config/constant/config.constants.ts +92 -0
- package/template/apps/api/libs/infra/common/config/dto/config.dto.ts +282 -0
- package/template/apps/api/libs/infra/common/config/package.json +11 -0
- package/template/apps/api/libs/infra/common/config/validation/env.validation.ts +161 -0
- package/template/apps/api/libs/infra/common/config/validation/index.ts +188 -0
- package/template/apps/api/libs/infra/common/config/validation/keys.validation.ts +564 -0
- package/template/apps/api/libs/infra/common/config/validation/yaml.validation.ts +582 -0
- package/template/apps/api/libs/infra/common/decorators/app-version/app-version.controller.ts +135 -0
- package/template/apps/api/libs/infra/common/decorators/app-version/app-version.interceptor.ts +36 -0
- package/template/apps/api/libs/infra/common/decorators/app-version/app-version.module.ts +27 -0
- package/template/apps/api/libs/infra/common/decorators/app-version/app-version.service.ts +252 -0
- package/template/apps/api/libs/infra/common/decorators/app-version/index.ts +13 -0
- package/template/apps/api/libs/infra/common/decorators/cache/cache.decorator.ts +437 -0
- package/template/apps/api/libs/infra/common/decorators/cache/cache.interceptor.ts +268 -0
- package/template/apps/api/libs/infra/common/decorators/cache/cache.module.ts +24 -0
- package/template/apps/api/libs/infra/common/decorators/cache/index.ts +33 -0
- package/template/apps/api/libs/infra/common/decorators/event/event.decorator.ts +229 -0
- package/template/apps/api/libs/infra/common/decorators/event/event.interceptor.ts +155 -0
- package/template/apps/api/libs/infra/common/decorators/event/event.module.ts +47 -0
- package/template/apps/api/libs/infra/common/decorators/event/handlers/cache-event.handler.ts +159 -0
- package/template/apps/api/libs/infra/common/decorators/event/index.ts +29 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.decorator.ts +221 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.interceptor.ts +150 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.module.ts +27 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.service.spec.ts +330 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/feature-flag.service.ts +423 -0
- package/template/apps/api/libs/infra/common/decorators/feature-flag/index.ts +28 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/dto/rate-limit.dto.ts +201 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/index.ts +54 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.decorator.ts +216 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.exception.ts +74 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.module.ts +37 -0
- package/template/apps/api/libs/infra/common/decorators/rate-limit/rate-limit.service.ts +430 -0
- package/template/apps/api/libs/infra/common/decorators/response.decorator.ts +67 -0
- package/template/apps/api/libs/infra/common/decorators/skip-version-check.decorator.ts +27 -0
- package/template/apps/api/libs/infra/common/decorators/transaction/index.ts +12 -0
- package/template/apps/api/libs/infra/common/decorators/transaction/transactional.decorator.ts +677 -0
- package/template/apps/api/libs/infra/common/decorators/ts-rest-controller.decorator.ts +63 -0
- package/template/apps/api/libs/infra/common/decorators/validation.decorator.ts +120 -0
- package/template/apps/api/libs/infra/common/decorators/version/index.ts +24 -0
- package/template/apps/api/libs/infra/common/decorators/version/version.decorator.ts +168 -0
- package/template/apps/api/libs/infra/common/decorators/version/version.interceptor.ts +97 -0
- package/template/apps/api/libs/infra/common/decorators/version/version.module.ts +21 -0
- package/template/apps/api/libs/infra/common/enums/action.enum.ts +7 -0
- package/template/apps/api/libs/infra/common/enums/error-codes.ts +71 -0
- package/template/apps/api/libs/infra/common/enums/role.enum.ts +4 -0
- package/template/apps/api/libs/infra/common/filter/exception/api.exception.ts +168 -0
- package/template/apps/api/libs/infra/common/filter/exception/exception.ts +47 -0
- package/template/apps/api/libs/infra/common/filter/exception/http.exception.ts +126 -0
- package/template/apps/api/libs/infra/common/guards/index.ts +1 -0
- package/template/apps/api/libs/infra/common/guards/version.guard.ts +312 -0
- package/template/apps/api/libs/infra/common/interceptor/mask/index.ts +1 -0
- package/template/apps/api/libs/infra/common/interceptor/mask/mask.interceptor.ts +242 -0
- package/template/apps/api/libs/infra/common/interceptor/rate-limit/no-rate-limit.interceptor.ts +14 -0
- package/template/apps/api/libs/infra/common/interceptor/rate-limit/rate-limit.interceptor.ts +230 -0
- package/template/apps/api/libs/infra/common/interceptor/transform/transform.interceptor.spec.ts +7 -0
- package/template/apps/api/libs/infra/common/interceptor/transform/transform.interceptor.ts +75 -0
- package/template/apps/api/libs/infra/common/interceptor/version/index.ts +1 -0
- package/template/apps/api/libs/infra/common/interceptor/version/version-header.interceptor.ts +62 -0
- package/template/apps/api/libs/infra/common/middleware/request.middleware.ts +109 -0
- package/template/apps/api/libs/infra/common/package.json +11 -0
- package/template/apps/api/libs/infra/common/pipes/transform-root.pipe.ts +12 -0
- package/template/apps/api/libs/infra/common/ts-rest/index.ts +26 -0
- package/template/apps/api/libs/infra/common/ts-rest/response.helper.ts +233 -0
- package/template/apps/api/libs/infra/i18n/en/errors.json +77 -0
- package/template/apps/api/libs/infra/i18n/en/events.json +1 -0
- package/template/apps/api/libs/infra/i18n/package.json +11 -0
- package/template/apps/api/libs/infra/i18n/zh-CN/errors.json +77 -0
- package/template/apps/api/libs/infra/i18n/zh-CN/events.json +1 -0
- package/template/apps/api/libs/infra/jwt/dto/jwt.dto.ts +1 -0
- package/template/apps/api/libs/infra/jwt/jwt.module.ts +26 -0
- package/template/apps/api/libs/infra/jwt/package.json +11 -0
- package/template/apps/api/libs/infra/prisma/db-metrics/package.json +11 -0
- package/template/apps/api/libs/infra/prisma/db-metrics/src/db-metrics.module.ts +141 -0
- package/template/apps/api/libs/infra/prisma/db-metrics/src/db-metrics.service.ts +456 -0
- package/template/apps/api/libs/infra/prisma/db-metrics/src/index.ts +2 -0
- package/template/apps/api/libs/infra/prisma/db-metrics/tsconfig.lib.json +9 -0
- package/template/apps/api/libs/infra/prisma/middleware/soft-delete.middleware.ts +179 -0
- package/template/apps/api/libs/infra/prisma/package.json +11 -0
- package/template/apps/api/libs/infra/prisma/prisma/index.ts +3 -0
- package/template/apps/api/libs/infra/prisma/prisma/prisma.module.ts +12 -0
- package/template/apps/api/libs/infra/prisma/prisma/prisma.service.ts +18 -0
- package/template/apps/api/libs/infra/prisma/prisma/types.ts +6 -0
- package/template/apps/api/libs/infra/prisma/prisma-read/prisma-read.module.ts +11 -0
- package/template/apps/api/libs/infra/prisma/prisma-read/prisma-read.service.ts +280 -0
- package/template/apps/api/libs/infra/prisma/prisma-write/prisma-write.module.ts +11 -0
- package/template/apps/api/libs/infra/prisma/prisma-write/prisma-write.service.ts +278 -0
- package/template/apps/api/libs/infra/prisma/prometheus/index.ts +1 -0
- package/template/apps/api/libs/infra/prisma/prometheus/prometheus.module.ts +231 -0
- package/template/apps/api/libs/infra/rabbitmq/package.json +11 -0
- package/template/apps/api/libs/infra/rabbitmq/src/dto/rabbitmq.dto.ts +13 -0
- package/template/apps/api/libs/infra/rabbitmq/src/index.ts +5 -0
- package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq-events.module.ts +132 -0
- package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq-events.service.ts +199 -0
- package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.module.ts +101 -0
- package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/rabbitmq/src/rabbitmq.service.ts +543 -0
- package/template/apps/api/libs/infra/rabbitmq/tsconfig.lib.json +9 -0
- package/template/apps/api/libs/infra/redis/dto/redis.dto.ts +3 -0
- package/template/apps/api/libs/infra/redis/package.json +11 -0
- package/template/apps/api/libs/infra/redis/src/index.ts +2 -0
- package/template/apps/api/libs/infra/redis/src/redis.module.ts +63 -0
- package/template/apps/api/libs/infra/redis/src/redis.service.spec.ts +18 -0
- package/template/apps/api/libs/infra/redis/src/redis.service.ts +730 -0
- package/template/apps/api/libs/infra/redis/tsconfig.lib.json +9 -0
- package/template/apps/api/libs/infra/shared-db/index.ts +14 -0
- package/template/apps/api/libs/infra/shared-db/transaction-context.ts +51 -0
- package/template/apps/api/libs/infra/shared-db/transaction.module.ts +15 -0
- package/template/apps/api/libs/infra/shared-db/transaction.perf.spec.ts +226 -0
- package/template/apps/api/libs/infra/shared-db/transactional-service.base.ts +102 -0
- package/template/apps/api/libs/infra/shared-db/unit-of-work.service.ts +142 -0
- package/template/apps/api/libs/infra/shared-services/email/dto/email.dto.ts +87 -0
- package/template/apps/api/libs/infra/shared-services/email/email.module.ts +27 -0
- package/template/apps/api/libs/infra/shared-services/email/email.service.ts +258 -0
- package/template/apps/api/libs/infra/shared-services/email/index.ts +5 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/README.md +376 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/bucket-resolver.ts +306 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.factory.ts +347 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.module.ts +62 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/file-storage.service.ts +849 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/index.ts +57 -0
- package/template/apps/api/libs/infra/shared-services/file-storage/types.ts +210 -0
- package/template/apps/api/libs/infra/shared-services/ip-info/index.ts +2 -0
- package/template/apps/api/libs/infra/shared-services/ip-info/ip-info.module.ts +18 -0
- package/template/apps/api/libs/infra/shared-services/ip-info/ip-info.service.ts +118 -0
- package/template/apps/api/libs/infra/shared-services/sms/index.ts +11 -0
- package/template/apps/api/libs/infra/shared-services/sms/sms.factory.ts +367 -0
- package/template/apps/api/libs/infra/shared-services/sms/sms.module.ts +27 -0
- package/template/apps/api/libs/infra/shared-services/sms/sms.service.ts +315 -0
- package/template/apps/api/libs/infra/shared-services/sms/types.ts +297 -0
- package/template/apps/api/libs/infra/shared-services/streaming-asr/index.ts +50 -0
- package/template/apps/api/libs/infra/shared-services/streaming-asr/streaming-asr.module.ts +47 -0
- package/template/apps/api/libs/infra/shared-services/streaming-asr/streaming-asr.service.ts +1336 -0
- package/template/apps/api/libs/infra/shared-services/streaming-asr/types.ts +208 -0
- package/template/apps/api/libs/infra/shared-services/system-health/index.ts +3 -0
- package/template/apps/api/libs/infra/shared-services/system-health/system-health.controller.ts +61 -0
- package/template/apps/api/libs/infra/shared-services/system-health/system-health.module.ts +16 -0
- package/template/apps/api/libs/infra/shared-services/system-health/system-health.service.ts +69 -0
- package/template/apps/api/libs/infra/shared-services/uploader/index.ts +2 -0
- package/template/apps/api/libs/infra/shared-services/uploader/uploader.module.ts +11 -0
- package/template/apps/api/libs/infra/shared-services/uploader/uploader.service.ts +265 -0
- package/template/apps/api/libs/infra/utils/array-buffer.util.ts +8 -0
- package/template/apps/api/libs/infra/utils/array.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/bcrypt.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/bigint.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/bytes.convert.util.ts +13 -0
- package/template/apps/api/libs/infra/utils/crypto.util.ts +206 -0
- package/template/apps/api/libs/infra/utils/download.ts +21 -0
- package/template/apps/api/libs/infra/utils/enviroment.util.ts +130 -0
- package/template/apps/api/libs/infra/utils/ffmpeg.util.ts +29 -0
- package/template/apps/api/libs/infra/utils/file.util.ts +448 -0
- package/template/apps/api/libs/infra/utils/folder.util.ts +11 -0
- package/template/apps/api/libs/infra/utils/frame.util.ts +24 -0
- package/template/apps/api/libs/infra/utils/http-client.ts +133 -0
- package/template/apps/api/libs/infra/utils/ip.util.ts +22 -0
- package/template/apps/api/libs/infra/utils/json.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/load-env.util.ts +53 -0
- package/template/apps/api/libs/infra/utils/logger.util.ts +121 -0
- package/template/apps/api/libs/infra/utils/object.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/package.json +11 -0
- package/template/apps/api/libs/infra/utils/prisma-error.util.ts +397 -0
- package/template/apps/api/libs/infra/utils/response.ts +23 -0
- package/template/apps/api/libs/infra/utils/serialize.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/string.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/timer.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/urlencode.util.ts +3 -0
- package/template/apps/api/libs/infra/utils/validate.util.ts +3 -0
- package/template/apps/api/nest-cli.json +25 -0
- package/template/apps/api/package.json +174 -0
- package/template/apps/api/prisma/schema.prisma +352 -0
- package/template/apps/api/prisma/seed.ts +30 -0
- package/template/apps/api/scripts/generate-db-crud.js +344 -0
- package/template/apps/api/scripts/insert-country-codes.ts +325 -0
- package/template/apps/api/scripts/link-prisma.js +44 -0
- package/template/apps/api/scripts/validate-api-versions.ts +273 -0
- package/template/apps/api/src/app.module.ts +208 -0
- package/template/apps/api/src/main.ts +298 -0
- package/template/apps/api/src/modules/health/health.controller.ts +13 -0
- package/template/apps/api/src/modules/health/health.module.ts +7 -0
- package/template/apps/api/tsconfig.build.json +4 -0
- package/template/apps/api/tsconfig.json +123 -0
- package/template/apps/web/.env.example +5 -0
- package/template/apps/web/app/globals.css +27 -0
- package/template/apps/web/app/layout.tsx +19 -0
- package/template/apps/web/app/page.tsx +42 -0
- package/template/apps/web/hooks/useAspectRatioSize.ts +187 -0
- package/template/apps/web/hooks/useDebouncedValue.ts +25 -0
- package/template/apps/web/hooks/useErrorHandler.ts +113 -0
- package/template/apps/web/hooks/useHotkeys.ts +251 -0
- package/template/apps/web/hooks/useI18nToast.ts +240 -0
- package/template/apps/web/hooks/useI18nValidation.ts +262 -0
- package/template/apps/web/hooks/useNotificationSSE.ts +270 -0
- package/template/apps/web/hooks/useOperationFeedback.ts +108 -0
- package/template/apps/web/hooks/usePerformanceMonitor.ts +105 -0
- package/template/apps/web/hooks/usePermissions.ts +17 -0
- package/template/apps/web/hooks/useTask.ts +489 -0
- package/template/apps/web/hooks/useVersionCheck.ts +329 -0
- package/template/apps/web/i18n/config.ts +50 -0
- package/template/apps/web/i18n/index.ts +30 -0
- package/template/apps/web/i18n/navigation.ts +26 -0
- package/template/apps/web/i18n/request.ts +50 -0
- package/template/apps/web/i18n/routing.ts +21 -0
- package/template/apps/web/i18n/types.ts +57 -0
- package/template/apps/web/lib/actions/auth.ts +81 -0
- package/template/apps/web/lib/actions/chat.ts +129 -0
- package/template/apps/web/lib/actions/common.ts +13 -0
- package/template/apps/web/lib/actions/task.ts +20 -0
- package/template/apps/web/lib/agent/chat-client.ts +42 -0
- package/template/apps/web/lib/agent/prompts.ts +43 -0
- package/template/apps/web/lib/analytics/components/PageTracker.tsx +137 -0
- package/template/apps/web/lib/analytics/hooks/usePageTracking.ts +137 -0
- package/template/apps/web/lib/analytics/index.ts +180 -0
- package/template/apps/web/lib/api/agents.ts +7 -0
- package/template/apps/web/lib/api/agno-chat.ts +263 -0
- package/template/apps/web/lib/api/auth-server.ts +244 -0
- package/template/apps/web/lib/api/avatar-upload.ts +96 -0
- package/template/apps/web/lib/api/cache-config.ts +236 -0
- package/template/apps/web/lib/api/client.ts +649 -0
- package/template/apps/web/lib/api/contracts/client.ts +336 -0
- package/template/apps/web/lib/api/contracts/hooks/index.ts +25 -0
- package/template/apps/web/lib/api/contracts/hooks/notification.ts +180 -0
- package/template/apps/web/lib/api/contracts/hooks/setting.ts +33 -0
- package/template/apps/web/lib/api/contracts/index.ts +18 -0
- package/template/apps/web/lib/api/contracts/server-client.ts +145 -0
- package/template/apps/web/lib/api/hooks/use-python-task.ts +154 -0
- package/template/apps/web/lib/api/queries/analytics.ts +51 -0
- package/template/apps/web/lib/api/queries/message.ts +75 -0
- package/template/apps/web/lib/api.ts +179 -0
- package/template/apps/web/lib/aspect-ratio.ts +10 -0
- package/template/apps/web/lib/audio-buffer-queue.ts +273 -0
- package/template/apps/web/lib/config.ts +163 -0
- package/template/apps/web/lib/data/industry.json +369 -0
- package/template/apps/web/lib/data/region.json +501 -0
- package/template/apps/web/lib/errors/error-handler.ts +194 -0
- package/template/apps/web/lib/errors/index.ts +16 -0
- package/template/apps/web/lib/errors/streaming-asr-errors.ts +434 -0
- package/template/apps/web/lib/form/index.ts +23 -0
- package/template/apps/web/lib/form/use-form.ts +143 -0
- package/template/apps/web/lib/icons-usage.md +99 -0
- package/template/apps/web/lib/icons.tsx +395 -0
- package/template/apps/web/lib/performance/monitor.ts +225 -0
- package/template/apps/web/lib/requests.ts +177 -0
- package/template/apps/web/lib/storage/index.ts +158 -0
- package/template/apps/web/lib/upload/api.ts +260 -0
- package/template/apps/web/lib/upload/batch-uploader.ts +286 -0
- package/template/apps/web/lib/upload/errors.ts +44 -0
- package/template/apps/web/lib/upload/folder-utils.ts +295 -0
- package/template/apps/web/lib/upload/uploader.ts +439 -0
- package/template/apps/web/lib/utils/reconnect.ts +223 -0
- package/template/apps/web/lib/utils/transcript-export.ts +321 -0
- package/template/apps/web/lib/version-mismatch.ts +147 -0
- package/template/apps/web/lib/version.ts +60 -0
- package/template/apps/web/next-env.d.ts +6 -0
- package/template/apps/web/next.config.ts +97 -0
- package/template/apps/web/package.json +89 -0
- package/template/apps/web/providers/app-provider.tsx +45 -0
- package/template/apps/web/providers/index.tsx +45 -0
- package/template/apps/web/providers/query-provider.tsx +181 -0
- package/template/apps/web/providers/theme-provider.tsx +26 -0
- package/template/apps/web/tsconfig.json +30 -0
- package/template/package.json +91 -0
- package/template/packages/config/eslint/base.js +32 -0
- package/template/packages/config/eslint/next.js +134 -0
- package/template/packages/config/eslint/react-internal.js +41 -0
- package/template/packages/config/eslint.config.mjs +26 -0
- package/template/packages/config/eslint.nestjs.config.mjs +62 -0
- package/template/packages/config/index.ts +2 -0
- package/template/packages/config/package.json +44 -0
- package/template/packages/config/postcss.config.mjs +8 -0
- package/template/packages/config/prettier.config.mjs +14 -0
- package/template/packages/config/tsconfig.json +19 -0
- package/template/packages/config/typescript/base.json +20 -0
- package/template/packages/config/typescript/nextjs.json +12 -0
- package/template/packages/config/typescript/react-library.json +8 -0
- package/template/packages/constants/README.md +111 -0
- package/template/packages/constants/package.json +25 -0
- package/template/packages/constants/src/index.ts +243 -0
- package/template/packages/constants/tsconfig.build.json +13 -0
- package/template/packages/constants/tsconfig.json +12 -0
- package/template/packages/contracts/ERROR-MIGRATION.md +179 -0
- package/template/packages/contracts/README.md +203 -0
- package/template/packages/contracts/jest.config.js +11 -0
- package/template/packages/contracts/package.json +60 -0
- package/template/packages/contracts/src/api/analytics.contract.ts +45 -0
- package/template/packages/contracts/src/api/download.contract.ts +66 -0
- package/template/packages/contracts/src/api/index.ts +12 -0
- package/template/packages/contracts/src/api/message.contract.ts +70 -0
- package/template/packages/contracts/src/api/risk-words.contract.ts +44 -0
- package/template/packages/contracts/src/api/setting.contract.ts +127 -0
- package/template/packages/contracts/src/api/sign.contract.ts +269 -0
- package/template/packages/contracts/src/api/sms.contract.ts +95 -0
- package/template/packages/contracts/src/api/system.contract.ts +52 -0
- package/template/packages/contracts/src/api/task.contract.ts +58 -0
- package/template/packages/contracts/src/api/uploader.contract.ts +93 -0
- package/template/packages/contracts/src/api/user.contract.ts +60 -0
- package/template/packages/contracts/src/api/webhook.contract.ts +73 -0
- package/template/packages/contracts/src/base.ts +319 -0
- package/template/packages/contracts/src/errors/codes.ts +55 -0
- package/template/packages/contracts/src/errors/domains/common.errors.ts +212 -0
- package/template/packages/contracts/src/errors/domains/index.ts +7 -0
- package/template/packages/contracts/src/errors/domains/user.errors.ts +51 -0
- package/template/packages/contracts/src/errors/error-response.ts +145 -0
- package/template/packages/contracts/src/errors/index.ts +16 -0
- package/template/packages/contracts/src/errors/messages.ts +240 -0
- package/template/packages/contracts/src/index.ts +16 -0
- package/template/packages/contracts/src/schemas/analytics.schema.ts +81 -0
- package/template/packages/contracts/src/schemas/download.schema.ts +59 -0
- package/template/packages/contracts/src/schemas/index.ts +18 -0
- package/template/packages/contracts/src/schemas/message.schema.ts +83 -0
- package/template/packages/contracts/src/schemas/risk-words.schema.ts +25 -0
- package/template/packages/contracts/src/schemas/setting.schema.ts +84 -0
- package/template/packages/contracts/src/schemas/sign.schema.ts +171 -0
- package/template/packages/contracts/src/schemas/sms.schema.ts +53 -0
- package/template/packages/contracts/src/schemas/sse.schema.ts +30 -0
- package/template/packages/contracts/src/schemas/system.schema.ts +26 -0
- package/template/packages/contracts/src/schemas/tag.schema.ts +65 -0
- package/template/packages/contracts/src/schemas/task.schema.ts +47 -0
- package/template/packages/contracts/src/schemas/uploader.schema.ts +121 -0
- package/template/packages/contracts/src/schemas/user.schema.ts +75 -0
- package/template/packages/contracts/src/schemas/webhook.schema.ts +72 -0
- package/template/packages/contracts/tsconfig.build.json +20 -0
- package/template/packages/contracts/tsconfig.json +12 -0
- package/template/packages/types/README.md +143 -0
- package/template/packages/types/ai.ts +30 -0
- package/template/packages/types/auth.ts +99 -0
- package/template/packages/types/common.ts +13 -0
- package/template/packages/types/creative.ts +68 -0
- package/template/packages/types/image-factory.ts +122 -0
- package/template/packages/types/index.ts +8 -0
- package/template/packages/types/package.json +21 -0
- package/template/packages/types/task.ts +27 -0
- package/template/packages/types/tsconfig.json +11 -0
- package/template/packages/ui/README.md +30 -0
- package/template/packages/ui/components.json +22 -0
- package/template/packages/ui/eslint.config.js +4 -0
- package/template/packages/ui/package.json +58 -0
- package/template/packages/ui/postcss.config.mjs +6 -0
- package/template/packages/ui/src/components/accordion.tsx +66 -0
- package/template/packages/ui/src/components/alert.tsx +61 -0
- package/template/packages/ui/src/components/avatar.tsx +57 -0
- package/template/packages/ui/src/components/badge.tsx +38 -0
- package/template/packages/ui/src/components/button.tsx +60 -0
- package/template/packages/ui/src/components/calendar.tsx +71 -0
- package/template/packages/ui/src/components/card.tsx +92 -0
- package/template/packages/ui/src/components/carousel.tsx +241 -0
- package/template/packages/ui/src/components/checkbox.tsx +32 -0
- package/template/packages/ui/src/components/command.tsx +184 -0
- package/template/packages/ui/src/components/dialog.tsx +134 -0
- package/template/packages/ui/src/components/dropdown-menu.tsx +257 -0
- package/template/packages/ui/src/components/empty.tsx +104 -0
- package/template/packages/ui/src/components/field.tsx +248 -0
- package/template/packages/ui/src/components/form.tsx +172 -0
- package/template/packages/ui/src/components/input-group.tsx +170 -0
- package/template/packages/ui/src/components/input.tsx +21 -0
- package/template/packages/ui/src/components/item.tsx +193 -0
- package/template/packages/ui/src/components/label.tsx +24 -0
- package/template/packages/ui/src/components/password-strength.tsx +248 -0
- package/template/packages/ui/src/components/popover.tsx +48 -0
- package/template/packages/ui/src/components/progress.tsx +35 -0
- package/template/packages/ui/src/components/scroll-area.tsx +48 -0
- package/template/packages/ui/src/components/select.tsx +190 -0
- package/template/packages/ui/src/components/separator.tsx +28 -0
- package/template/packages/ui/src/components/sheet.tsx +139 -0
- package/template/packages/ui/src/components/sidebar.tsx +729 -0
- package/template/packages/ui/src/components/skeleton.tsx +13 -0
- package/template/packages/ui/src/components/slider.tsx +87 -0
- package/template/packages/ui/src/components/sonner.tsx +40 -0
- package/template/packages/ui/src/components/switch.tsx +31 -0
- package/template/packages/ui/src/components/tabs.tsx +66 -0
- package/template/packages/ui/src/components/textarea.tsx +18 -0
- package/template/packages/ui/src/components/tooltip.tsx +61 -0
- package/template/packages/ui/src/hooks/use-mobile.ts +21 -0
- package/template/packages/ui/src/index.ts +38 -0
- package/template/packages/ui/src/lib/utils.ts +6 -0
- package/template/packages/ui/src/styles/globals.css +134 -0
- package/template/packages/ui/tsconfig.json +11 -0
- package/template/packages/ui/tsconfig.lint.json +8 -0
- package/template/packages/utils/README.md +173 -0
- package/template/packages/utils/array.util.ts +335 -0
- package/template/packages/utils/bcrypt.util.ts +10 -0
- package/template/packages/utils/bigint.util.ts +111 -0
- package/template/packages/utils/cn.ts +6 -0
- package/template/packages/utils/encrypt.ts +104 -0
- package/template/packages/utils/fetch.ts +170 -0
- package/template/packages/utils/file.ts +275 -0
- package/template/packages/utils/headers.ts +116 -0
- package/template/packages/utils/index.ts +22 -0
- package/template/packages/utils/jest.config.js +28 -0
- package/template/packages/utils/json.util.ts +9 -0
- package/template/packages/utils/mask.util.ts +348 -0
- package/template/packages/utils/object.util.ts +149 -0
- package/template/packages/utils/package.json +112 -0
- package/template/packages/utils/serialize.util.ts +17 -0
- package/template/packages/utils/string.util.ts +159 -0
- package/template/packages/utils/timer.util.ts +210 -0
- package/template/packages/utils/tsconfig.build.json +17 -0
- package/template/packages/utils/tsconfig.json +13 -0
- package/template/packages/utils/urlencode.util.ts +18 -0
- package/template/packages/utils/validate.util.ts +25 -0
- package/template/packages/validators/README.md +149 -0
- package/template/packages/validators/jest.config.js +20 -0
- package/template/packages/validators/package.json +32 -0
- package/template/packages/validators/src/index.ts +178 -0
- package/template/packages/validators/tsconfig.build.json +19 -0
- package/template/packages/validators/tsconfig.json +12 -0
- package/template/pnpm-lock.yaml +21574 -0
- package/template/pnpm-workspace.yaml +4 -0
- package/template/scripts/generate-i18n-errors.ts +371 -0
- package/template/scripts/generate-prisma-enums.js +170 -0
- package/template/scripts/generate-prisma-enums.ts +172 -0
- package/template/scripts/init-project.js +232 -0
- 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.**
|