Samad14's picture
feat: complete Phase 2 — API keys, share links, export, pipeline steps, guest upgrade
305458b
Raw History Blame Contribute Delete
1.48 kB
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"}