Files
wwjcloud-nest-v1/wwjcloud/src/config/schemas/appSchema.ts

107 lines
3.3 KiB
TypeScript
Raw Normal View History

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;
}