AI_Fitness_Analyzer / database.py
kanakkk789's picture
Update database.py
eb95eba verified
import os
import bcrypt
import certifi # Added to handle SSL handshake
from pymongo import MongoClient
from datetime import datetime
# ---------------- CONNECTION ----------------
# Use certifi.where() to provide the correct CA bundle for the SSL handshake
ca = certifi.where()
MONGO_URI = os.getenv("MONGO_URI")
if not MONGO_URI:
raise Exception("MONGO_URI not found. Please set it in Hugging Face Secrets.")
# Initialize the client with the TLS certificate fix
client = MongoClient(MONGO_URI, tlsCAFile=ca)
db = client["fitplan_ai"]
# Collections
users_col = db["users"]
weights_col = db["weights"]
workouts_col = db["workouts"]
# ---------------- INIT DB ----------------
def init_db():
pass
# ---------------- PASSWORD HASH ----------------
def hash_password(password):
return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
def check_password(password, hashed):
return bcrypt.checkpw(password.encode('utf-8'), hashed)
# ---------------- USER FUNCTIONS ----------------
def add_user(name, age, gender, height, weight, email, password, goal):
# Check if user already exists
if users_col.find_one({"email": email}):
return False
users_col.insert_one({
"name": name,
"age": age,
"gender": gender,
"height": height,
"weight": weight, # Fixed the space and added parameter
"email": email,
"password": hash_password(password),
"goal": goal,
"created_at": datetime.utcnow()
})
return True
def verify_user(email, password):
user = users_col.find_one({"email": email})
if user and check_password(password, user["password"]):
return user
return None
def get_user_profile(email):
user = users_col.find_one({"email": email})
if user:
return (
user.get("name"),
user.get("age"),
user.get("gender"),
user.get("height"),
user.get("weight"),
user.get("goal")
)
return None
def update_profile(name, age, gender, height,weight, goal, email):
users_col.update_one(
{"email": email},
{"$set": {
"name": name,
"age": age,
"gender": gender,
"height": height,
"weight": weight,
"goal": goal
}}
)
# ---------------- WEIGHT TRACKING ----------------
def save_weight(email, weight, date):
# Tip: Ensure 'date' is a datetime object or a string ISO format
weights_col.insert_one({
"email": email,
"weight": weight,
"date": date
})
def get_weights(email):
data = list(weights_col.find({"email": email}).sort("date", 1))
if not data:
return None
return {
"date": [d["date"] for d in data],
"weight": [d["weight"] for d in data]
}
# ---------------- WORKOUTS ----------------
def save_workout(email, goal, plan):
workouts_col.insert_one({
"email": email,
"goal": goal,
"plan": plan,
"created_at": datetime.utcnow()
})