126 lines
4.6 KiB
TypeScript
126 lines
4.6 KiB
TypeScript
import { Router, Request, Response } from 'express';
|
|
import { authenticate } from '../middlewares/authenticate';
|
|
import { authorize } from '../middlewares/authorize';
|
|
import { getAllRules, getRuleByKey, updateRule, updateRules } from '../services/ConfigService';
|
|
|
|
const router = Router();
|
|
|
|
router.use(authenticate);
|
|
|
|
// ─── GET /api/config/rules ────────────────────────────────────────────────────
|
|
// Returns all current performance evaluation rules.
|
|
// Requirements: 8.5
|
|
router.get(
|
|
'/rules',
|
|
authorize('generalManager'),
|
|
async (_req: Request, res: Response) => {
|
|
try {
|
|
const rules = await getAllRules();
|
|
return res.json({ code: 200, message: '查询成功', data: rules });
|
|
} catch (err) {
|
|
console.error('[config/rules GET]', err);
|
|
return res.status(500).json({ code: 500, message: '服务器内部错误' });
|
|
}
|
|
}
|
|
);
|
|
|
|
// ─── GET /api/config/rules/:ruleKey ──────────────────────────────────────────
|
|
// Returns a single rule by its key.
|
|
// Requirements: 8.5
|
|
router.get(
|
|
'/rules/:ruleKey',
|
|
authorize('generalManager'),
|
|
async (req: Request, res: Response) => {
|
|
const { ruleKey } = req.params;
|
|
try {
|
|
const rule = await getRuleByKey(ruleKey);
|
|
if (!rule) {
|
|
return res.status(404).json({ code: 404, message: '规则不存在' });
|
|
}
|
|
return res.json({ code: 200, message: '查询成功', data: rule });
|
|
} catch (err) {
|
|
console.error('[config/rules/:ruleKey GET]', err);
|
|
return res.status(500).json({ code: 500, message: '服务器内部错误' });
|
|
}
|
|
}
|
|
);
|
|
|
|
// ─── PUT /api/config/rules ────────────────────────────────────────────────────
|
|
// Batch update multiple rules. Logs each change and applies to subsequent cycles.
|
|
// Body: { rules: Array<{ ruleKey, ruleValue, description?, effectiveCycle? }> }
|
|
// Requirements: 8.5, 8.6
|
|
router.put(
|
|
'/rules',
|
|
authorize('generalManager'),
|
|
async (req: Request, res: Response) => {
|
|
const user = req.user!;
|
|
const { rules } = req.body as { rules?: unknown[] };
|
|
|
|
if (!Array.isArray(rules) || rules.length === 0) {
|
|
return res.status(400).json({ code: 400, message: 'rules 数组不能为空' });
|
|
}
|
|
|
|
// Validate each rule entry
|
|
for (const item of rules) {
|
|
const r = item as Record<string, unknown>;
|
|
if (!r.ruleKey || typeof r.ruleKey !== 'string') {
|
|
return res.status(400).json({ code: 400, message: '每条规则必须包含有效的 ruleKey' });
|
|
}
|
|
if (r.ruleValue === undefined) {
|
|
return res.status(400).json({ code: 400, message: `规则 ${r.ruleKey} 缺少 ruleValue` });
|
|
}
|
|
}
|
|
|
|
try {
|
|
const updated = await updateRules(
|
|
(rules as Array<Record<string, unknown>>).map((r) => ({
|
|
ruleKey: r.ruleKey as string,
|
|
ruleValue: r.ruleValue,
|
|
description: r.description as string | undefined,
|
|
effectiveCycle: r.effectiveCycle as string | undefined,
|
|
})),
|
|
user.userId
|
|
);
|
|
return res.json({ code: 200, message: '规则更新成功', data: updated });
|
|
} catch (err) {
|
|
console.error('[config/rules PUT]', err);
|
|
return res.status(500).json({ code: 500, message: '服务器内部错误' });
|
|
}
|
|
}
|
|
);
|
|
|
|
// ─── PUT /api/config/rules/:ruleKey ──────────────────────────────────────────
|
|
// Update a single rule by key. Logs the change and applies to subsequent cycles.
|
|
// Body: { ruleValue, description?, effectiveCycle? }
|
|
// Requirements: 8.5, 8.6
|
|
router.put(
|
|
'/rules/:ruleKey',
|
|
authorize('generalManager'),
|
|
async (req: Request, res: Response) => {
|
|
const user = req.user!;
|
|
const { ruleKey } = req.params;
|
|
const { ruleValue, description, effectiveCycle } = req.body as {
|
|
ruleValue?: unknown;
|
|
description?: string;
|
|
effectiveCycle?: string;
|
|
};
|
|
|
|
if (ruleValue === undefined) {
|
|
return res.status(400).json({ code: 400, message: 'ruleValue 不能为空' });
|
|
}
|
|
|
|
try {
|
|
const updated = await updateRule(
|
|
{ ruleKey, ruleValue, description, effectiveCycle },
|
|
user.userId
|
|
);
|
|
return res.json({ code: 200, message: '规则更新成功', data: updated });
|
|
} catch (err) {
|
|
console.error('[config/rules/:ruleKey PUT]', err);
|
|
return res.status(500).json({ code: 500, message: '服务器内部错误' });
|
|
}
|
|
}
|
|
);
|
|
|
|
export default router;
|