api/routers/transcribe/canvas_events.py

64 lines
2.0 KiB
Python

"""Canvas events router — batch write and query canvas event logs."""
from fastapi import APIRouter, Depends, HTTPException, Query
from typing import List, Optional
from datetime import datetime
from modules.auth.supabase_bearer import SupabaseBearer
from modules.transcription.models import CanvasEventCreate, CanvasEventResponse
router = APIRouter()
def get_supabase_client():
"""Get Supabase service role client."""
from modules.database.supabase.utils.client import SupabaseServiceRoleClient
return SupabaseServiceRoleClient()
def get_user_id(credentials=Depends(SupabaseBearer())) -> str:
"""Extract user_id from Supabase JWT token."""
return credentials.get("sub", credentials.get("user_id", ""))
@router.post("/canvas-events")
async def batch_write_canvas_events(
events: List[CanvasEventCreate],
user_id: str = Depends(get_user_id),
):
"""Batch write canvas events."""
supabase = get_supabase_client()
# Filter events to only this user's
user_events = [e for e in events if e.user_id == user_id]
if not user_events:
return {"message": "No events to write", "count": 0}
event_data = [e.model_dump() for e in user_events]
result = supabase.supabase.table("canvas_events").insert(event_data).execute()
return {"message": f"Wrote {len(event_data)} events", "count": len(event_data)}
@router.get("/canvas-events", response_model=List[CanvasEventResponse])
async def get_canvas_events(
session_id: Optional[str] = Query(None),
user_id: str = Depends(get_user_id),
limit: int = Query(100, ge=1, le=1000),
):
"""Get canvas events for a session or user."""
supabase = get_supabase_client()
query = supabase.supabase.table("canvas_events").select("*").eq("user_id", user_id)
if session_id:
query = query.eq("session_id", session_id)
query = query.order("timestamp", desc=True).limit(limit)
result = query.execute()
return result.data