Spaces:
Sleeping
Sleeping
| 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"]) | |
| 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, | |
| } | |
| } | |
| 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"} | |
| 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"} | |
| 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 [] | |
| 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 | |