api_manage.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """
  2. API key management endpoints
  3. """
  4. from fastapi import FastAPI, HTTPException, Depends
  5. from typing import List, Dict, Any, Optional
  6. from src.utils.mysql import get_global_mysql_client
  7. from datetime import datetime, timedelta
  8. import secrets
  9. import string
  10. from src.common.result import Result
  11. app = FastAPI(
  12. title="API Key Management",
  13. description="API for managing API keys",
  14. version="1.0.0"
  15. )
  16. def generate_api_key() -> str:
  17. """
  18. Generate a new API key in format sk-<random-string>
  19. """
  20. # Generate random string
  21. alphabet = string.ascii_letters + string.digits
  22. random_string = ''.join(secrets.choice(alphabet) for _ in range(32))
  23. return f"sk-{random_string}"
  24. @app.post("/generate")
  25. async def generate_api_key_endpoint(expiry_days: Optional[int] = None):
  26. """
  27. Generate a new API key
  28. """
  29. try:
  30. api_key = generate_api_key()
  31. mysql_client = get_global_mysql_client()
  32. # Calculate expiration date if provided
  33. expired_at = None
  34. if expiry_days:
  35. expired_at = datetime.now() + timedelta(days=expiry_days)
  36. # Insert API key into database
  37. query = """
  38. INSERT INTO api_keys (api_key, expired_at, is_active)
  39. VALUES (%s, %s, TRUE)
  40. """
  41. mysql_client.execute(query, [api_key, expired_at])
  42. data = {
  43. "api_key": api_key,
  44. "created_at": datetime.now().isoformat(),
  45. "expired_at": expired_at.isoformat() if expired_at else None
  46. }
  47. return Result.success(data=data, message="API key 生成成功")
  48. except Exception as e:
  49. return Result.error(code=500, message=f"生成 API key 失败: {str(e)}")
  50. @app.get("/list")
  51. async def list_api_keys():
  52. """
  53. List all API keys
  54. """
  55. try:
  56. mysql_client = get_global_mysql_client()
  57. query = """
  58. SELECT id, api_key, created_at, expired_at, is_active
  59. FROM api_keys
  60. ORDER BY created_at DESC
  61. """
  62. result = mysql_client.fetch_all(query)
  63. return Result.success(data=result, message="获取 API keys 成功")
  64. except Exception as e:
  65. return Result.error(code=500, message=f"获取 API keys 失败: {str(e)}")
  66. @app.put("/toggle/{api_key_id}")
  67. async def toggle_api_key(api_key_id: int):
  68. """
  69. Toggle API key activation status
  70. """
  71. try:
  72. mysql_client = get_global_mysql_client()
  73. # Check if API key exists
  74. query = "SELECT is_active FROM api_keys WHERE id = %s"
  75. result = mysql_client.fetch_one(query, [api_key_id])
  76. if not result:
  77. return Result.error(code=404, message="API key 不存在")
  78. # Toggle status
  79. new_status = not result["is_active"]
  80. update_query = "UPDATE api_keys SET is_active = %s WHERE id = %s"
  81. mysql_client.execute(update_query, [new_status, api_key_id])
  82. data = {
  83. "api_key_id": api_key_id,
  84. "is_active": new_status
  85. }
  86. return Result.success(data=data, message="API key 状态更新成功")
  87. except Exception as e:
  88. return Result.error(code=500, message=f"更新 API key 状态失败: {str(e)}")
  89. @app.delete("/delete/{api_key_id}")
  90. async def delete_api_key(api_key_id: int):
  91. """
  92. Delete API key
  93. """
  94. try:
  95. mysql_client = get_global_mysql_client()
  96. # Check if API key exists
  97. query = "SELECT id FROM api_keys WHERE id = %s"
  98. result = mysql_client.fetch_one(query, [api_key_id])
  99. if not result:
  100. return Result.error(code=404, message="API key 不存在")
  101. # Delete API key
  102. delete_query = "DELETE FROM api_keys WHERE id = %s"
  103. mysql_client.execute(delete_query, [api_key_id])
  104. data = {
  105. "api_key_id": api_key_id
  106. }
  107. return Result.success(data=data, message="API key 删除成功")
  108. except Exception as e:
  109. return Result.error(code=500, message=f"删除 API key 失败: {str(e)}")