from typing import Annotated from celery.result import AsyncResult from fastapi import FastAPI, Depends, Body from sqlalchemy import select from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload from starlette.responses import JSONResponse from backend.session import get_session from database import DailyStock from database.sipro import * from queries.general import get_stocks_data from background.tasks import * from updaters.stocks_updater import StockUpdate app = FastAPI() @app.get("/") async def root( session: Annotated[AsyncSession, Depends(get_session)], marketplace_id: int ): marketplace = await session.get(Marketplace, marketplace_id, options=[ joinedload(Marketplace.warehouses).joinedload(Warehouse.suppliers), joinedload(Marketplace.warehouses).joinedload(Warehouse.company_warehouses), joinedload(Marketplace.company).joinedload(Company.warehouse) ]) data = await get_stocks_data(session, marketplace) data = sorted(data, key=lambda x: x['denco_article']) return {"message": data} @app.post("/tasks", status_code=201) def run_task(payload=Body(...)): task_type = payload["type"] task = test_task.delay() return JSONResponse({"task_id": task.id}) @app.get("/tasks/{task_id}") def get_status(task_id): task_result = AsyncResult(task_id) result = { "task_id": task_id, "task_status": task_result.status, "task_result": task_result.result } return JSONResponse(result)