/**
* 验证工具
* 用于参数验证和数据校验
*/
const Joi = require('joi');
/**
* 验证输入参数
* @param {Object} input - 输入参数
* @param {Object} schema - 验证模式
* @returns {Object} 验证后的数据
* @throws {Error} 验证失败时抛出错误
*/
function validateInput(input, schema) {
const { error, value } = schema.validate(input, { abortEarly: false });
if (error) {
const errorMessage = error.details.map(detail => detail.message).join('; ');
throw new Error(`验证失败: ${errorMessage}`);
}
return value;
}
/**
* 根据工具名称验证参数
* @param {string} toolName - 工具名称
* @param {Object} args - 参数对象
* @returns {Object} 验证结果
*/
function validateToolInput(toolName, args) {
try {
let schema;
switch (toolName) {
case 'yijing_generate_hexagram':
schema = createYijingGenerateHexagramSchema();
break;
case 'yijing_interpret':
schema = createYijingInterpretSchema();
break;
case 'yijing_advise':
schema = createYijingAdviseSchema();
break;
case 'bazi_generate_chart':
schema = createBaziGenerateChartSchema();
break;
case 'bazi_analyze':
schema = createBaziAnalyzeSchema();
break;
case 'bazi_forecast':
schema = createBaziForecastSchema();
break;
case 'combined_analysis':
schema = createCombinedAnalysisSchema();
break;
case 'destiny_consult':
schema = createDestinyConsultSchema();
break;
case 'knowledge_learn':
schema = createKnowledgeLearnSchema();
break;
case 'case_study':
schema = createCaseStudySchema();
break;
default:
// 对于未知工具,跳过验证
return { isValid: true, value: args };
}
const value = validateInput(args, schema);
return { isValid: true, value };
} catch (error) {
return {
isValid: false,
errors: [error.message],
value: null
};
}
}
/**
* 创建易经卦象生成验证模式
* @returns {Object} Joi验证模式
*/
function createYijingGenerateHexagramSchema() {
return Joi.object({
method: Joi.string().valid('number', 'time', 'plum_blossom', 'random').required(),
question: Joi.string().min(3).max(500).required(),
seed: Joi.string().optional()
});
}
module.exports = {
validateInput,
validateToolInput,
createYijingGenerateHexagramSchema,
createYijingInterpretSchema,
createYijingAdviseSchema,
createBaziGenerateChartSchema,
createBaziAnalyzeSchema,
createBaziForecastSchema,
createCombinedAnalysisSchema,
createDestinyConsultSchema,
createKnowledgeLearnSchema,
createCaseStudySchema
};
/**
* 创建易经卦象解读验证模式
* @returns {Object} Joi验证模式
*/
function createYijingInterpretSchema() {
return Joi.object({
hexagram: Joi.object().required(),
focus: Joi.string().valid('overall', 'specific_line', 'changing_hexagram').default('overall'),
line_number: Joi.when('focus', {
is: 'specific_line',
then: Joi.number().integer().min(1).max(6).required(),
otherwise: Joi.number().optional()
})
});
}
/**
* 创建易经建议验证模式
* @returns {Object} Joi验证模式
*/
function createYijingAdviseSchema() {
return Joi.object({
hexagram: Joi.object().required(),
question: Joi.string().min(3).max(500).required(),
time_frame: Joi.string().valid('immediate', 'short_term', 'medium_term', 'long_term').default('medium_term')
});
}
/**
* 创建八字排盘验证模式
* @returns {Object} Joi验证模式
*/
function createBaziGenerateChartSchema() {
return Joi.object({
birth_time: Joi.alternatives().try(
Joi.date().iso(),
Joi.string().pattern(/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/)
).required(),
is_lunar: Joi.boolean().default(false),
gender: Joi.string().valid('male', 'female', '男', '女').required(),
birth_location: Joi.object({
latitude: Joi.number().min(-90).max(90).optional(),
longitude: Joi.number().min(-180).max(180).optional(),
timezone: Joi.string().default('Asia/Shanghai')
}).optional()
});
}
/**
* 创建八字分析验证模式
* @returns {Object} Joi验证模式
*/
function createBaziAnalyzeSchema() {
return Joi.object({
chart: Joi.object().required(),
analysis_type: Joi.array().items(
Joi.string().valid('personality', 'career', 'wealth', 'relationship', 'health')
).single().default(['personality']),
detail_level: Joi.string().valid('basic', 'standard', 'detailed').default('standard')
});
}
/**
* 创建八字预测验证模式
* @returns {Object} Joi验证模式
*/
function createBaziForecastSchema() {
return Joi.object({
chart: Joi.object().required(),
start_date: Joi.date().iso().default(() => new Date()),
end_date: Joi.date().iso().min(Joi.ref('start_date')),
aspects: Joi.array().items(
Joi.string().valid('career', 'wealth', 'relationship', 'health', 'general')
).single().default(['general']),
resolution: Joi.string().valid('year', 'month', 'day').default('month')
});
}
/**
* 创建综合分析验证模式
* @returns {Object} Joi验证模式
*/
function createCombinedAnalysisSchema() {
return Joi.object({
bazi_chart: Joi.object().required(),
hexagram: Joi.object().optional(),
question: Joi.string().min(3).max(500).required(),
focus_areas: Joi.array().items(
Joi.string().valid('career', 'wealth', 'relationship', 'health', 'general')
).single().default(['general']),
analysis_depth: Joi.string().valid('basic', 'standard', 'detailed').default('standard')
});
}
/**
* 创建命运咨询验证模式
* @returns {Object} Joi验证模式
*/
function createDestinyConsultSchema() {
return Joi.object({
user_profile: Joi.object({
birth_time: Joi.alternatives().try(
Joi.date().iso(),
Joi.string().pattern(/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/)
).required(),
gender: Joi.string().valid('male', 'female', '男', '女').required(),
birth_location: Joi.object().optional(),
bazi_chart: Joi.object().optional()
}).required(),
question: Joi.string().min(3).max(500).required(),
context: Joi.array().items(Joi.string()).default([]),
consultation_type: Joi.string().valid(
'guidance', 'analysis', 'prediction', 'suggestion'
).default('analysis')
});
}
/**
* 创建知识学习验证模式
* @returns {Object} Joi验证模式
*/
function createKnowledgeLearnSchema() {
return Joi.object({
topic: Joi.string().required(),
system: Joi.string().valid('yijing', 'bazi', 'both').default('both'),
level: Joi.string().valid('beginner', 'intermediate', 'advanced').default('intermediate'),
format: Joi.string().valid('text', 'structured', 'interactive').default('structured')
});
}
/**
* 创建案例分析验证模式
* @returns {Object} Joi验证模式
*/
function createCaseStudySchema() {
return Joi.object({
case_id: Joi.alternatives().try(
Joi.string(),
Joi.number().integer().positive()
).optional(),
system: Joi.string().valid('yijing', 'bazi', 'combined').default('combined'),
category: Joi.string().valid(
'career', 'relationship', 'health', 'wealth', 'general'
).default('general'),
analysis_focus: Joi.string().optional()
});
}