platform_api_key_router.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. """
  2. 平台API Key路由
  3. 提供平台API Key管理的RESTful API端点
  4. 需求: 7.1, 7.6
  5. """
  6. from typing import List
  7. from fastapi import APIRouter, Depends, HTTPException
  8. from sqlalchemy.orm import Session
  9. from app.database import get_db
  10. from app.dependencies.auth import get_current_user
  11. from app.models.user import User
  12. from app.services.platform_api_key_service import PlatformApiKeyService
  13. from app.schemas.platform_api_key import (
  14. ApiKeyCreate,
  15. ApiKeyResponse,
  16. ApiKeyCreateResponse,
  17. ApiKeyStatusUpdate
  18. )
  19. from app.schemas.model_schema import ApiResponse
  20. router = APIRouter(prefix="/api/platform/api-keys", tags=["平台API Key"])
  21. @router.post("", response_model=ApiResponse[ApiKeyCreateResponse], summary="创建API Key", description="创建新的API Key用于调用OpenAI兼容接口。每个用户最多5个有效密钥。")
  22. def create_api_key(
  23. request: ApiKeyCreate,
  24. current_user: User = Depends(get_current_user),
  25. db: Session = Depends(get_db)
  26. ):
  27. """
  28. 创建API Key
  29. - **name**: 备注名称(可选)
  30. - **key_type**: 密钥类型,public(访问云端模型)或local(访问本地模型)
  31. 返回完整的API Key(仅此一次显示,请妥善保存)
  32. 需求 7.1: 用户可以创建新的API Key
  33. 需求 7.2: 创建时显示完整密钥(仅此一次)
  34. 需求 7.4: 每用户最多5个有效API Key
  35. 新增: 支持设置密钥类型
  36. """
  37. service = PlatformApiKeyService(db)
  38. result = service.create_api_key(current_user.id, request.name, request.key_type)
  39. return ApiResponse(code=200, message="success", data=ApiKeyCreateResponse(**result))
  40. @router.get("", response_model=ApiResponse[List[ApiKeyResponse]], summary="获取API Key列表", description="获取当前用户的所有API Key列表(密钥已脱敏)。")
  41. def get_api_keys(
  42. current_user: User = Depends(get_current_user),
  43. db: Session = Depends(get_db)
  44. ):
  45. """
  46. 获取API Key列表
  47. 返回当前用户的所有API Key,密钥已脱敏显示(如sk-aigc-xxxx...xxxx)
  48. 需求 7.3: 列表中显示脱敏后的API Key
  49. """
  50. service = PlatformApiKeyService(db)
  51. keys = service.get_user_api_keys(current_user.id)
  52. return ApiResponse(
  53. code=200,
  54. message="success",
  55. data=[ApiKeyResponse.model_validate(k) for k in keys]
  56. )
  57. @router.put("/{key_id}", response_model=ApiResponse[ApiKeyResponse], summary="更新API Key状态", description="启用或禁用指定的API Key。")
  58. async def update_api_key_status(
  59. key_id: int,
  60. request: ApiKeyStatusUpdate,
  61. current_user: User = Depends(get_current_user),
  62. db: Session = Depends(get_db)
  63. ):
  64. """
  65. 更新API Key状态
  66. - **key_id**: API Key的ID
  67. - **status**: 新状态,active(启用)或disabled(禁用)
  68. 需求 7.5: 支持禁用/启用API Key
  69. """
  70. service = PlatformApiKeyService(db)
  71. key = service.update_api_key_status(key_id, current_user.id, request.status)
  72. # 异步删除缓存
  73. try:
  74. from app.services.cache_service import CacheService
  75. await CacheService.delete_api_key(key_id)
  76. except Exception as e:
  77. # 缓存删除失败不影响主流程
  78. print(f"删除缓存失败: {e}")
  79. return ApiResponse(code=200, message="success", data=ApiKeyResponse.model_validate(key))
  80. @router.delete("/{key_id}", response_model=ApiResponse[dict], summary="删除API Key", description="永久删除指定的API Key。")
  81. async def delete_api_key(
  82. key_id: int,
  83. current_user: User = Depends(get_current_user),
  84. db: Session = Depends(get_db)
  85. ):
  86. """
  87. 删除API Key
  88. - **key_id**: 要删除的API Key的ID
  89. 需求 7.6: 支持删除API Key
  90. """
  91. service = PlatformApiKeyService(db)
  92. success = service.delete_api_key(key_id, current_user.id)
  93. # 异步删除缓存
  94. try:
  95. from app.services.cache_service import CacheService
  96. await CacheService.delete_api_key(key_id)
  97. except Exception as e:
  98. # 缓存删除失败不影响主流程
  99. print(f"删除缓存失败: {e}")
  100. return ApiResponse(code=200, message="success", data={"success": True})