import httpx from app.core import config from app.core.localizer import localizer from app.core.models.chat_models import PrivateChatListResponse, PrivateChatListData, PrivateChatHistoryResponse, PrivateChatHistoryData from uuid import UUID async def get_private_chats(token: str, offset: int = 0, limit: int = 20): """ Получает список приватных чатов пользователя. :param token: Токен доступа пользователя :param offset: Смещение для пагинации :param limit: Количество чатов для загрузки :return: Кортеж (успех: bool, данные: PrivateChatListData | str) """ # TODO: Добавить логику обновления токена, как в auth_service.py url = f"{config.BASE_URL}/v1/chat/private/list" headers = {"Authorization": f"Bearer {token}"} params = {"offset": offset, "limit": limit} try: async with httpx.AsyncClient(http2=True) as client: response = await client.get(url, headers=headers, params=params) print("response.status_code", response.status_code) if response.status_code == 200: data = response.json() if data.get("status") == "fine": # Используем Pydantic модель для парсинга ответа response_model = PrivateChatListResponse(**data) print("response_model.data", response_model.data) return True, response_model.data else: return False, data.get("detail", localizer.translate("Неизвестная ошибка ответа")) elif response.status_code in [401, 403]: error_data = response.json() return False, error_data.get("detail", localizer.translate("Ошибка аутентификации или авторизации")) elif response.status_code == 422: return False, localizer.translate("Некорректные параметры запроса") else: return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}" except httpx.RequestError as e: return False, f"{localizer.translate('Ошибка сети')}: {e}" except Exception as e: return False, f"{localizer.translate('Произошла ошибка')}: {e}" async def get_chat_history(token: str, chat_id: UUID, before_message_id: int = None, limit: int = 30): """ Получает историю сообщений для указанного приватного чата. :param token: Токен доступа :param chat_id: ID чата :param before_message_id: ID сообщения для пагинации (загрузка более старых) :param limit: Количество сообщений для загрузки :return: Кортеж (успех: bool, данные: PrivateChatHistoryData | str) """ url = f"{config.BASE_URL}/v1/chat/private/history" headers = {"Authorization": f"Bearer {token}"} params = {"chat_id": str(chat_id), "limit": limit} if before_message_id: params["before_message_id"] = before_message_id try: async with httpx.AsyncClient(http2=True) as client: response = await client.get(url, headers=headers, params=params) if response.status_code == 200: data = response.json() if data.get("status") == "fine": response_model = PrivateChatHistoryResponse(**data) return True, response_model.data else: return False, data.get("detail", "Неизвестная ошибка ответа") elif response.status_code in [401, 403]: error_data = response.json() return False, error_data.get("detail", "Ошибка аутентификации или доступа") elif response.status_code == 422: return False, "Некорректные параметры запроса" else: return False, f"Ошибка сервера: {response.status_code}" except httpx.RequestError as e: return False, f"Ошибка сети: {e}" except Exception as e: return False, f"Произошла ошибка: {e}"