Essay-grader-ai / modules /firebase_manager.py
Turbiling's picture
Create modules/firebase_manager.py
9bc9525 verified
Raw
History Blame Contribute Delete
7.5 kB
# modules/firebase_manager.py
"""
Firebase انٹیگریشن - ڈیٹا محفوظ کرنے کے لیے
"""
import os
import logging
from datetime import datetime
from typing import Optional, Dict, List
logger = logging.getLogger(__name__)
# Firebase کو conditional import کریں
try:
import firebase_admin
from firebase_admin import credentials, firestore
FIREBASE_AVAILABLE = True
except ImportError:
FIREBASE_AVAILABLE = False
logger.warning("Firebase not installed. Running without database.")
class FirebaseManager:
"""Firebase Firestore کے ساتھ کام کرنے کے لیے"""
_instance = None
def __new__(cls):
"""Singleton pattern"""
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self):
"""Initialize Firebase"""
if self._initialized:
return
self.enabled = False
if not FIREBASE_AVAILABLE:
logger.warning("Firebase SDK not available")
self._initialized = True
return
try:
# Hugging Face Spaces secrets سے credentials
cred_dict = self._get_credentials_from_env()
if cred_dict:
cred = credentials.Certificate(cred_dict)
if not firebase_admin._apps:
firebase_admin.initialize_app(cred)
self.db = firestore.client()
self.enabled = True
logger.info("Firebase initialized successfully")
else:
logger.warning("Firebase credentials not found in environment")
except Exception as e:
logger.error(f"Firebase initialization failed: {e}")
self.enabled = False
self._initialized = True
def _get_credentials_from_env(self) -> Optional[Dict]:
"""Environment variables سے credentials بنائیں"""
required_vars = [
'FIREBASE_PROJECT_ID',
'FIREBASE_PRIVATE_KEY',
'FIREBASE_CLIENT_EMAIL'
]
# چیک کریں کہ سب variables موجود ہیں
if not all(os.getenv(var) for var in required_vars):
return None
# Private key کو ٹھیک کریں (\\n کو \n میں)
private_key = os.getenv('FIREBASE_PRIVATE_KEY', '')
private_key = private_key.replace('\\n', '\n')
cred_dict = {
"type": "service_account",
"project_id": os.getenv('FIREBASE_PROJECT_ID'),
"private_key_id": os.getenv('FIREBASE_PRIVATE_KEY_ID', ''),
"private_key": private_key,
"client_email": os.getenv('FIREBASE_CLIENT_EMAIL'),
"client_id": os.getenv('FIREBASE_CLIENT_ID', ''),
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": os.getenv('FIREBASE_CLIENT_CERT_URL', '')
}
return cred_dict
def save_essay_result(
self,
user_id: str,
essay_data: Dict,
grading_result: Dict
) -> Optional[str]:
"""
مضمون کے نتائج محفوظ کریں
Args:
user_id: صارف کا ID
essay_data: مضمون کی تفصیلات
grading_result: جانچ کے نتائج
Returns:
Document ID یا None
"""
if not self.enabled:
logger.debug("Firebase not enabled, skipping save")
return None
try:
doc_ref = self.db.collection('essays').document()
data = {
'user_id': user_id,
'student_name': essay_data.get('student_name', 'Unknown'),
'grade_level': essay_data.get('grade_level'),
'essay_type': essay_data.get('essay_type'),
'language': essay_data.get('language'),
'word_count': essay_data.get('word_count', 0),
'essay_text': essay_data.get('text', '')[:1000],
'grading': {
'total_score': grading_result['total_score'],
'scores': grading_result['scores'],
'grade': grading_result['grade']
},
'created_at': firestore.SERVER_TIMESTAMP,
'month': datetime.now().strftime('%Y-%m')
}
doc_ref.set(data)
logger.info(f"Essay saved to Firebase: {doc_ref.id}")
return doc_ref.id
except Exception as e:
logger.error(f"Failed to save to Firebase: {e}")
return None
def get_user_essays(
self,
user_id: str,
limit: int = 20
) -> List[Dict]:
"""
صارف کے مضامین حاصل کریں
Args:
user_id: صارف کا ID
limit: زیادہ سے زیادہ تعداد
Returns:
مضامین کی فہرست
"""
if not self.enabled:
return []
try:
query = self.db.collection('essays')\
.where('user_id', '==', user_id)\
.order_by('created_at', direction=firestore.Query.DESCENDING)\
.limit(limit)
docs = query.stream()
essays = []
for doc in docs:
data = doc.to_dict()
data['id'] = doc.id
essays.append(data)
logger.info(f"Retrieved {len(essays)} essays for user {user_id}")
return essays
except Exception as e:
logger.error(f"Failed to get essays: {e}")
return []
def check_monthly_limit(
self,
user_id: str,
subscription: str = 'free'
) -> tuple:
"""
ماہانہ حد چیک کریں
Args:
user_id: صارف کا ID
subscription: 'free', 'basic', یا 'premium'
Returns:
(حد میں ہے؟, استعمال شدہ, باقی)
"""
if not self.enabled:
return (True, 0, 999)
limits = {
'free': 20,
'basic': 100,
'premium': 999999
}
max_essays = limits.get(subscription, 20)
try:
current_month = datetime.now().strftime('%Y-%m')
query = self.db.collection('essays')\
.where('user_id', '==', user_id)\
.where('month', '==', current_month)
count = len(list(query.stream()))
remaining = max(0, max_essays - count)
within_limit = remaining > 0
logger.info(f"User {user_id}: {count}/{max_essays} essays used")
return (within_limit, count, remaining)
except Exception as e:
logger.error(f"Failed to check limit: {e}")
return (True, 0, max_essays)