feat(archive): complete recorded session lifecycle
This commit is contained in:
@@ -303,6 +303,79 @@ def build_session_router(
|
||||
detail="Некорректный идентификатор сессии.",
|
||||
) from exc
|
||||
|
||||
@router.delete(
|
||||
"/api/v1/observation-sessions/{session_id}",
|
||||
status_code=204,
|
||||
)
|
||||
async def delete_observation_session(session_id: str) -> Response:
|
||||
try:
|
||||
store.get_session(session_id)
|
||||
recorded_artifacts = store.list_recorded_media(session_id)
|
||||
except SessionNotFoundError as exc:
|
||||
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
||||
except ValueError as exc:
|
||||
raise HTTPException(
|
||||
status_code=422,
|
||||
detail="Некорректный идентификатор сессии.",
|
||||
) from exc
|
||||
|
||||
if recording_preparation_manager is not None:
|
||||
snapshot = recording_preparation_manager.status(session_id)
|
||||
if snapshot is not None and snapshot.state in {
|
||||
"queued",
|
||||
"validating",
|
||||
"exporting",
|
||||
"finalizing",
|
||||
}:
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Дождитесь завершения подготовки записи перед удалением.",
|
||||
)
|
||||
await run_in_threadpool(
|
||||
recording_preparation_manager.release_launch_reservation,
|
||||
session_id,
|
||||
)
|
||||
|
||||
cache_deleter = getattr(recording_materializer, "delete_cached", None)
|
||||
if callable(cache_deleter):
|
||||
try:
|
||||
cache_deleted = await run_in_threadpool(cache_deleter, session_id)
|
||||
except (OSError, RecordingMaterializationError) as exc:
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Подготовленную запись пока нельзя удалить.",
|
||||
) from exc
|
||||
if cache_deleted is not True:
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Запись сейчас открыта в интерфейсе. Закройте её и повторите удаление.",
|
||||
)
|
||||
|
||||
if (
|
||||
recording_preparation_manager is not None
|
||||
and not recording_preparation_manager.discard(session_id)
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Подготовка записи ещё выполняется.",
|
||||
)
|
||||
|
||||
try:
|
||||
await run_in_threadpool(
|
||||
recorded_media_inspector.delete_prepared,
|
||||
session_id,
|
||||
(artifact.artifact_id for artifact in recorded_artifacts),
|
||||
)
|
||||
await run_in_threadpool(store.delete_session, session_id)
|
||||
except SessionNotFoundError as exc:
|
||||
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
||||
except (OSError, SessionIntegrityError) as exc:
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Сервер не смог безопасно удалить файлы этой сессии.",
|
||||
) from exc
|
||||
return Response(status_code=204)
|
||||
|
||||
@router.post("/api/v1/observation-sessions/{session_id}/replay")
|
||||
async def replay_observation_session(
|
||||
session_id: str,
|
||||
|
||||
Reference in New Issue
Block a user