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