math-solver-worker / worker /asset_manager.py
github-actions
Deploy render worker from GitHub Actions
06ca3b1
import os
import uuid
import logging
from typing import Tuple
from app.supabase_client import get_supabase
logger = logging.getLogger(__name__)
def get_next_version(session_id: str, asset_type: str = "video") -> int:
"""
Query session_assets to find the latest version for this session/type.
"""
supabase = get_supabase()
try:
res = (
supabase.table("session_assets")
.select("version")
.eq("session_id", session_id)
.eq("asset_type", asset_type)
.order("version", desc=True)
.limit(1)
.execute()
)
if res.data:
return res.data[0]["version"] + 1
return 1
except Exception as e:
logger.error(f"Error fetching version: {e}")
return 1
def upload_session_asset(
session_id: str,
job_id: str,
file_bytes: bytes,
asset_type: str,
ext: str
) -> Tuple[str, str]:
"""
Upload file to Supabase Storage with versioned path and record in session_assets.
Returns (storage_path, public_url).
"""
supabase = get_supabase()
bucket_name = os.getenv("SUPABASE_BUCKET", "video")
version = get_next_version(session_id, asset_type)
# Structure: sessions/{session_id}/{asset_type}_v{version}_{job_id}.{ext}
file_name = f"{asset_type}_v{version}_{job_id}.{ext}"
storage_path = f"sessions/{session_id}/{file_name}"
# 1. Upload to Storage
content_type = "video/mp4" if ext == "mp4" else "image/png"
supabase.storage.from_(bucket_name).upload(
path=storage_path,
file=file_bytes,
file_options={"content-type": content_type}
)
# 2. Get Public URL
public_url = supabase.storage.from_(bucket_name).get_public_url(storage_path)
# 3. Record in DB
supabase.table("session_assets").insert({
"session_id": session_id,
"job_id": job_id,
"asset_type": asset_type,
"storage_path": storage_path,
"public_url": public_url,
"version": version
}).execute()
return storage_path, public_url