| from __future__ import annotations |
|
|
| from fastapi import APIRouter, Depends, status |
| from sqlalchemy import select |
| from sqlalchemy.orm import Session |
|
|
| from app.core.auth import require_user |
| from app.core.database import get_db |
| from app.models.class_session_progress import ClassSessionProgress |
| from app.models.user import User |
| from app.schemas.class_session_progress import ( |
| ClassSessionProgressRead, |
| ClassSessionProgressUpsert, |
| ) |
| from app.services.learning_state_service import sync_class_session_lesson_progress |
|
|
|
|
| router = APIRouter() |
|
|
|
|
| @router.post("", response_model=ClassSessionProgressRead, status_code=status.HTTP_200_OK) |
| def upsert_class_session_progress( |
| payload: ClassSessionProgressUpsert, |
| db: Session = Depends(get_db), |
| current_user: User = Depends(require_user), |
| ) -> ClassSessionProgress: |
| record = db.scalar( |
| select(ClassSessionProgress).where( |
| ClassSessionProgress.user_id == current_user.id, |
| ClassSessionProgress.class_session_id == payload.class_session_id, |
| ) |
| ) |
| if record is None: |
| record = ClassSessionProgress( |
| user_id=current_user.id, |
| class_session_id=payload.class_session_id, |
| data=payload.data, |
| ) |
| db.add(record) |
| else: |
| record.data = payload.data |
| db.add(record) |
| db.flush() |
| sync_class_session_lesson_progress( |
| db, |
| user_id=current_user.id, |
| class_session_id=record.class_session_id, |
| data=dict(record.data or {}), |
| ) |
| db.commit() |
| db.refresh(record) |
| return record |
|
|
|
|
| @router.get("", response_model=list[ClassSessionProgressRead]) |
| def list_class_session_progress( |
| db: Session = Depends(get_db), |
| current_user: User = Depends(require_user), |
| ) -> list[ClassSessionProgress]: |
| return list( |
| db.scalars( |
| select(ClassSessionProgress).where(ClassSessionProgress.user_id == current_user.id) |
| ).all() |
| ) |
|
|