# modules/database/claude_recommendations_mongo_db.py from datetime import datetime, timezone, timedelta import logging from .mongo_db import get_collection logger = logging.getLogger(__name__) COLLECTION_NAME = 'student_claude_recommendations' def store_claude_recommendation(username, text, metrics, text_type, recommendations): """ Guarda las recomendaciones generadas por Claude AI. Args: username: Nombre del usuario text: Texto analizado metrics: Métricas del análisis text_type: Tipo de texto (academic_article, university_work, general_communication) recommendations: Recomendaciones generadas por Claude Returns: bool: True si se guardó correctamente, False en caso contrario """ try: # Verificar parámetros if not all([username, text, recommendations]): logger.error("Faltan parámetros requeridos para guardar recomendaciones de Claude") return False collection = get_collection(COLLECTION_NAME) if collection is None: logger.error("No se pudo obtener la colección de recomendaciones de Claude") return False # Crear documento document = { 'username': username, 'timestamp': datetime.now(timezone.utc).isoformat(), 'text': text, 'metrics': metrics or {}, 'text_type': text_type, 'recommendations': recommendations, 'analysis_type': 'claude_recommendation' } # Insertar documento result = collection.insert_one(document) if result.inserted_id: logger.info(f""" Recomendaciones de Claude guardadas: - Usuario: {username} - ID: {result.inserted_id} - Tipo de texto: {text_type} - Longitud del texto: {len(text)} """) # Verificar almacenamiento storage_verified = verify_recommendation_storage(username) if not storage_verified: logger.warning("Verificación de almacenamiento de recomendaciones falló") return True logger.error("No se pudo insertar el documento de recomendaciones") return False except Exception as e: logger.error(f"Error guardando recomendaciones de Claude: {str(e)}") return False def verify_recommendation_storage(username): """ Verifica que las recomendaciones se están guardando correctamente. Args: username: Nombre del usuario Returns: bool: True si la verificación es exitosa, False en caso contrario """ try: collection = get_collection(COLLECTION_NAME) if collection is None: logger.error("No se pudo obtener la colección para verificación de recomendaciones") return False # Buscar documentos recientes del usuario timestamp_threshold = (datetime.now(timezone.utc) - timedelta(minutes=5)).isoformat() recent_docs = collection.find({ 'username': username, 'timestamp': {'$gte': timestamp_threshold} }).sort('timestamp', -1).limit(1) docs = list(recent_docs) if docs: logger.info(f""" Último documento de recomendaciones guardado: - ID: {docs[0]['_id']} - Timestamp: {docs[0]['timestamp']} - Tipo de texto: {docs[0].get('text_type', 'N/A')} """) return True logger.warning(f"No se encontraron documentos recientes de recomendaciones para {username}") return False except Exception as e: logger.error(f"Error verificando almacenamiento de recomendaciones: {str(e)}") return False def get_claude_recommendations(username, limit=10): """ Obtiene las recomendaciones más recientes de Claude para un usuario. Args: username: Nombre del usuario limit: Número máximo de recomendaciones a recuperar Returns: list: Lista de recomendaciones """ try: collection = get_collection(COLLECTION_NAME) if collection is None: logger.error("No se pudo obtener la colección de recomendaciones") return [] results = collection.find( {'username': username} ).sort('timestamp', -1).limit(limit) recommendations = list(results) logger.info(f"Recuperadas {len(recommendations)} recomendaciones de Claude para {username}") return recommendations except Exception as e: logger.error(f"Error obteniendo recomendaciones de Claude: {str(e)}") return []