File size: 1,952 Bytes
7c6ffa6 d5ee82b 7c6ffa6 d5ee82b 7c6ffa6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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()
)
|