import httpx import asyncio from app.core import config from app.core.database import add_session async def login(login, password): """ Отправляет запрос на аутентификацию и в случае успеха сохраняет сессию. :param login: Логин пользователя :param password: Пароль пользователя :return: Кортеж (успех: bool, сообщение: str) """ url = f"{config.BASE_URL}/v1/auth/login" try: async with httpx.AsyncClient(http2=True) as client: response = await client.post(url, json={"login": login, "password": password}) if response.status_code == 200: data = response.json() if data.get("status") == "fine": token_data = data["data"] add_session( login=login, access_token=token_data["access_token"], refresh_token=token_data["refresh_token"] ) return True, "Успешный вход" 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: # Ошибка валидации Pydantic error_data = response.json() # Можно будет позже реализовать более детальный разбор ошибок return False, error_data.get("detail", "Некорректные данные для входа") else: return False, f"Ошибка сервера: {response.status_code}" except httpx.RequestError as e: # Ошибка сети, таймаут и т.д. return False, f"Ошибка сети: {e}" except Exception as e: # Другие непредвиденные ошибки return False, f"Произошла ошибка: {e}" async def register(login, password, invite=None): """ Отправляет запрос на регистрацию нового пользователя. :param login: Логин :param password: Пароль :param invite: Инвайт-код (опционально) :return: Кортеж (успех: bool, сообщение: str) """ url = f"{config.BASE_URL}/v1/auth/register" payload = {"login": login, "password": password} if invite: payload["invite"] = invite try: async with httpx.AsyncClient(http2=True) as client: response = await client.post(url, json=payload) if response.status_code == 201: return True, "Регистрация прошла успешно!" # Обрабатываем специфичные ошибки error_data = response.json() error_message = error_data.get("detail", "Произошла неизвестная ошибка") if response.status_code == 409: # Конфликт (логин занят) return False, "Этот логин уже занят." elif response.status_code == 400: # Неверный инвайт return False, "Неверный инвайт-код." elif response.status_code == 403: # Регистрация отключена return False, "Регистрация в данный момент отключена." elif response.status_code == 422: # Ошибка валидации return False, "Данные не прошли валидацию. Проверьте длину логина и пароля." else: return False, f"Ошибка сервера ({response.status_code}): {error_message}" except httpx.RequestError as e: return False, f"Ошибка сети: {e}" except Exception as e: return False, f"Произошла ошибка: {e}" # Пример использования (для тестирования) async def main(): # Замените на реальные данные для теста success, message = await login("testuser", "testpassword") print(f"Результат входа: {success}, Сообщение: {message}") if __name__ == "__main__": asyncio.run(main())