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