from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from .. import crud, schemas, auth from ..database import get_db from ..auth import get_current_user router = APIRouter(prefix="/progress", tags=["progress"]) @router.get("/", response_model=List[schemas.ProgressResponse]) def get_my_progress( db: Session = Depends(get_db), current_user: schemas.UserResponse = Depends(get_current_user) ): progress_list = crud.get_user_progress(db, user_id=current_user.id) # Calculate percentage for each progress result = [] for progress in progress_list: percentage = (progress.completed_lessons / progress.total_lessons * 100) if progress.total_lessons > 0 else 0 result.append({ "user_id": progress.user_id, "course_id": progress.course_id, "completed_lessons": progress.completed_lessons, "total_lessons": progress.total_lessons, "percentage": percentage, "updated_at": progress.updated_at }) return result @router.get("/{course_id}", response_model=schemas.ProgressResponse) def get_course_progress( course_id: int, db: Session = Depends(get_db), current_user: schemas.UserResponse = Depends(get_current_user) ): progress = crud.get_progress(db, user_id=current_user.id, course_id=course_id) if not progress: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Progress not found for this course" ) percentage = (progress.completed_lessons / progress.total_lessons * 100) if progress.total_lessons > 0 else 0 return { "user_id": progress.user_id, "course_id": progress.course_id, "completed_lessons": progress.completed_lessons, "total_lessons": progress.total_lessons, "percentage": percentage, "updated_at": progress.updated_at } @router.post("/{course_id}", response_model=schemas.ProgressResponse) def update_progress( course_id: int, progress_update: schemas.ProgressUpdate, db: Session = Depends(get_db), current_user: schemas.UserResponse = Depends(get_current_user) ): # Check if course exists course = crud.get_course_by_id(db, course_id) if not course: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Course not found" ) # Validate completed_lessons <= total_lessons if progress_update.completed_lessons > progress_update.total_lessons: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Completed lessons cannot exceed total lessons" ) progress = crud.create_or_update_progress( db, user_id=current_user.id, course_id=course_id, completed_lessons=progress_update.completed_lessons, total_lessons=progress_update.total_lessons ) percentage = (progress.completed_lessons / progress.total_lessons * 100) if progress.total_lessons > 0 else 0 return { "user_id": progress.user_id, "course_id": progress.course_id, "completed_lessons": progress.completed_lessons, "total_lessons": progress.total_lessons, "percentage": percentage, "updated_at": progress.updated_at } @router.delete("/{course_id}", response_model=schemas.SuccessResponse) def delete_progress( course_id: int, db: Session = Depends(get_db), current_user: schemas.UserResponse = Depends(get_current_user) ): success = crud.delete_progress(db, user_id=current_user.id, course_id=course_id) if not success: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Progress not found" ) return {"success": True, "message": "Progress deleted"}