desktop_app/app/core/services/auth_service.py
2025-09-26 03:32:00 +03:00

61 lines
2.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 main():
# Замените на реальные данные для теста
success, message = await login("testuser", "testpassword")
print(f"Результат входа: {success}, Сообщение: {message}")
if __name__ == "__main__":
asyncio.run(main())