File size: 1,819 Bytes
91990f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from config.database import get_supabase_admin
import logging

logger = logging.getLogger(__name__)

async def ensure_user_exists(user):
    """
    Ensures that a user from auth.users has a corresponding record in public.users.
    This handles OAuth users and manual signups uniformly.
    """
    if not user:
        return None

    from config.settings import get_settings
    settings = get_settings()
    db = get_supabase_admin()
    
    try:
        # Check if user already exists
        profile = db.table("users").select("*").eq("id", str(user.id)).execute()
        
        # Determine target role (Case-Insensitive)
        admin_list = [e.lower() for e in settings.admin_emails]
        target_role = "admin" if user.email.lower() in admin_list else "free"
        
        if not profile.data:
            # Create user on the fly
            display_name = user.user_metadata.get("full_name") or user.email.split("@")[0]
            logger.info(f"Syncing new user to public table: {user.email} as {target_role}")
            
            db.table("users").insert({
                "id": str(user.id),
                "email": user.email,
                "display_name": display_name,
                "role": target_role,
                "is_banned": False
            }).execute()
        else:
            # Existing user - Check if they need an admin upgrade
            current_role = profile.data[0].get("role")
            if target_role == "admin" and current_role != "admin":
                logger.info(f"Upgrading existing user to admin: {user.email}")
                db.table("users").update({"role": "admin"}).eq("id", str(user.id)).execute()
            
        return True
    except Exception as e:
        logger.error(f"Error in ensure_user_exists: {str(e)}")
        return False