Aus_F / database.py
minhvtt's picture
Upload 19 files
ea06065 verified
"""
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()