from typing import Annotated from celery.result import AsyncResult from fastapi import FastAPI, Depends, HTTPException from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from starlette import status from starlette.responses import JSONResponse import backend.config import background.tasks from background.tasks import * from schemas.general import UpdateRequest, UpdateResponse, UpdateMarketplaceRequest, UpdateMarketplacesRequest auth_schema = HTTPBearer() async def check_auth(token: Annotated[HTTPAuthorizationCredentials, Depends(auth_schema)]): if token.credentials != backend.config.API_KEY: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='Invalid credentials') app = FastAPI( dependencies=[Depends(check_auth)] ) @app.post( '/update', response_model=UpdateResponse ) async def update( request: UpdateRequest ): task = background.tasks.process_update.delay(request.product_ids) return UpdateResponse(task_id=task.id) @app.post('/update/marketplace') async def update_marketplace( request: UpdateMarketplaceRequest ): task = background.tasks.update_marketplace.delay(request.marketplace_id) return UpdateResponse(task_id=task.id) @app.post('/update/marketplaces') async def update_marketplace( request: UpdateMarketplacesRequest ): task = background.tasks.update_marketplaces.delay(request.marketplace_ids) return UpdateResponse(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)