|
|
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 |
|
|
|
|
|
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) |
|
|
): |
|
|
try: |
|
|
|
|
|
new_api_key = secrets.token_urlsafe(32) |
|
|
|
|
|
|
|
|
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() |
|
|
}).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) |
|
|
): |
|
|
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 |
|
|
|