refactor(validators): 消除重复代码,使用映射表和复用函数

代码审查后的重构:
- isPathAllowedForClient 复用 getClientDefinitionById 避免重复查找
- validateRequest 中使用 getClientDefinitionById 替代内联查找
- 使用 VALIDATOR_MAP 映射表替代 switch 语句
- getSupportedClients 改为从映射表动态获取,避免硬编码
- 导入 CLIENT_IDS 枚举,提高类型安全性

这些改动提高了代码的可维护性,添加新客户端时只需修改映射表。
This commit is contained in:
QTom
2026-01-24 17:44:10 +08:00
parent 6c4670213e
commit 6dc85b39c9
2 changed files with 18 additions and 16 deletions

View File

@@ -97,7 +97,7 @@ function isValidClientId(clientId) {
* @returns {boolean} 是否允许
*/
function isPathAllowedForClient(clientId, path) {
const definition = Object.values(CLIENT_DEFINITIONS).find((d) => d.id === clientId)
const definition = getClientDefinitionById(clientId)
if (!definition) {
return false
}

View File

@@ -5,8 +5,9 @@
const logger = require('../utils/logger')
const {
CLIENT_DEFINITIONS,
CLIENT_IDS,
getAllClientDefinitions,
getClientDefinitionById,
isPathAllowedForClient
} = require('./clientDefinitions')
const ClaudeCodeValidator = require('./clients/claudeCodeValidator')
@@ -14,6 +15,14 @@ const GeminiCliValidator = require('./clients/geminiCliValidator')
const CodexCliValidator = require('./clients/codexCliValidator')
const DroidCliValidator = require('./clients/droidCliValidator')
// 客户端ID到验证器的映射表
const VALIDATOR_MAP = {
[CLIENT_IDS.CLAUDE_CODE]: ClaudeCodeValidator,
[CLIENT_IDS.GEMINI_CLI]: GeminiCliValidator,
[CLIENT_IDS.CODEX_CLI]: CodexCliValidator,
[CLIENT_IDS.DROID_CLI]: DroidCliValidator
}
/**
* 客户端验证器类
*/
@@ -24,19 +33,12 @@ class ClientValidator {
* @returns {Object|null} 验证器实例
*/
static getValidator(clientId) {
switch (clientId) {
case 'claude_code':
return ClaudeCodeValidator
case 'gemini_cli':
return GeminiCliValidator
case 'codex_cli':
return CodexCliValidator
case 'droid_cli':
return DroidCliValidator
default:
logger.warn(`Unknown client ID: ${clientId}`)
return null
const validator = VALIDATOR_MAP[clientId]
if (!validator) {
logger.warn(`Unknown client ID: ${clientId}`)
return null
}
return validator
}
/**
@@ -44,7 +46,7 @@ class ClientValidator {
* @returns {Array<string>} 客户端ID列表
*/
static getSupportedClients() {
return ['claude_code', 'gemini_cli', 'codex_cli', 'droid_cli']
return Object.keys(VALIDATOR_MAP)
}
/**
@@ -115,7 +117,7 @@ class ClientValidator {
allowed: true,
matchedClient: clientId,
clientName: validator.getName(),
clientInfo: Object.values(CLIENT_DEFINITIONS).find((def) => def.id === clientId)
clientInfo: getClientDefinitionById(clientId)
}
}
} catch (error) {