from sqlalchemy import create_engine, text from datetime import datetime import logging logger = logging.getLogger(__name__) class CustomerDBManager: def __init__(self, customer): self.customer = customer self.engine = None def get_connection(self): """Get database connection for the customer""" if not self.engine: try: # Create database URL from customer's database credentials db_url = f"mysql+pymysql://{self.customer.db_user}:{self.customer.db_password}@{self.customer.db_host}:{self.customer.db_port}/{self.customer.db_name}" self.engine = create_engine(db_url) except Exception as e: logger.error(f"Failed to create database connection for customer {self.customer.id}: {str(e)}") raise return self.engine def save_call_record(self, call_data): """Save call record to customer's database""" try: engine = self.get_connection() # Prepare the SQL query query = text(""" INSERT INTO call_records ( id, customer_id, caller_number, called_number, transcription, summary, sentiment, keywords, created_at, updated_at ) VALUES ( :id, :customer_id, :caller_number, :called_number, :transcription, :summary, :sentiment, :keywords, :created_at, :updated_at ) """) # Prepare the data now = datetime.utcnow() record_data = { 'id': call_data.get('id'), 'customer_id': self.customer.id, 'caller_number': call_data.get('caller_number'), 'called_number': call_data.get('called_number'), 'transcription': call_data.get('transcription'), 'summary': call_data.get('summary'), 'sentiment': call_data.get('sentiment'), 'keywords': call_data.get('keywords'), 'created_at': now, 'updated_at': now } # Execute the query with engine.connect() as connection: connection.execute(query, record_data) connection.commit() logger.info(f"Successfully saved call record {call_data.get('id')} for customer {self.customer.id}") return True except Exception as e: logger.error(f"Failed to save call record for customer {self.customer.id}: {str(e)}") raise def get_call_record(self, call_id): """Retrieve a call record from customer's database""" try: engine = self.get_connection() query = text(""" SELECT * FROM call_records WHERE id = :call_id AND customer_id = :customer_id """) with engine.connect() as connection: result = connection.execute(query, { 'call_id': call_id, 'customer_id': self.customer.id }).fetchone() return dict(result) if result else None except Exception as e: logger.error(f"Failed to retrieve call record {call_id} for customer {self.customer.id}: {str(e)}") raise def search_call_records(self, filters=None): """Search call records in customer's database""" try: engine = self.get_connection() # Build the query based on filters query = text(""" SELECT * FROM call_records WHERE customer_id = :customer_id """) params = {'customer_id': self.customer.id} if filters: if filters.get('start_date'): query = query.text + " AND created_at >= :start_date" params['start_date'] = filters['start_date'] if filters.get('end_date'): query = query.text + " AND created_at <= :end_date" params['end_date'] = filters['end_date'] if filters.get('caller_number'): query = query.text + " AND caller_number = :caller_number" params['caller_number'] = filters['caller_number'] if filters.get('called_number'): query = query.text + " AND called_number = :called_number" params['called_number'] = filters['called_number'] query = query.text + " ORDER BY created_at DESC" with engine.connect() as connection: results = connection.execute(query, params).fetchall() return [dict(row) for row in results] except Exception as e: logger.error(f"Failed to search call records for customer {self.customer.id}: {str(e)}") raise