saman-backend / backend /app /database.py
NguyenVanAn-2005
deploy: backend only
38b6338
Raw
History Blame Contribute Delete
4.15 kB
# [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()