Spaces:
Running
Running
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
|