Added websocket endpoints for filament and vendors

This commit is contained in:
Donkie
2023-10-15 15:39:39 +02:00
parent 0fab369518
commit 3c5b3cea5a
4 changed files with 68 additions and 4 deletions

View File

@@ -1,8 +1,9 @@
"""Vendor related endpoints."""
import asyncio
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
@@ -14,6 +15,7 @@ from spoolman.api.v1.models import Message, Vendor
from spoolman.database import vendor
from spoolman.database.database import get_db_session
from spoolman.database.utils import SortOrder
from spoolman.ws import websocket_manager
router = APIRouter(
prefix="/vendor",
@@ -100,7 +102,10 @@ async def find(
@router.get(
"/{vendor_id}",
name="Get vendor",
description="Get a specific vendor.",
description=(
"Get a specific vendor. A websocket is served on the same path to listen for changes to the vendor. "
"The response model is the same for the websocket messages as for this endpoint."
),
response_model_exclude_none=True,
responses={404: {"model": Message}},
)
@@ -112,6 +117,25 @@ async def get(
return Vendor.from_db(db_item)
@router.websocket(
"/{vendor_id}",
name="Listen to vendor changes",
)
async def notify(
websocket: WebSocket,
vendor_id: int,
) -> None:
await websocket.accept()
websocket_manager.connect(("vendor", str(vendor_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(("vendor", str(vendor_id)), websocket)
@router.post(
"",
name="Add vendor",