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