Spaces:
Running
Running
File size: 1,477 Bytes
305458b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import hashlib
import secrets
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.services.auth import require_user_id
from app.services.supabase import get_supabase
router = APIRouter()
class CreateKeyRequest(BaseModel):
name: str
@router.get("")
async def list_api_keys(user_id: str = require_user_id):
supabase = get_supabase()
result = supabase.table("api_keys").select("id, name, key_prefix, created_at, last_used_at").eq("user_id", user_id).execute()
return {"keys": result.data}
@router.post("")
async def create_api_key(req: CreateKeyRequest, user_id: str = require_user_id):
raw = f"sk_bio_{secrets.token_urlsafe(32)}"
key_hash = hashlib.sha256(raw.encode()).hexdigest()
key_prefix = raw[:16]
supabase = get_supabase()
supabase.table("api_keys").insert({
"user_id": user_id,
"name": req.name,
"key_hash": key_hash,
"key_prefix": key_prefix,
}).execute()
return {"key": raw, "key_prefix": key_prefix, "name": req.name}
@router.delete("/{key_id}")
async def delete_api_key(key_id: str, user_id: str = require_user_id):
supabase = get_supabase()
result = supabase.table("api_keys").select("id").eq("id", key_id).eq("user_id", user_id).execute()
if not result.data:
raise HTTPException(status_code=404, detail="API key not found")
supabase.table("api_keys").delete().eq("id", key_id).execute()
return {"status": "deleted"}
|