from typing import Optional, List from datetime import datetime, timedelta from backend.data.mongodb_client import get_database from backend.models.request_log import RequestLog from backend.core.logging import logger async def create_request_log( response_time: float, endpoint: Optional[str] = None, status_code: Optional[int] = None, error_type: Optional[str] = None ) -> RequestLog: database = get_database() if database is None: raise RuntimeError("Database not initialized") collection = database["request_logs"] log = RequestLog( response_time=response_time, endpoint=endpoint, status_code=status_code, error_type=error_type ) try: result = await collection.insert_one(log.to_mongo()) log.id = result.inserted_id return log except Exception as e: logger.error(f"Error creating request log: {e}") raise async def get_all_logs( limit: int = 100, offset: int = 0, endpoint: Optional[str] = None ) -> List[RequestLog]: database = get_database() if database is None: raise RuntimeError("Database not initialized") collection = database["request_logs"] filter_dict = {} if endpoint: filter_dict["endpoint"] = endpoint try: cursor = collection.find(filter_dict).sort("timestamp", -1).skip(offset).limit(limit) logs = [] async for log in cursor: logs.append(RequestLog.from_mongo(log)) return logs except Exception as e: logger.error(f"Error getting logs: {e}") return [] async def get_logs_by_time_range( start_time: datetime, end_time: datetime, limit: int = 1000 ) -> List[RequestLog]: database = get_database() if database is None: raise RuntimeError("Database not initialized") collection = database["request_logs"] try: cursor = collection.find({ "timestamp": {"$gte": start_time, "$lte": end_time} }).sort("timestamp", -1).limit(limit) logs = [] async for log in cursor: logs.append(RequestLog.from_mongo(log)) return logs except Exception as e: logger.error(f"Error getting logs by time range: {e}") return [] async def delete_old_logs(retention_days: int = 30) -> int: database = get_database() if database is None: raise RuntimeError("Database not initialized") collection = database["request_logs"] cutoff_date = datetime.utcnow() - timedelta(days=retention_days) try: result = await collection.delete_many({"timestamp": {"$lt": cutoff_date}}) logger.info(f"Deleted {result.deleted_count} old log entries") return result.deleted_count except Exception as e: logger.error(f"Error deleting old logs: {e}") return 0