diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py index 934f91c..0aa2675 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py @@ -1,12 +1,25 @@ +import fastapi + from ..payloads.settings import Settings as ModelsSettings import sqlalchemy.ext.asyncio from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker +from typing import (Annotated, Generator,) -def create_engine() -> 'async_sessionmaker[AsyncSession]': + +def create_engine() -> Generator[ + 'async_sessionmaker[AsyncSession]', + None, + None, +]: engine = sqlalchemy.ext.asyncio.create_async_engine(ModelsSettings.singleton().db_url) async_session = sqlalchemy.ext.asyncio.async_sessionmaker(engine) - return async_session + yield async_session + +AsyncSessionDep = Annotated[ + 'async_sessionmaker[AsyncSession]', + fastapi.Depends(create_engine) +] diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py index ab4198e..b449d6d 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py @@ -9,7 +9,7 @@ import uvicorn.config import sys from .settings import Settings as APISettings -from .db import create_engine +# from .db import create_engine, async_session from ..payloads.views import router as payloads_router # from .websocket_api import WebsocketAPI @@ -46,13 +46,17 @@ logger = logging.getLogger(__name__) def create_app() -> fastapi.FastAPI: - async_session = create_engine() + # async_session = create_engine() # websocket_api = WebsocketAPI( # session=async_session, # ) - app = fastapi.FastAPI() + app = fastapi.FastAPI( + # dependencies=[ + # fastapi.Depends(async_session), + # ] + ) logger.info(dict(msg='started loading apps')) for app_config in APISettings.singleton().apps: diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py index d65f829..499af4b 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py @@ -1,4 +1,6 @@ import datetime +import hashlib +import json from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker @@ -8,6 +10,30 @@ from sqlalchemy.future import select from .models import Payload from .utils import get_or_create +from typing import (Optional, Any,) + +async def payload_get_or_create( + session: AsyncSession, + output: list[str], + list_1: list[str], + list_2: list[str], + input_hash: Optional[str] = None, +): + if input_hash is None: + input_hash = hashlib.sha256(json.dumps(dict( + list_1=list_1, + list_2=list_2, + )).encode('utf-8')).digest().hex() + + return await get_or_create( + session, + Payload, + output=output, + list_1=list_1, + list_2=list_2, + input_hash=input_hash, + ) + # async def markets_get_by_symbol( # session: 'async_sessionmaker[AsyncSession]', # symbols: set[str], diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py index 2bce61d..81d375a 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py @@ -1,8 +1,13 @@ import fastapi +import itertools -from typing import (Annotated, Any,) +from typing import (Annotated, Any, cast, Optional,) from . import schema from .summarizer import SummarizerClient, SummaryRequest +from ..async_api.db import AsyncSessionDep +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.ext.asyncio import async_sessionmaker +from . import logic router = fastapi.APIRouter() @@ -16,18 +21,46 @@ async def payload_create( list[str], fastapi.Body(), ], + session: AsyncSessionDep ) -> schema.Payload: - data_1 = await SummarizerClient.singleton().summarize_post( + data_1 = (await SummarizerClient.singleton().summarize_post( request=SummaryRequest( data=list_1 ) - ) - data_2 = await SummarizerClient.singleton().summarize_post( + )).data + + data_2 = (await SummarizerClient.singleton().summarize_post( request=SummaryRequest( data=list_2 ) + )).data + + output_len = max(len(data_1), len(data_2)) + + def filter_none(o: Any) -> bool: + return o is not None + + output = list( + filter( + filter_none, + sum( + list( + itertools.zip_longest(data_1, data_2), + ), + cast(tuple[str], tuple()), + ) + ) ) + async with session() as active_session: + async with active_session.begin() as transaction: + payload, is_created = await logic.payload_get_or_create( + active_session, + list_1=list_1, + list_2=list_2, + output=output, + ) + raise NotImplementedError @router.get('/payload/{paylaod_id}')