codenexus / routers /user.py
farhan1221's picture
Upload 26 files
91990f9 verified
Raw
History Blame Contribute Delete
3.62 kB
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