| from supabase import create_client, Client |
| import os |
| import logging |
| from typing import Optional, Dict, Any |
|
|
| def init_supabase(url: str, key: str) -> Client: |
| """ |
| Initialize Supabase client. |
| |
| Args: |
| url (str): Supabase project URL |
| key (str): Supabase API key |
| |
| Returns: |
| Client: Supabase client instance |
| |
| Raises: |
| ValueError: If URL or key is missing |
| Exception: If client initialization fails |
| """ |
| if not url or not key: |
| raise ValueError("Supabase URL and key must be provided") |
|
|
| try: |
| client = create_client(url, key) |
| logging.info("Supabase client initialized successfully") |
| return client |
| except Exception as e: |
| logging.error(f"Failed to initialize Supabase client: {str(e)}") |
| raise e |
|
|
| def get_user_by_email(supabase: Client, email: str) -> Optional[Dict[Any, Any]]: |
| """ |
| Get user by email from Supabase Auth. |
| Note: This approach is not recommended for checking user existence. |
| Instead, use profiles table lookup or Supabase's built-in user management functions. |
| |
| Args: |
| supabase (Client): Supabase client instance |
| email (str): User email |
| |
| Returns: |
| dict: User data or None if not found |
| """ |
| try: |
| |
| |
| response = supabase.table("profiles").select("*").eq("email", email).execute() |
| if response.data: |
| |
| return response.data[0] |
| return None |
| except Exception as e: |
| logging.error(f"Error getting user by email {email}: {str(e)}") |
| return None |
|
|
| def create_user(supabase: Client, email: str, password: str) -> Dict[Any, Any]: |
| """ |
| Create a new user in Supabase Auth. |
| |
| Args: |
| supabase (Client): Supabase client instance |
| email (str): User email |
| password (str): User password |
| |
| Returns: |
| dict: User creation response |
| |
| Raises: |
| Exception: If user creation fails |
| """ |
| try: |
| response = supabase.auth.sign_up({ |
| "email": email, |
| "password": password |
| }) |
| logging.info(f"Successfully created user with email: {email}") |
| return response |
| except Exception as e: |
| logging.error(f"Failed to create user with email {email}: {str(e)}") |
| raise e |
|
|
| def authenticate_user(supabase: Client, email: str, password: str) -> Dict[Any, Any]: |
| """ |
| Authenticate user with email and password. |
| |
| Args: |
| supabase (Client): Supabase client instance |
| email (str): User email |
| password (str): User password |
| |
| Returns: |
| dict: Authentication response with user data |
| |
| Raises: |
| Exception: If authentication fails |
| """ |
| try: |
| response = supabase.auth.sign_in_with_password({ |
| "email": email, |
| "password": password |
| }) |
|
|
| logging.info(f"Successfully authenticated user: {email}") |
| return response |
| except Exception as e: |
| logging.error(f"Authentication error for user {email}: {str(e)}") |
| raise e |
|
|
| def check_database_connection(supabase: Client) -> bool: |
| """ |
| Check if the database connection is working by performing a simple query. |
| |
| Args: |
| supabase (Client): Supabase client instance |
| |
| Returns: |
| bool: True if connection is working, False otherwise |
| """ |
| try: |
| |
| |
| response = supabase.from_("profiles").select("id").limit(1).execute() |
|
|
| logging.info("Database connection check: SUCCESS") |
| return True |
| except Exception as e: |
| logging.error(f"Database connection check: FAILED - {str(e)}") |
| return False |
|
|
| def get_user_session(supabase: Client) -> Optional[Dict[Any, Any]]: |
| """ |
| Get current user session if available. |
| |
| Args: |
| supabase (Client): Supabase client instance |
| |
| Returns: |
| dict: Session data or None if no session |
| """ |
| try: |
| response = supabase.auth.get_user() |
| if response.user: |
| return { |
| 'user_id': response.user.id, |
| 'email': response.user.email, |
| 'created_at': response.user.created_at, |
| 'email_confirmed_at': response.user.email_confirmed_at, |
| } |
| return None |
| except Exception as e: |
| logging.error(f"Error getting user session: {str(e)}") |
| return None |