Files
pyisu/backend/app/routes/progress.py
2026-03-13 14:39:43 +08:00

107 lines
3.8 KiB
Python

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"}