|
|
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 |