diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py index b8624f3..f6a95a0 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py @@ -1,4 +1,5 @@ import fastapi +import pydantic import functools import logging import copy @@ -8,7 +9,7 @@ import sys from .settings import Settings as APISettings -from typing import (Any, Optional,) +from typing import (Any, Optional, Literal, Annotated,) logger = logging.getLogger(__name__) @@ -28,11 +29,41 @@ class WebsocketAPI: self.connections.add(client) + class Subscribe(pydantic.BaseModel): + action: Literal['subscribe'] + class message_t(pydantic.BaseModel): + asset_id: Annotated[ + int, + pydantic.Field(alias='assetId') + ] + + message: message_t + + class Assets(pydantic.BaseModel): + action: Literal['assets'] + class message_t(pydantic.BaseModel): + pass + + message: Annotated[ + message_t, + pydantic.Field( + default_factory=message_t, + ) + ] + + Message = pydantic.RootModel[ + Assets | Subscribe + ] + async def on_message( self, client: fastapi.WebSocket, - msg: Any + msg_raw: str ) -> None: + msg = self.Message.model_validate_json( + msg_raw + ).root + raise NotImplementedError async def disconnect(self, client: fastapi.WebSocket) -> None: @@ -55,6 +86,7 @@ async def websocket_tickers( # websocket_api.disconnect(websocket) except: logger.exception('') + raise finally: await websocket_api.disconnect(websocket) @@ -68,7 +100,7 @@ def create_app() -> fastapi.FastAPI: )( functools.partial( websocket_tickers, - websocket_api=websocket_api, + websocket_api=fastapi.Depends(lambda : websocket_api), ) )