107 lines
3.8 KiB
Python
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"}
|