57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import time
 | 
						|
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]):
 | 
						|
        if not self.marketplace_api:
 | 
						|
            return
 | 
						|
        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
 | 
						|
        )
 | 
						|
        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)
 | 
						|
 | 
						|
    async def update_all(self):
 | 
						|
        if not self.marketplace_api:
 | 
						|
            return
 | 
						|
        stock_data_list = await queries.general.get_stocks_data(
 | 
						|
            session=self.session,
 | 
						|
            marketplace=self.marketplace,
 | 
						|
        )
 | 
						|
        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)
 |