Added WebSocket notify API for spools

This commit is contained in:
Donkie
2023-09-17 22:00:00 +02:00
parent e8d91bc4ce
commit cadb707fdd
5 changed files with 178 additions and 3 deletions

View File

@@ -1,10 +1,11 @@
"""Spool related endpoints."""
import asyncio
import logging
from datetime import datetime
from typing import Annotated, Optional
from fastapi import APIRouter, Depends, Query
from fastapi import APIRouter, Depends, Query, WebSocket, WebSocketDisconnect
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
@@ -17,6 +18,7 @@ from spoolman.database import spool
from spoolman.database.database import get_db_session
from spoolman.database.utils import SortOrder
from spoolman.exceptions import ItemCreateError
from spoolman.ws import websocket_manager
logger = logging.getLogger(__name__)
@@ -242,7 +244,10 @@ async def find(
@router.get(
"/{spool_id}",
name="Get spool",
description="Get a specific spool.",
description=(
"Get a specific spool. A websocket is served on the same path to listen for changes to the spool. "
"The response model is the same for the websocket messages as for this endpoint."
),
response_model_exclude_none=True,
responses={404: {"model": Message}},
)
@@ -254,6 +259,25 @@ async def get(
return Spool.from_db(db_item)
@router.websocket(
"/{spool_id}",
name="Listen to spool changes",
)
async def notify(
websocket: WebSocket,
spool_id: int,
) -> None:
await websocket.accept()
websocket_manager.connect(("spool", str(spool_id)), websocket)
try:
while True:
await asyncio.sleep(0.5)
if await websocket.receive_text():
await websocket.send_json({"status": "healthy"})
except WebSocketDisconnect:
websocket_manager.disconnect(("spool", str(spool_id)), websocket)
@router.post(
"",
name="Add spool",