103 lines
4.6 KiB
Python
103 lines
4.6 KiB
Python
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())
|