64 lines
2.0 KiB
Python
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
|