spwebsite / routes /api_keys.py
geqintan's picture
update
133609a
import secrets
from datetime import datetime
import secrets
from datetime import datetime
from fastapi import APIRouter, HTTPException, Depends, status
from supabase import Client
from core.config import SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY
from core.models import User, ApiKeyCreateResponse, ApiKeyItem
from core.dependencies import get_current_active_user, get_supabase_client # Import get_supabase_client
router = APIRouter()
@router.post("/generate-api-key", response_model=ApiKeyCreateResponse)
async def generate_api_key(
current_user: User = Depends(get_current_active_user),
supabase_client: Client = Depends(get_supabase_client) # Inject Supabase client
):
try:
# Generate a secure random API Key
new_api_key = secrets.token_urlsafe(32) # 32 bytes = 43 characters
# Store the API Key in the database
data, count = supabase_client.table('sp_user_api_keys').insert({
"user_id": current_user.id,
"api_key": new_api_key,
"created_at": datetime.now().isoformat() # Store creation time
}).execute()
if data:
return ApiKeyCreateResponse(api_key=new_api_key)
else:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to store API Key."
)
except Exception as e:
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
@router.get("/api-keys", response_model=list[ApiKeyItem])
async def get_user_api_keys(
current_user: User = Depends(get_current_active_user),
supabase_client: Client = Depends(get_supabase_client) # Inject Supabase client
):
try:
res = supabase_client.table('sp_user_api_keys').select('api_key, created_at').eq('user_id', current_user.id).execute()
return [ApiKeyItem(**item) for item in res.data]
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/me", response_model=User)
async def get_me(current_user: User = Depends(get_current_active_user)):
"""
获取当前登录用户的详细信息。
"""
return current_user