|
| 1 | +/** |
| 2 | + * iTop CMDB 同步 — 配置管理路由 |
| 3 | + * GET /cmdb-sync/config 获取当前配置 |
| 4 | + * PUT /cmdb-sync/config 保存配置(admin) |
| 5 | + * POST /cmdb-sync/config/test 测试 iTop 连接(admin) |
| 6 | + */ |
| 7 | + |
| 8 | +import { Router, type Request, type Response } from 'express'; |
| 9 | +import { z } from 'zod'; |
| 10 | +import { requireRole } from '../../../middleware/auth'; |
| 11 | +import { validateBody } from '../../../middleware/validation'; |
| 12 | +import { getErrorMessage } from '../../../utils/errorHelpers'; |
| 13 | +import { logger } from '../../../utils/logger'; |
| 14 | +import { itopConfigService } from '../services/itopConfigService'; |
| 15 | + |
| 16 | +const router = Router(); |
| 17 | + |
| 18 | +// PUT /cmdb-sync/config 入参校验 |
| 19 | +const saveConfigSchema = z.object({ |
| 20 | + apiBase: z.string().url('API 地址格式不正确').optional().or(z.literal('')), |
| 21 | + authUser: z.string().max(64).optional(), |
| 22 | + authToken: z.string().max(512).optional(), |
| 23 | + syncEnabled: z.boolean().optional(), |
| 24 | + syncIntervalMinutes: z.number().int().min(1).max(1440).optional(), |
| 25 | + timeoutMs: z.number().int().min(1000).max(300000).optional(), |
| 26 | + sslVerify: z.boolean().optional(), |
| 27 | +}); |
| 28 | + |
| 29 | +// POST /cmdb-sync/config/test 入参校验(全部可选,允许用已存配置测试) |
| 30 | +const testConnectionSchema = z.object({ |
| 31 | + apiBase: z.string().optional(), |
| 32 | + authUser: z.string().optional(), |
| 33 | + authToken: z.string().optional(), |
| 34 | + sslVerify: z.boolean().optional(), |
| 35 | +}); |
| 36 | + |
| 37 | +// GET /cmdb-sync/config — 获取当前 iTop 配置 |
| 38 | +router.get('/config', (_req: Request, res: Response) => { |
| 39 | + try { |
| 40 | + const config = itopConfigService.getConfig(); |
| 41 | + res.json({ success: true, data: config }); |
| 42 | + } catch (error) { |
| 43 | + logger.error('Failed to get iTop config:', error as Error); |
| 44 | + res.status(500).json({ success: false, message: getErrorMessage(error) }); |
| 45 | + } |
| 46 | +}); |
| 47 | + |
| 48 | +// PUT /cmdb-sync/config — 保存 iTop 配置 |
| 49 | +router.put( |
| 50 | + '/config', |
| 51 | + requireRole('admin'), |
| 52 | + validateBody(saveConfigSchema), |
| 53 | + (req: Request, res: Response) => { |
| 54 | + try { |
| 55 | + const saved = itopConfigService.saveConfig(req.body); |
| 56 | + res.json({ success: true, data: saved, message: '配置已保存' }); |
| 57 | + } catch (error) { |
| 58 | + logger.error('Failed to save iTop config:', error as Error); |
| 59 | + res.status(500).json({ success: false, message: getErrorMessage(error) }); |
| 60 | + } |
| 61 | + }, |
| 62 | +); |
| 63 | + |
| 64 | +// POST /cmdb-sync/config/test — 测试 iTop 连接 |
| 65 | +router.post( |
| 66 | + '/config/test', |
| 67 | + requireRole('admin'), |
| 68 | + validateBody(testConnectionSchema), |
| 69 | + async (req: Request, res: Response) => { |
| 70 | + try { |
| 71 | + // 支持用 body 传入临时配置测试,也支持用已存储配置测试 |
| 72 | + const result = await itopConfigService.testConnection(req.body); |
| 73 | + res.json({ success: result.success, data: result }); |
| 74 | + } catch (error) { |
| 75 | + logger.error('Failed to test iTop connection:', error as Error); |
| 76 | + res.status(500).json({ success: false, message: getErrorMessage(error) }); |
| 77 | + } |
| 78 | + }, |
| 79 | +); |
| 80 | + |
| 81 | +export default router; |
0 commit comments