- 重构sys模块架构,严格按admin/api/core分层 - 对齐所有sys实体与数据库表结构 - 实现完整的adminapi控制器,匹配PHP/Java契约 - 修复依赖注入问题,确保服务正确注册 - 添加自动迁移工具和契约验证 - 完善多租户支持和审计功能 - 统一命名规范,与PHP业务逻辑保持一致
107 lines
3.3 KiB
TypeScript
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;
|
|
}
|