From 0f13849b239dafa7054d92134452c5cc17085d3f Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Sep 2025 03:47:48 +0300 Subject: [PATCH] add register --- app/core/services/auth_service.py | 42 +++++++++++++++++++++++++++++++ app/ui/views/login_view.py | 30 ++++++++++++++++------ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/app/core/services/auth_service.py b/app/core/services/auth_service.py index 1095be8..7126f61 100644 --- a/app/core/services/auth_service.py +++ b/app/core/services/auth_service.py @@ -50,6 +50,48 @@ async def login(login, password): # Другие непредвиденные ошибки 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(): # Замените на реальные данные для теста diff --git a/app/ui/views/login_view.py b/app/ui/views/login_view.py index 60538c5..e1bdf54 100644 --- a/app/ui/views/login_view.py +++ b/app/ui/views/login_view.py @@ -283,15 +283,14 @@ class LoginView(QWidget): return True, "" def handle_register(self): - # Trigger validation for all fields - # self.name_input.on_text_changed(self.name_input.text()) + # Принудительная валидация всех полей self.reg_login_input.on_text_changed(self.reg_login_input.text()) self.reg_password_input.on_text_changed(self.reg_password_input.text()) self.confirm_password_input.on_text_changed(self.confirm_password_input.text()) self.invite_code_input.on_text_changed(self.invite_code_input.text()) + # Проверка, что все поля валидны if not all([ - # self.name_input.is_valid, self.reg_login_input.is_valid, self.reg_password_input.is_valid, self.confirm_password_input.is_valid, @@ -300,13 +299,28 @@ class LoginView(QWidget): QMessageBox.warning(self, localizer.translate("Ошибка"), localizer.translate("Пожалуйста, исправьте ошибки в форме")) return - # name = self.name_input.text() login = self.reg_login_input.text() - # password = self.reg_password_input.text() - # invite = self.invite_code_input.text() + password = self.reg_password_input.text() + invite = self.invite_code_input.text() or None # Отправляем None, если строка пустая + + # Блокируем кнопку на время запроса + self.register_button.setEnabled(False) + self.register_button.setText(localizer.translate("Регистрация...")) + + try: + success, message = asyncio.run(auth_service.register(login, password, invite)) + + if success: + QMessageBox.information(self, localizer.translate("Успех"), message) + self.show_login_form() + else: + QMessageBox.warning(self, localizer.translate("Ошибка"), message) + + finally: + # Возвращаем кнопку в исходное состояние + self.register_button.setEnabled(True) + self.register_button.setText(localizer.translate("Зарегистрироваться")) - QMessageBox.information(self, "Успех", f"{localizer.translate("Регистрация прошла успешно для")} {login}") - self.show_login_form() def change_language(self, display_name): lang_code = self.lang_map.get(display_name)