const swagger = require("../../_docs/swagger.json"); const HTTP_METHODS = new Set(["get", "post", "put", "delete", "patch", "head", "options"]); /** * 与 proxy_api.buildProxyRoutes 使用同一套 swagger.paths,供套餐「接口白名单」勾选 * @returns {{ items: object[], groups: Record, tags: string[] }} */ function buildCatalog() { const byPath = new Map(); const paths = swagger.paths || {}; for (const [routePath, methods] of Object.entries(paths)) { if (!methods || typeof methods !== "object") continue; for (const [method, spec] of Object.entries(methods)) { if (!HTTP_METHODS.has(method.toLowerCase())) continue; if (!spec || typeof spec !== "object") continue; const tag = (spec.tags && spec.tags[0]) || "其他"; const summary = spec.summary || spec.operationId || ""; if (!byPath.has(routePath)) { byPath.set(routePath, { path: routePath, methods: new Set(), summary: summary || "", tag, }); } const row = byPath.get(routePath); row.methods.add(method.toUpperCase()); } } const items = Array.from(byPath.values()) .map((x) => ({ path: x.path, methods: Array.from(x.methods).sort(), summary: x.summary || "", tag: x.tag, })) .sort((a, b) => a.path.localeCompare(b.path)); /** @type {Record} */ const groups = {}; for (const it of items) { if (!groups[it.tag]) groups[it.tag] = []; groups[it.tag].push(it); } const tags = Object.keys(groups).sort((a, b) => a.localeCompare(b, "zh-CN")); return { items, groups, tags }; } module.exports = { buildCatalog };