This commit is contained in:
Baobhan Sith
2025-04-19 21:10:04 +08:00
parent 283fa02a18
commit d6cb9f1846
7 changed files with 276 additions and 117 deletions
@@ -6,6 +6,8 @@ import { ipBlacklistService } from '../services/ip-blacklist.service'; // 引入
const auditLogService = new AuditLogService(); // 实例化 AuditLogService
export const settingsController = {
// ... (getAllSettings, updateSettings, getFocusSwitcherSequence 保持不变) ...
/**
* 获取所有设置项
*/
@@ -31,11 +33,11 @@ export const settingsController = {
return;
}
// --- 过滤掉外观设置相关的键 ---
// --- 过滤掉外观设置和焦点切换顺序相关的键 ---
const allowedSettingsKeys = [
'language', 'ipWhitelist', 'maxLoginAttempts', 'loginBanDuration',
'showPopupFileEditor', 'shareFileEditorTabs', 'ipWhitelistEnabled' // 添加 ipWhitelistEnabled
// 在这里添加其他允许的通用设置键
'showPopupFileEditor', 'shareFileEditorTabs', 'ipWhitelistEnabled'
// 不在此处处理 'focusSwitcherSequence'
];
const filteredSettings: Record<string, string> = {};
for (const key in settingsToUpdate) {
@@ -51,29 +53,75 @@ export const settingsController = {
}
// 记录审计日志
// 区分 IP 白名单更新和其他设置更新
// 注意:现在审计日志可能需要更精细的逻辑,因为它只记录了实际更新的通用设置
const updatedKeys = Object.keys(filteredSettings); // 使用过滤后的键
if (updatedKeys.length > 0) { // 只有实际更新了才记录
const updatedKeys = Object.keys(filteredSettings);
if (updatedKeys.length > 0) {
if (updatedKeys.includes('ipWhitelist') || updatedKeys.includes('ipWhitelistEnabled')) {
auditLogService.logAction('IP_WHITELIST_UPDATED', { updatedKeys });
} else {
auditLogService.logAction('SETTINGS_UPDATED', { updatedKeys });
}
}
res.status(200).json({ message: '设置已成功更新' }); // 即使没有更新通用设置也返回成功
res.status(200).json({ message: '设置已成功更新' });
} catch (error: any) {
console.error('更新设置时出错:', error);
res.status(500).json({ message: '更新设置失败', error: error.message });
}
},
// 注意:通常不直接通过 API 提供单个设置项的获取、设置或删除,
// 而是通过批量获取/更新来管理。如果需要单独操作,可以添加相应方法。
// 例如:
// async getSetting(req: Request, res: Response): Promise<void> { ... }
// async setSetting(req: Request, res: Response): Promise<void> { ... }
// async deleteSetting(req: Request, res: Response): Promise<void> { ... }
// +++ 新增:获取焦点切换顺序 +++
/**
* 获取焦点切换顺序
*/
async getFocusSwitcherSequence(req: Request, res: Response): Promise<void> {
try {
console.log('[Controller] Received request to get focus switcher sequence.'); // +++ 添加日志 +++
const sequence = await settingsService.getFocusSwitcherSequence();
console.log('[Controller] Sending focus switcher sequence to client:', JSON.stringify(sequence)); // +++ 添加日志 +++
res.json(sequence);
} catch (error: any) {
console.error('[Controller] 获取焦点切换顺序时出错:', error); // +++ 更新日志前缀 +++
res.status(500).json({ message: '获取焦点切换顺序失败', error: error.message });
}
},
// +++ 新增:设置焦点切换顺序 +++
/**
* 设置焦点切换顺序
*/
async setFocusSwitcherSequence(req: Request, res: Response): Promise<void> {
console.log('[Controller] Received request to set focus switcher sequence.'); // +++ 添加日志 +++
try {
const { sequence } = req.body;
console.log('[Controller] Request body sequence:', JSON.stringify(sequence)); // +++ 添加日志 +++
// 输入验证
if (!Array.isArray(sequence) || !sequence.every(item => typeof item === 'string')) {
console.warn('[Controller] Invalid sequence format received:', sequence); // +++ 添加日志 +++
res.status(400).json({ message: '无效的请求体,"sequence" 必须是一个字符串数组' });
return;
}
console.log('[Controller] Calling settingsService.setFocusSwitcherSequence...'); // +++ 添加日志 +++
await settingsService.setFocusSwitcherSequence(sequence);
console.log('[Controller] settingsService.setFocusSwitcherSequence completed successfully.'); // +++ 添加日志 +++
// 记录审计日志 (可选)
console.log('[Controller] Logging audit action: FOCUS_SWITCHER_SEQUENCE_UPDATED'); // +++ 添加日志 +++
auditLogService.logAction('FOCUS_SWITCHER_SEQUENCE_UPDATED', { sequence });
console.log('[Controller] Sending success response.'); // +++ 添加日志 +++
res.status(200).json({ message: '焦点切换顺序已成功更新' });
} catch (error: any) {
console.error('[Controller] 设置焦点切换顺序时出错:', error); // +++ 更新日志前缀 +++
// 区分是服务层抛出的验证错误还是其他错误
if (error.message === 'Invalid sequence format provided.') {
res.status(400).json({ message: '设置焦点切换顺序失败: 无效的格式', error: error.message });
} else {
res.status(500).json({ message: '设置焦点切换顺序失败', error: error.message });
}
}
},
/**
* 获取 IP 黑名单列表 (分页)