from fastapi import APIRouter, HTTPException, Request from config.database import get_supabase_admin from middleware.auth_guard import get_current_user from models.user import ProfileUpdate router = APIRouter(prefix="/api/user", tags=["user"]) @router.get("/profile") async def get_profile(request: Request): user = await get_current_user(request) db = get_supabase_admin() profile = db.table("users").select("*").eq("id", str(user.id)).single().execute() profile_data = profile.data analyses_count = db.table("analyses").select("id", count="exact").eq("user_id", str(user.id)).execute() # Filter by coding type to avoid counting MCQs here submissions_count = db.table("challenge_submissions").select("id", count="exact").eq("user_id", str(user.id)).eq("challenge_type", "coding").execute() passed_count = db.table("challenge_submissions").select("id", count="exact").eq("user_id", str(user.id)).eq("challenge_type", "coding").eq("passed", True).execute() # MCQ stats - submissions where challenge_type is mcq mcq_attempted = db.table("challenge_submissions").select("id", count="exact").eq("user_id", str(user.id)).eq("challenge_type", "mcq").execute() mcq_passed = db.table("challenge_submissions").select("id", count="exact").eq("user_id", str(user.id)).eq("challenge_type", "mcq").eq("passed", True).execute() return { **(profile_data or {}), "role": user.role, # Prioritize the role from auth_guard (Admin override) "stats": { "total_analyses": analyses_count.count or 0, "total_submissions": submissions_count.count or 0, "challenges_passed": passed_count.count or 0, "mcq_attempted": mcq_attempted.count or 0, "mcq_passed": mcq_passed.count or 0, } } @router.patch("/profile") async def update_profile(data: ProfileUpdate, request: Request): user = await get_current_user(request) db = get_supabase_admin() update = {k: v for k, v in data.dict().items() if v is not None} if not update: raise HTTPException(status_code=400, detail="No fields to update") db.table("users").update(update).eq("id", str(user.id)).execute() return {"message": "Profile updated"} @router.delete("/account") async def delete_account(request: Request): user = await get_current_user(request) db = get_supabase_admin() # Delete all user data db.table("analyses").delete().eq("user_id", str(user.id)).execute() db.table("challenge_submissions").delete().eq("user_id", str(user.id)).execute() db.table("users").delete().eq("id", str(user.id)).execute() db.auth.admin.delete_user(str(user.id)) return {"message": "Account permanently deleted"} @router.get("/history") async def get_history(request: Request, page: int = 1): user = await get_current_user(request) db = get_supabase_admin() offset = (page - 1) * 20 result = db.table("analyses") \ .select("id, language, time_complexity, space_complexity, created_at") \ .eq("user_id", str(user.id)) \ .order("created_at", desc=True) \ .range(offset, offset + 19) \ .execute() return result.data or [] @router.get("/history/{analysis_id}") async def get_analysis(analysis_id: str, request: Request): user = await get_current_user(request) db = get_supabase_admin() result = db.table("analyses").select("*").eq("id", analysis_id).eq("user_id", str(user.id)).single().execute() if not result.data: raise HTTPException(status_code=404, detail="Analysis not found") return result.data