Spaces:
Running
Running
""" | |
Supabase client setup and database operations | |
""" | |
from supabase import create_client, Client | |
from datetime import datetime | |
from typing import Optional, Dict, Any | |
import logging | |
from app.config import settings | |
logger = logging.getLogger(__name__) | |
class SupabaseService: | |
"""Service for Supabase database operations""" | |
def __init__(self): | |
"""Initialize Supabase client""" | |
self.client: Optional[Client] = None | |
self._setup_client() | |
def _setup_client(self): | |
"""Setup Supabase client""" | |
try: | |
if settings.SUPABASE_URL and settings.SUPABASE_KEY: | |
self.client = create_client(settings.SUPABASE_URL, settings.SUPABASE_KEY) | |
logger.info("Supabase client initialized successfully") | |
else: | |
logger.warning("Supabase credentials not provided - database operations will be disabled") | |
except Exception as e: | |
logger.error(f"Failed to initialize Supabase client: {str(e)}") | |
self.client = None | |
async def insert_resume_review( | |
self, | |
resume_text: str, | |
job_description: str, | |
match_score: float, | |
feedback: str | |
) -> Optional[Dict[str, Any]]: | |
""" | |
Insert resume review into database | |
Args: | |
resume_text: Extracted resume text | |
job_description: Job description | |
match_score: Similarity score | |
feedback: AI-generated feedback | |
Returns: | |
Dict with inserted record or None if failed | |
""" | |
if not self.client: | |
logger.warning("Supabase client not available - skipping database insert") | |
return None | |
try: | |
data = { | |
"resume_text": resume_text, | |
"job_description": job_description, | |
"match_score": match_score, | |
"feedback": feedback, | |
"created_at": datetime.utcnow().isoformat() | |
} | |
result = self.client.table("resume_reviews").insert(data).execute() | |
if result.data: | |
logger.info("Resume review stored in database successfully") | |
return result.data[0] | |
else: | |
logger.error("Failed to insert resume review - no data returned") | |
return None | |
except Exception as e: | |
logger.error(f"Database insert failed: {str(e)}") | |
return None | |
async def get_resume_reviews(self, limit: int = 10) -> list: | |
""" | |
Get recent resume reviews | |
Args: | |
limit: Maximum number of reviews to return | |
Returns: | |
List of recent reviews | |
""" | |
if not self.client: | |
logger.warning("Supabase client not available - returning empty list") | |
return [] | |
try: | |
result = self.client.table("resume_reviews").select("*").order("created_at", desc=True).limit(limit).execute() | |
if result.data: | |
logger.info(f"Retrieved {len(result.data)} recent reviews") | |
return result.data | |
else: | |
logger.info("No recent reviews found") | |
return [] | |
except Exception as e: | |
logger.error(f"Failed to retrieve reviews: {str(e)}") | |
return [] | |
# Global service instance | |
supabase_service = SupabaseService() |