Старт
This commit is contained in:
106
backend/app/routes/progress.py
Normal file
106
backend/app/routes/progress.py
Normal file
@@ -0,0 +1,106 @@
|
||||
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"}
|
||||
Reference in New Issue
Block a user