""" MongoDB Database Connection Manager Author: AI Generated Created: 2025-11-24 Purpose: Handle MongoDB connection and collection access """ from pymongo import MongoClient from pymongo.database import Database from pymongo.collection import Collection from config import settings class DatabaseManager: """Singleton MongoDB connection manager""" _instance = None _client: MongoClient = None _db: Database = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self): if self._client is None: self.connect() @property def client(self): """Get MongoDB client""" return self._client @property def db_name(self): """Get database name""" return settings.DB_NAME def connect(self): """Establish connection to MongoDB""" self._client = MongoClient(settings.MONGODB_URI) self._db = self._client[settings.DB_NAME] print(f"✓ Connected to MongoDB: {settings.DB_NAME}") def get_collection(self, collection_name: str) -> Collection: """Get a MongoDB collection""" return self._db[collection_name] def close(self): """Close MongoDB connection""" if self._client: self._client.close() print("✓ MongoDB connection closed") # ACTUAL Collections (matching models.txt) @property def users(self) -> Collection: """User collection (contains embedded UserFollows array)""" return self.get_collection(settings.COLLECTION_USERS) @property def payments(self) -> Collection: """Payment collection""" return self.get_collection(settings.COLLECTION_PAYMENTS) @property def event_versions(self) -> Collection: """EventVersion collection""" return self.get_collection(settings.COLLECTION_EVENT_VERSIONS) @property def post_social_media(self) -> Collection: """PostSocialMedia collection (contains nested Images.UserCommentPosts)""" return self.get_collection(settings.COLLECTION_POST_SOCIAL_MEDIA) # AI Result Collections @property def audience_segments(self) -> Collection: """AudienceSegment collection (DEPRECATED - use event_audience_segments)""" return self.get_collection(settings.COLLECTION_AUDIENCE_SEGMENTS) @property def user_segment_assignments(self) -> Collection: """UserSegmentAssignment collection""" return self.get_collection(settings.COLLECTION_USER_SEGMENT_ASSIGNMENTS) @property def sentiment_results(self) -> Collection: """SentimentAnalysisResult collection""" return self.get_collection(settings.COLLECTION_SENTIMENT_RESULTS) @property def event_insights(self) -> Collection: """EventInsightReport collection""" return self.get_collection(settings.COLLECTION_EVENT_INSIGHTS) # NEW: Event-centric collections @property def event_audience_segments(self) -> Collection: """EventAudienceSegment collection""" return self.get_collection("EventAudienceSegment") @property def event_sentiment_summary(self) -> Collection: """EventSentimentSummary collection""" return self.get_collection("EventSentimentSummary") # Global database instance db = DatabaseManager()