File size: 2,734 Bytes
8a1fc38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
717cdb4
 
 
 
 
 
 
 
 
 
 
 
 
 
8a1fc38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""
Firebase Service — Initializes Firebase Admin SDK and provides database access.

This replaces MongoDB for database persistence in Phase 3.
"""

import os
import logging
from typing import Optional

from backend.src.config import settings

logger = logging.getLogger("math_assistant.firebase")

_FIREBASE_APP = None
_FIRESTORE_CLIENT = None

def init_firebase():
    """Initialize the Firebase Admin SDK."""
    global _FIREBASE_APP, _FIRESTORE_CLIENT
    
    if not settings.use_firebase:
        logger.info("Firebase integration disabled in config.")
        return

    if _FIREBASE_APP is not None:
        return

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore

    try:
        if os.environ.get("FIREBASE_KEY_JSON"):
            import json
            cred_dict = json.loads(os.environ.get("FIREBASE_KEY_JSON"))
            cred = credentials.Certificate(cred_dict)
        else:
            cred_path = settings.firebase_credentials_path
            if not cred_path or not os.path.exists(cred_path):
                logger.warning(
                    f"Firebase credentials not found. "
                    "Running in unauthenticated/memory-fallback mode."
                )
                return
            cred = credentials.Certificate(cred_path)

        _FIREBASE_APP = firebase_admin.initialize_app(cred)
        _FIRESTORE_CLIENT = firestore.client()
        logger.info("Firebase Admin SDK initialized successfully.")
    except Exception as e:
        logger.error(f"Failed to initialize Firebase Admin SDK: {e}")

def get_firestore_client():
    """Get the initialized Firestore client."""
    return _FIRESTORE_CLIENT

def get_auth():
    """Get the Firebase Auth module."""
    if _FIREBASE_APP is None:
        return None
    from firebase_admin import auth
    return auth

def save_user_feedback(uid: str, session_id: str, message_id: str, is_positive: bool, comments: str = ""):
    """Save explicit human feedback to Firestore."""
    db = get_firestore_client()
    if not db:
        logger.warning("Cannot save feedback: Firebase is disabled or not initialized.")
        return
        
    try:
        from datetime import datetime, timezone
        
        feedback_data = {
            "session_id": session_id,
            "message_id": message_id,
            "is_positive": is_positive,
            "comments": comments,
            "timestamp": datetime.now(timezone.utc)
        }
        
        db.collection("users").document(uid).collection("feedback").add(feedback_data)
        logger.info(f"Feedback saved for user {uid}")
    except Exception as e:
        logger.error(f"Failed to save user feedback: {e}")