from flask import Blueprint, render_template from app.auth import login_required, get_current_user from app.db import query, query_one from app.utils import calculate_streak, calculate_weight_change bp = Blueprint("dashboard", __name__) @bp.route("/") @login_required def index(): user = get_current_user() # Get latest check-in latest = query_one( "SELECT * FROM checkins WHERE user_id = %s ORDER BY checked_in_at DESC LIMIT 1", (user["id"],), ) # Get check-in count stats = query_one( "SELECT COUNT(*) as total_checkins FROM checkins WHERE user_id = %s", (user["id"],), ) # Calculate weight change first_checkin = query_one( "SELECT weight_kg FROM checkins WHERE user_id = %s ORDER BY checked_in_at ASC LIMIT 1", (user["id"],), ) weight_change = None weight_change_pct = None if latest and first_checkin: kg_lost, pct_lost = calculate_weight_change( first_checkin["weight_kg"], latest["weight_kg"] ) weight_change = round(-kg_lost, 1) # negative = gained, positive = lost weight_change_pct = round(-pct_lost, 1) # Recent check-ins (last 5) recent_checkins = query( "SELECT * FROM checkins WHERE user_id = %s ORDER BY checked_in_at DESC LIMIT 5", (user["id"],), ) # Activity feed (recent check-ins from all users) activity = query(""" SELECT c.*, u.display_name, u.username FROM checkins c JOIN users u ON c.user_id = u.id WHERE u.is_private = FALSE OR u.id = %s ORDER BY c.checked_in_at DESC LIMIT 10 """, (user["id"],)) # Milestones milestones = query( "SELECT * FROM milestones WHERE user_id = %s ORDER BY achieved_at DESC", (user["id"],), ) # Streak streak = calculate_streak(user["id"]) return render_template( "dashboard.html", user=user, latest=latest, stats=stats, weight_change=weight_change, weight_change_pct=weight_change_pct, recent_checkins=recent_checkins, activity=activity, milestones=milestones, streak=streak, )