import asyncio import json import logging from typing import Union from aiohttp import ClientResponse, ClientSession from backend.config import YANDEX_CLIENT_ID from database import Marketplace from limiter import BatchLimiter from marketplaces.base import BaseMarketplaceApi from utils import chunk_list class YandexmarketMarketplaceApi(BaseMarketplaceApi): def __init__(self, marketplace: Marketplace): self.marketplace = marketplace self.is_valid = True try: auth_data = json.loads(marketplace.auth_data) except Exception: logging.error(f"Couldn't load auth data for marketplace [{self.marketplace.id}]") self.is_valid = False return api_key = auth_data.get('apiKey') if api_key: self.limiter_key = str(marketplace.company_id) + str(api_key) + str(self.marketplace.campaign_id) self.headers = { 'Api-Key': api_key } else: access_token = auth_data.get('accessToken') if not access_token: self.is_valid = False return self.limiter_key = str(marketplace.company_id) + str(access_token) + str(self.marketplace.campaign_id) self.headers = { 'Authorization': f'OAuth oauth_token="{access_token}", oauth_client_id="{YANDEX_CLIENT_ID}"' } def get_headers(self): return self.headers @property def api_url(self): return 'https://api.partner.market.yandex.ru/v2' async def update_stocks(self, data: Union[list, dict]) -> (ClientSession, ClientResponse): campaign_id = self.marketplace.campaign_id return await self._method('PUT', f'/campaigns/{campaign_id}/offers/stocks', data={'skus': data})