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