File size: 2,124 Bytes
395651c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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