Files
performance-evaluation-system/backend/src/routes/config.ts
2026-04-11 11:51:54 +08:00

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;