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() )