Исходный код tbank.shopping.aio

from __future__ import annotations

from typing import Optional

import httpx

from tbank.core.auth import BearerAuth
from tbank.core.client import BaseAsyncClient
from tbank.core.client import page_params as _page
from tbank.core.errors import TBankAPIError
from tbank.core.retry import RetryPolicy
from tbank.core.transport import AsyncTransport, CertTypes, VerifyTypes
from tbank.core.urls import SANDBOX_SECURED_URL, SECURED_URL
from tbank.shopping import _endpoints
from tbank.shopping.errors import error_from_shopping_response
from tbank.shopping.models import (
    Chat,
    ChatFileUploadResult,
    ChatList,
    MessageList,
    SendMessageRequest,
    SendMessageResult,
)


[документация] class ShoppingClient(BaseAsyncClient): """Асинхронный клиент шопинга (чаты магазина): чаты, сообщения и файлы. Домен работает на secured-хосте (**mTLS**, `cert`) по **Bearer**-токену. Провод — `camelCase`. """ def __init__( self, token: str, *, base_url: Optional[str] = None, sandbox: bool = False, cert: Optional[CertTypes] = None, verify: VerifyTypes = True, retry: Optional[RetryPolicy] = None, transport: Optional[AsyncTransport] = None, ) -> None: resolved = base_url or (SANDBOX_SECURED_URL if sandbox else SECURED_URL) transport = transport or AsyncTransport( base_url=resolved, auth=BearerAuth(token), cert=cert, verify=verify, retry=retry, ) super().__init__(transport) def _error_from_response(self, response: httpx.Response) -> TBankAPIError: return error_from_shopping_response(response)
[документация] async def list_chats(self, shop_id: str) -> ChatList: """Список чатов магазина.""" return await self._get(_endpoints.chats_path(shop_id), ChatList)
[документация] async def get_chat(self, shop_id: str, chat_id: str) -> Chat: """Карточка чата.""" return await self._get(_endpoints.chat_path(shop_id, chat_id), Chat)
[документация] async def list_messages( self, shop_id: str, chat_id: str, *, limit: Optional[int] = None, message_id_from: Optional[str] = None, ) -> MessageList: """Сообщения чата.""" return await self._get( _endpoints.messages_path(shop_id, chat_id), MessageList, params=_page(limit=limit, messageIdFrom=message_id_from), )
[документация] async def send_message( self, shop_id: str, chat_id: str, request: SendMessageRequest ) -> SendMessageResult: """Отправить сообщение в чат.""" return await self._send( "POST", _endpoints.messages_path(shop_id, chat_id), SendMessageResult, body=request, )
[документация] async def upload_chat_file( self, shop_id: str, chat_id: str, content: bytes, *, file_name: str, file_type: str, ) -> ChatFileUploadResult: """Загрузить файл в чат (octet-stream). Возвращает идентификатор файла.""" response = await self._transport.request( "POST", _endpoints.files_path(shop_id, chat_id), content=content, headers={ "Content-Type": "application/octet-stream", "x-content-file-name": file_name, "x-content-file-type": file_type, }, ) self._raise_for_http(response) return ChatFileUploadResult.model_validate(self._parse_body(response))
[документация] async def download_chat_file( self, shop_id: str, chat_id: str, file_id: str ) -> bytes: """Скачать файл из чата (бинарное содержимое).""" response = await self._transport.request( "GET", _endpoints.file_path(shop_id, chat_id, file_id) ) self._raise_for_http(response) return response.content