feat: get stocks

This commit is contained in:
2025-03-10 05:17:14 +03:00
parent a91703ecd8
commit 677a1c8b9c
3 changed files with 36 additions and 1 deletions

14
main.py
View File

@@ -4,17 +4,21 @@ from typing import Annotated
from celery.result import AsyncResult from celery.result import AsyncResult
from fastapi import FastAPI, Depends, HTTPException from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from sqlalchemy.ext.asyncio import AsyncSession
from starlette import status from starlette import status
from starlette.responses import JSONResponse from starlette.responses import JSONResponse
import backend.config import backend.config
from backend.session import get_session
from background import taskiq_broker from background import taskiq_broker
from buffer.core import TasksBuffer from buffer.core import TasksBuffer
from schemas.general import * from schemas.general import *
import background.tasks import background.tasks
from updaters.stocks_updater import StocksUpdater
auth_schema = HTTPBearer() auth_schema = HTTPBearer()
buffer = TasksBuffer() buffer = TasksBuffer()
SessionDependency = Annotated[AsyncSession, Depends(get_session)]
async def check_auth(token: Annotated[HTTPAuthorizationCredentials, Depends(auth_schema)]): async def check_auth(token: Annotated[HTTPAuthorizationCredentials, Depends(auth_schema)]):
@@ -117,3 +121,13 @@ def get_status(task_id):
"task_result": task_result.result "task_result": task_result.result
} }
return JSONResponse(result) return JSONResponse(result)
@app.get('/marketplace/{marketplace_id}/stocks')
async def get_marketplace_stocks(
marketplace_id: int,
session: SessionDependency,
only_available: bool = False
):
updater = StocksUpdater(session)
return await updater.get_all_stocks_for_marketplace(int(marketplace_id), only_available)

View File

@@ -58,6 +58,21 @@ class BaseMarketplaceUpdater(ABC):
marketplace_updates.append(marketplace_update) marketplace_updates.append(marketplace_update)
await self.marketplace_api.update_stocks(marketplace_updates) await self.marketplace_api.update_stocks(marketplace_updates)
async def get_all_stocks(self, only_available: bool) -> List[StockData]:
if not self.marketplace_api:
return []
stock_data_list = await queries.general.get_stocks_data(
session=self.session,
marketplace=self.marketplace
)
if only_available:
stock_data_list = list(filter(lambda x: x["full_stock"] > 0, stock_data_list))
for idx, stock_data in enumerate(stock_data_list):
stock_data['product_id'] = stock_data['marketplace_product'].product_id
del stock_data["marketplace_product"]
stock_data_list[idx] = stock_data
return stock_data_list
async def reset(self): async def reset(self):
if not self.marketplace_api: if not self.marketplace_api:
return return

View File

@@ -11,6 +11,7 @@ from sqlalchemy.orm import joinedload, selectinload
from backend.session import session_factory from backend.session import session_factory
from database import Marketplace, MarketplaceProduct, Warehouse, Company from database import Marketplace, MarketplaceProduct, Warehouse, Company
from database.sipro.enums.general import BaseMarketplace from database.sipro.enums.general import BaseMarketplace
from queries.general import StockData
from schemas.general import StockUpdate from schemas.general import StockUpdate
from updaters.factory import UpdaterFactory from updaters.factory import UpdaterFactory
@@ -72,6 +73,11 @@ class StocksUpdater:
logging.info( logging.info(
f"{marketplace.name} successfully fully updated in {round(time.time() - start, 2)} seconds.") f"{marketplace.name} successfully fully updated in {round(time.time() - start, 2)} seconds.")
async def get_all_stocks_for_marketplace(self, marketplace_id: int, only_available: bool) -> List[StockData]:
marketplace = await self.get_marketplace(marketplace_id)
updater = UpdaterFactory.get_updater(self.session, marketplace)
return await updater.get_all_stocks(only_available)
async def full_update_all_marketplaces(self, marketplace_ids: Union[List[int], None] = None): async def full_update_all_marketplaces(self, marketplace_ids: Union[List[int], None] = None):
marketplaces = await self.get_marketplaces(marketplace_ids) marketplaces = await self.get_marketplaces(marketplace_ids)