const { getApprovalArchiveDetail, listApprovalArchives } = require("../services/integrations/wecomApprovalArchive"); const { AppError } = require("../utils/AppError"); const { sendData } = require("../utils/reply"); const ARCHIVE_VIEW_PERMISSIONS = new Set([ "leave.view_own", "attendance.view_own", "leave.view_all", "attendance.view_all", "*", ]); function notFound() { return new AppError({ code: "SYS_404", message: "Not Found", statusCode: 404, }); } function hasArchiveViewPermission(employee = {}) { const roleCodes = employee.roleCodes || []; const permissionCodes = employee.permissionCodes || []; return roleCodes.includes("admin") || roleCodes.includes("hr") || permissionCodes.some((code) => ARCHIVE_VIEW_PERMISSIONS.has(code)); } function ensureArchiveViewPermission(request) { if (hasArchiveViewPermission(request.employee)) { return; } throw new AppError({ code: "PERM_001", message: "无权限", statusCode: 403, details: { permission: "leave.view_own|attendance.view_own" }, }); } async function wecomApprovalArchiveRoutes(fastify) { fastify.get("/wecom/approval-archive", { preHandler: fastify.authenticate }, async (request, reply) => { ensureArchiveViewPermission(request); const result = await listApprovalArchives({ prisma: fastify.prisma, actor: request.employee, query: request.query || {}, }); return sendData(reply, request, result); }); fastify.get("/wecom/approval-archive/:id", { preHandler: fastify.authenticate }, async (request, reply) => { ensureArchiveViewPermission(request); const item = await getApprovalArchiveDetail({ prisma: fastify.prisma, actor: request.employee, archiveId: request.params?.id, }); if (!item) { throw notFound(); } return sendData(reply, request, { item }); }); } module.exports = wecomApprovalArchiveRoutes;