Files
wwjcloud-nest-v1/wwjcloud/src/config/schemas/appSchema.ts
万物街 127a4db1e3 feat: 完成sys模块迁移,对齐PHP/Java框架
- 重构sys模块架构,严格按admin/api/core分层
- 对齐所有sys实体与数据库表结构
- 实现完整的adminapi控制器,匹配PHP/Java契约
- 修复依赖注入问题,确保服务正确注册
- 添加自动迁移工具和契约验证
- 完善多租户支持和审计功能
- 统一命名规范,与PHP业务逻辑保持一致
2025-09-21 21:29:28 +08:00

107 lines
3.3 KiB
TypeScript

import Joi from 'joi';
/**
* 应用配置验证模式
*/
export const AppConfigSchema = Joi.object({
NODE_ENV: Joi.string().valid('development', 'test', 'production').required(),
PORT: Joi.number().default(3000),
APP_NAME: Joi.string().optional(),
APP_VERSION: Joi.string().optional(),
TZ: Joi.string().optional(),
// 数据库配置验证
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().required(),
DB_USERNAME: Joi.string().required(),
DB_PASSWORD: Joi.string().allow('').required(),
DB_DATABASE: Joi.string().required(),
DB_SYNC: Joi.boolean().optional(),
DB_LOGGING: Joi.boolean().optional(),
// 补充数据库连接细粒度参数(与 appConfig.ts 对齐)
DB_CONN_LIMIT: Joi.number().optional(),
DB_ACQUIRE_TIMEOUT_MS: Joi.number().optional(),
DB_QUERY_TIMEOUT_MS: Joi.number().optional(),
DB_CACHE_DURATION_MS: Joi.number().optional(),
DB_TIMEZONE: Joi.string().optional(),
DB_CHARSET: Joi.string().optional(),
// Redis配置验证
REDIS_HOST: Joi.string().optional(),
REDIS_PORT: Joi.number().optional(),
REDIS_PASSWORD: Joi.string().allow('').optional(),
REDIS_DB: Joi.number().optional(),
REDIS_KEY_PREFIX: Joi.string().optional(),
// Kafka配置验证
KAFKA_CLIENT_ID: Joi.string().optional(),
KAFKA_BROKERS: Joi.string().optional(),
KAFKA_GROUP_ID: Joi.string().optional(),
KAFKA_TOPIC_PREFIX: Joi.string().optional(),
// JWT配置验证
JWT_SECRET: Joi.string().required(),
JWT_EXPIRES_IN: Joi.string().optional(),
JWT_ALGORITHM: Joi.string().optional(),
// 缓存配置验证
CACHE_TTL: Joi.number().optional(),
CACHE_MAX_ITEMS: Joi.number().optional(),
CACHE_PREFIX: Joi.string().optional(),
// 日志配置验证
LOG_LEVEL: Joi.string().optional(),
LOG_FORMAT: Joi.string().optional(),
LOG_FILENAME: Joi.string().optional(),
// 上传配置验证
UPLOAD_PATH: Joi.string().optional(),
UPLOAD_MAX_SIZE: Joi.number().optional(),
UPLOAD_ALLOWED_TYPES: Joi.string().optional(),
// 限流配置验证
THROTTLE_TTL: Joi.number().optional(),
THROTTLE_LIMIT: Joi.number().optional(),
// 健康检查配置验证
STARTUP_HEALTH_CHECK: Joi.string().valid('true', 'false').optional(),
STARTUP_HEALTH_TIMEOUT_MS: Joi.number().optional(),
// 队列配置验证(当前为可选项,供队列模块读取)
TASK_QUEUE_ADAPTER: Joi.string()
.valid('redis', 'database-outbox', 'memory')
.optional(),
QUEUE_REMOVE_ON_COMPLETE: Joi.number().optional(),
QUEUE_REMOVE_ON_FAIL: Joi.number().optional(),
QUEUE_DEFAULT_ATTEMPTS: Joi.number().optional(),
QUEUE_BACKOFF_DELAY: Joi.number().optional(),
// 第三方服务配置验证
STORAGE_PROVIDER: Joi.string().optional(),
STORAGE_CONFIG: Joi.string().optional(),
PAYMENT_PROVIDER: Joi.string()
.valid('mock', 'alipay', 'wechat', 'stripe')
.optional(),
PAYMENT_CONFIG: Joi.string().optional(),
SMS_PROVIDER: Joi.string().optional(),
SMS_CONFIG: Joi.string().optional(),
}).unknown(true);
/**
* 验证配置
* @param config 配置对象
* @returns 验证结果
*/
export function validateAppConfig(config: Record<string, any>) {
const { error, value } = AppConfigSchema.validate(config, {
allowUnknown: true,
abortEarly: false,
});
if (error) {
throw new Error(`应用配置验证失败: ${error.message}`);
}
return value;
}