Newer
Older
navi-1 / navi / api / routes / sessions / recall.py
@Eugene Sukhodolskiy Eugene Sukhodolskiy 1 day ago 2 KB api: split the sessions routes into a package
"""Scheduled recalls attached to a session."""

from typing import Annotated

from fastapi import Depends, HTTPException

from navi.api.deps import get_scheduler, get_session_store, require_user
from navi.auth import User
from navi.auth.deps import check_session_access
from navi.core import SessionStore
from navi.core.scheduler import RecallScheduler

from ._router import router  # the shared /sessions router
from .common import _recall_payload


@router.get("/{session_id}/recall")
async def get_session_recall(
    session_id: str,
    store: Annotated[SessionStore, Depends(get_session_store)],
    user: Annotated[User, Depends(require_user)],
    scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
    session = await store.get(session_id)
    if session is None:
        raise HTTPException(status_code=404, detail="Session not found")
    check_session_access(session, user)
    return {"recall": _recall_payload(await scheduler.get_pending_recall(session_id))}


@router.delete("/{session_id}/recall")
async def cancel_session_recall(
    session_id: str,
    store: Annotated[SessionStore, Depends(get_session_store)],
    user: Annotated[User, Depends(require_user)],
    scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
    session = await store.get(session_id)
    if session is None:
        raise HTTPException(status_code=404, detail="Session not found")
    check_session_access(session, user)
    ok = await scheduler.cancel_recall(session_id)
    if ok:
        from navi.core.event_bus import get_event_bus
        from navi.core.events import RecallUpdate
        await get_event_bus().publish(
            RecallUpdate(session_id=session_id, status="cancelled", action="cancelled")
        )
    return {"ok": ok}


@router.post("/{session_id}/recall/skip")
async def skip_session_recall(
    session_id: str,
    store: Annotated[SessionStore, Depends(get_session_store)],
    user: Annotated[User, Depends(require_user)],
    scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
    session = await store.get(session_id)
    if session is None:
        raise HTTPException(status_code=404, detail="Session not found")
    check_session_access(session, user)
    ok = await scheduler.skip_next_recall(session_id)
    if ok:
        from navi.core.event_bus import get_event_bus
        from navi.core.events import RecallUpdate
        await get_event_bus().publish(
            RecallUpdate(session_id=session_id, status="pending", action="rescheduled")
        )
    return {"ok": ok}