diff --git a/iaai_scraper/api/app.py b/iaai_scraper/api/app.py index a860c98..ba73b00 100644 --- a/iaai_scraper/api/app.py +++ b/iaai_scraper/api/app.py @@ -12,8 +12,7 @@ from .routes import cars, health, tasks @asynccontextmanager async def lifespan(app: FastAPI): # Жизненный цикл. - persistence: PersistenceService = app.state.persistence - persistence.create_tables() + # Таблицы создаются через Alembic-миграции (сервис migrate). yield diff --git a/iaai_scraper/api/routes/tasks.py b/iaai_scraper/api/routes/tasks.py index f7f0c61..3979d34 100644 --- a/iaai_scraper/api/routes/tasks.py +++ b/iaai_scraper/api/routes/tasks.py @@ -7,6 +7,7 @@ from sqlalchemy import select, func from ..deps import get_persistence from ...storage.db import PersistenceService from ...storage.models import SyncRun +from ...worker.celery_app import celery_app from ...worker.tasks import sync_vehicle_task, sync_listing_task router = APIRouter() @@ -64,6 +65,25 @@ def start_sync_listing( } +@router.get("/tasks/{task_id}") +def get_task_status(task_id: str): + result = celery_app.AsyncResult(task_id) + + payload: dict = { + "task_id": task_id, + "state": result.state, + } + + if result.successful(): + payload["result"] = result.result + elif result.failed(): + payload["error"] = str(result.result) + elif result.info is not None: + payload["meta"] = result.info + + return payload + + @router.get("/sync-runs") def list_sync_runs( page: int = Query(1, ge=1),