credential-routes.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import express from "npm:express";
  2. import {
  3. getRelayBalanceStatus,
  4. getStoredRelayAuth,
  5. isUsableAuth,
  6. queryRelayBalance,
  7. redactSecrets,
  8. saveStoredRelayCredential,
  9. toAuthorization
  10. } from "../../src/relay/relay-runtime.js";
  11. const router = express.Router();
  12. router.get("/token", async (_req, res) => {
  13. try {
  14. const auth = await getStoredRelayAuth();
  15. if (!isUsableAuth(auth)) {
  16. return res.status(409).json({ success: false, message: "尚未配置 API 密钥" });
  17. }
  18. res.json({ success: true, data: { authorization: auth } });
  19. } catch (error) {
  20. res.status(500).json({ success: false, message: redactSecrets(error?.message || "获取密钥失败") });
  21. }
  22. });
  23. router.get("/status", async (_req, res) => {
  24. try {
  25. const data = await getRelayBalanceStatus();
  26. res.json({ success: true, data });
  27. } catch (error) {
  28. res.status(500).json({ success: false, message: redactSecrets(error?.message || "状态查询失败") });
  29. }
  30. });
  31. router.post("/status/refresh", async (_req, res) => {
  32. try {
  33. const data = await getRelayBalanceStatus();
  34. res.json({ success: true, data });
  35. } catch (error) {
  36. res.status(500).json({ success: false, message: redactSecrets(error?.message || "状态查询失败") });
  37. }
  38. });
  39. router.post("/credential", async (req, res) => {
  40. try {
  41. const raw = String(req.body?.apiKey || req.body?.key || "").trim();
  42. const auth = toAuthorization(raw);
  43. await queryRelayBalance(auth);
  44. const saved = await saveStoredRelayCredential(raw, req.currentUser?.get?.("username") || req.currentUser?.id || "");
  45. const data = await getRelayBalanceStatus();
  46. res.json({ success: true, data: { ...data, maskedKey: saved.maskedKey } });
  47. } catch (error) {
  48. res.status(400).json({ success: false, message: redactSecrets(error?.message || "密钥保存失败") });
  49. }
  50. });
  51. router.get("/health", async (_req, res) => {
  52. const auth = await getStoredRelayAuth();
  53. res.json({ service: "relay-credential", configured: Boolean(auth), timestamp: new Date().toISOString() });
  54. });
  55. export default router;