Spaces:
Running
Running
| """ | |
| Firestore Session Store Implementation | |
| Production-ready session storage using Google Cloud Firestore | |
| """ | |
| from typing import Dict, Any, Optional | |
| from datetime import datetime | |
| import logging | |
| try: | |
| from google.cloud import firestore | |
| FIRESTORE_AVAILABLE = True | |
| except ImportError: | |
| FIRESTORE_AVAILABLE = False | |
| logging.warning("Firestore SDK not installed. Run: pip install google-cloud-firestore") | |
| from .session_store import SessionStore | |
| from .base_store import BaseFirestoreStore | |
| class FirestoreSessionStore(BaseFirestoreStore, SessionStore): | |
| """ | |
| Firestore-based session storage for production use | |
| Features: | |
| - Persistent storage | |
| - Real-time updates | |
| - Automatic indexing | |
| - Scalable to millions of sessions | |
| """ | |
| async def create_session(self, session_id: str, session_data: Dict[str, Any]) -> Dict[str, Any]: | |
| """Create a new session in Firestore""" | |
| session_data['id'] = session_id | |
| session_data['created_at'] = firestore.SERVER_TIMESTAMP | |
| session_data['last_activity'] = firestore.SERVER_TIMESTAMP | |
| self.collection.document(session_id).set(session_data) | |
| # Return with ISO timestamps | |
| now = datetime.now().isoformat() | |
| session_data['created_at'] = now | |
| session_data['last_activity'] = now | |
| return session_data | |
| async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]: | |
| """Get session from Firestore""" | |
| doc = self.collection.document(session_id).get() | |
| if not doc.exists: | |
| return None | |
| session_data = doc.to_dict() | |
| return self._convert_timestamps(session_data) | |
| async def update_session(self, session_id: str, updates: Dict[str, Any]) -> bool: | |
| """Update session in Firestore""" | |
| try: | |
| updates['last_activity'] = firestore.SERVER_TIMESTAMP | |
| self.collection.document(session_id).update(updates) | |
| return True | |
| except Exception as e: | |
| logging.error(f"Error updating session {session_id}: {e}") | |
| return False | |
| async def delete_session(self, session_id: str) -> bool: | |
| """Delete session from Firestore""" | |
| try: | |
| self.collection.document(session_id).delete() | |
| return True | |
| except Exception as e: | |
| logging.error(f"Error deleting session {session_id}: {e}") | |
| return False | |