from abc import ABC, abstractmethod from typing import List from sqlalchemy.ext.asyncio import AsyncSession import queries.general from database import Marketplace from marketplaces import MarketplaceApiFactory from marketplaces.base import BaseMarketplaceApi from queries.general import StockData from schemas.general import StockUpdate class BaseMarketplaceUpdater(ABC): marketplace: Marketplace marketplace_api: BaseMarketplaceApi session: AsyncSession def __init__(self, marketplace: Marketplace, session: AsyncSession): self.marketplace = marketplace self.session = session self.marketplace_api = MarketplaceApiFactory.get_marketplace_api(marketplace) @abstractmethod def get_update_for_marketplace(self, stock_data: StockData) -> dict: pass async def update(self, updates: List[StockUpdate]): product_ids = list(set([update.product_id for update in updates])) stock_data_list = await queries.general.get_stocks_data( session=self.session, marketplace=self.marketplace, product_ids=product_ids ) return marketplace_updates = [] for stock_data in stock_data_list: marketplace_update = self.get_update_for_marketplace(stock_data) marketplace_updates.append(marketplace_update) await self.marketplace_api.update_stocks(marketplace_updates)