Spaces:
Sleeping
Sleeping
| # [File: backend/app/database.py] | |
| # PATCH: Thêm user_foods_collection + hướng dẫn đổi DB_NAME qua env var | |
| import os | |
| import certifi | |
| from dotenv import load_dotenv | |
| from pymongo import MongoClient | |
| load_dotenv() | |
| MONGO_URI = os.getenv("MONGO_URI") or os.getenv("MONGODB_URI") or "mongodb://localhost:27017" | |
| # ✅ PATCH: Đổi default thành "health_ai_db" nếu muốn dùng DB đó | |
| # Hoặc set env var DB_NAME=health_ai_db trên Render (khuyến nghị) | |
| DB_NAME = os.getenv("DB_NAME", "saman_fitness") # → đổi thành "health_ai_db" nếu cần | |
| safe_uri = MONGO_URI.split("@")[-1] if "@" in MONGO_URI else MONGO_URI | |
| print(f"🔌 Connecting to MongoDB: {safe_uri}") | |
| print(f"📂 Database Name: {DB_NAME}") | |
| client = None | |
| db = None | |
| users_collection = None | |
| foods_collection = None | |
| nutrition_collection = None | |
| story_logs_collection = None | |
| workout_history_collection = None | |
| custom_plans_collection = None | |
| recipes_collection = None | |
| water_collection = None | |
| supplements_collection = None | |
| user_foods_collection = None # ✅ NEW: My Food per-user | |
| exercises_collection = None # ✅ NEW: Exercise library | |
| video_analysis_collection = None # ✅ NEW: Video analysis sessions | |
| try: | |
| if "localhost" in MONGO_URI or "127.0.0.1" in MONGO_URI: | |
| print("⚠️ Detected Localhost. Disabling SSL.") | |
| client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000) | |
| else: | |
| print("☁️ Detected Cloud DB. Enabling SSL.") | |
| client = MongoClient(MONGO_URI, tlsCAFile=certifi.where(), serverSelectionTimeoutMS=5000) | |
| db = client[DB_NAME] | |
| users_collection = db["users"] | |
| foods_collection = db["foods"] | |
| nutrition_collection = db["nutrition_plans"] | |
| story_logs_collection = db["story_logs"] | |
| workout_history_collection = db["workout_history"] | |
| custom_plans_collection = db["custom_plans"] | |
| recipes_collection = db["recipes"] | |
| water_collection = db["water_logs"] | |
| supplements_collection = db["supplement_logs"] | |
| user_foods_collection = db["user_foods"] # ✅ NEW | |
| exercises_collection = db["exercises"] # ✅ NEW | |
| video_analysis_collection = db["video_analysis"] # ✅ NEW | |
| client.admin.command('ping') | |
| print("✅ Successfully connected to MongoDB!") | |
| except Exception as e: | |
| print(f"❌ MongoDB Connection Error: {e}") | |
| print("⚠️ Continuing without database connection (some features may not work)") | |
| client = None | |
| db = None | |
| users_collection = None | |
| foods_collection = None | |
| nutrition_collection = None | |
| story_logs_collection = None | |
| workout_history_collection = None | |
| custom_plans_collection = None | |
| recipes_collection = None | |
| water_collection = None | |
| supplements_collection = None | |
| user_foods_collection = None | |
| exercises_collection = None | |
| video_analysis_collection = None | |
| async def create_indexes(): | |
| """Create indexes for video analysis collection to optimize pagination queries.""" | |
| if video_analysis_collection is None: | |
| print("⚠️ Cannot create indexes: video_analysis_collection is None") | |
| return | |
| try: | |
| print("⏳ Creating indexes for video_analysis_collection...") | |
| # Create index on created_at for sorting (descending) | |
| await video_analysis_collection.create_index([("created_at", -1)]) | |
| print("✅ Index created: created_at (-1)") | |
| # Create index on status for filtering | |
| await video_analysis_collection.create_index([("status", 1)]) | |
| print("✅ Index created: status (1)") | |
| # Create compound index for status + created_at (most common query pattern) | |
| await video_analysis_collection.create_index([("status", 1), ("created_at", -1)]) | |
| print("✅ Index created: status (1), created_at (-1)") | |
| print("✅ All indexes created successfully") | |
| except Exception as e: | |
| print(f"❌ Failed to create indexes: {e}") | |
| async def init_database_indexes(): | |
| """Initialize database indexes - call this during app startup.""" | |
| await create_indexes() | |