userToolsSet.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const express = require("express");
  2. const router = express.Router();
  3. const { executeQuery } = require("../config/database");
  4. const crypto = require("crypto");
  5. // 获取用户列表(user_info:name, create_time)
  6. router.get("/users", async (req, res) => {
  7. try {
  8. const auth = req.headers["authorization"] || "";
  9. const token = auth.startsWith("Bearer ") ? auth.slice(7) : null;
  10. if (!token) {
  11. return res.status(401).json({ error: "未登录或缺少token" });
  12. }
  13. const meRows = await executeQuery(`SELECT name, is_admin FROM user_info WHERE token = ? LIMIT 1`, [token]);
  14. if (!meRows || meRows.length === 0) {
  15. return res.status(401).json({ error: "无效的用户token" });
  16. }
  17. const me = meRows[0];
  18. let sql = "";
  19. let params = [];
  20. if (Number(me.is_admin) === 1) {
  21. sql = `SELECT name, create_time FROM user_info ORDER BY create_time DESC`;
  22. params = [];
  23. } else {
  24. sql = `SELECT name, create_time FROM user_info WHERE name = ? ORDER BY create_time DESC`;
  25. params = [me.name];
  26. }
  27. const rows = await executeQuery(sql, params);
  28. res.json({ users: rows, me });
  29. } catch (error) {
  30. console.error("Error fetching users:", error);
  31. res.status(500).json({ error: "Internal server error" });
  32. }
  33. });
  34. // 新增:获取用户 tokens 列表(tools_token:user, token)
  35. router.get("/tokens", async (req, res) => {
  36. try {
  37. const auth = req.headers["authorization"] || "";
  38. const token = auth.startsWith("Bearer ") ? auth.slice(7) : null;
  39. if (!token) {
  40. return res.status(401).json({ error: "未登录或缺少token" });
  41. }
  42. const meRows = await executeQuery(`SELECT name, is_admin FROM user_info WHERE token = ? LIMIT 1`, [token]);
  43. if (!meRows || meRows.length === 0) {
  44. return res.status(401).json({ error: "无效的用户token" });
  45. }
  46. const me = meRows[0];
  47. let sql = "";
  48. let params = [];
  49. if (Number(me.is_admin) === 1) {
  50. sql = `SELECT user, token FROM tools_token ORDER BY id DESC`;
  51. params = [];
  52. } else {
  53. sql = `SELECT user, token FROM tools_token WHERE user = ? ORDER BY id DESC`;
  54. params = [me.name];
  55. }
  56. const rows = await executeQuery(sql, params);
  57. res.json({ tokens: rows, me });
  58. } catch (error) {
  59. console.error("Error fetching tokens:", error);
  60. res.status(500).json({ error: "Internal server error" });
  61. }
  62. });
  63. // 获取工具列表(tools_library:tools_id, tools_name, tools_function_name, status)
  64. router.get("/tools", async (req, res) => {
  65. try {
  66. const sql = `
  67. SELECT tools_id, tools_name, tools_function_name,tools_full_name, mcp_tools_name, status
  68. FROM tools_library
  69. ORDER BY create_time DESC
  70. `;
  71. const rows = await executeQuery(sql, []);
  72. res.json({ tools: rows });
  73. } catch (error) {
  74. console.error("Error fetching tools:", error);
  75. res.status(500).json({ error: "Internal server error" });
  76. }
  77. });
  78. // 根据token获取已设置的工具集
  79. router.get("/token-tools/:token", async (req, res) => {
  80. try {
  81. const { token } = req.params;
  82. if (!token) {
  83. return res.status(400).json({ error: "缺少token参数" });
  84. }
  85. const sql = `
  86. SELECT tools_id
  87. FROM tools_token_set
  88. WHERE token = ?
  89. ORDER BY create_time DESC
  90. `;
  91. const rows = await executeQuery(sql, [token]);
  92. const toolsIds = rows.map((row) => row.tools_id);
  93. res.json({ tools_ids: toolsIds });
  94. } catch (error) {
  95. console.error("Error fetching token tools:", error);
  96. res.status(500).json({ error: "Internal server error" });
  97. }
  98. });
  99. // 保存用户的工具集:根据 user_name 查找启用的 token,然后把所选 tools_id 批量插入 tools_token_set
  100. router.post("/save", async (req, res) => {
  101. try {
  102. const { user_name, tools_ids, token: payloadToken } = req.body;
  103. if (!user_name || !Array.isArray(tools_ids)) {
  104. return res.status(400).json({ error: "参数错误:需要 user_name 和 tools_ids 数组" });
  105. }
  106. // 优先使用请求体中的 token;若未提供则回退为该用户最新启用的 token
  107. let token = payloadToken;
  108. if (!token) {
  109. const tokenRows = await executeQuery(
  110. `SELECT token FROM tools_token WHERE user = ? AND status = 'enable' ORDER BY id DESC LIMIT 1`,
  111. [user_name]
  112. );
  113. if (!tokenRows || tokenRows.length === 0) {
  114. return res.status(404).json({ error: "未找到启用的用户token" });
  115. }
  116. token = tokenRows[0].token;
  117. }
  118. // 覆盖保存:先清空当前 token 下的旧设置
  119. await executeQuery(`DELETE FROM tools_token_set WHERE token = ?`, [token]);
  120. // 若本次没有选择工具,则直接返回成功(代表清空)
  121. if (!tools_ids || tools_ids.length === 0) {
  122. return res.json({ success: true, message: "已清空工具设置", token, count: 0 });
  123. }
  124. // 批量插入所选工具
  125. for (const tools_id of tools_ids) {
  126. await executeQuery(
  127. `INSERT INTO tools_token_set (token, tools_id, create_time) VALUES (?, ?, NOW())`,
  128. [token, tools_id]
  129. );
  130. }
  131. res.json({ success: true, message: "保存成功", token, count: tools_ids.length });
  132. } catch (error) {
  133. console.error("Error saving tools token set:", error);
  134. res.status(500).json({ error: "Internal server error" });
  135. }
  136. });
  137. // 新增用户:name, password, is_admin,并生成 token = MD5(name+password) 大写32位
  138. router.post("/add-user", async (req, res) => {
  139. try {
  140. const { name, password, is_admin } = req.body;
  141. if (!name || !password || typeof is_admin === "undefined") {
  142. return res.status(400).json({ error: "缺少必要参数:name、password、is_admin" });
  143. }
  144. const raw = `${name}${password}`;
  145. const md5 = crypto.createHash("md5").update(raw).digest("hex").toUpperCase();
  146. // 检查是否已存在同名用户
  147. const existRows = await executeQuery(`SELECT id FROM user_info WHERE name = ? LIMIT 1`, [name]);
  148. if (existRows && existRows.length > 0) {
  149. return res.status(409).json({ error: "用户名已存在" });
  150. }
  151. const insertSql = `
  152. INSERT INTO user_info (status, name, is_admin, password, token, create_time)
  153. VALUES ('enable', ?, ?, ?, ?, NOW())
  154. `;
  155. await executeQuery(insertSql, [name, Number(is_admin) ? 1 : 0, password, md5]);
  156. res.json({ success: true, token: md5 });
  157. } catch (error) {
  158. console.error("Error adding user:", error);
  159. res.status(500).json({ error: "Internal server error" });
  160. }
  161. });
  162. module.exports = router;