From 988cb0176a13f9d01c6da1c7d2b07bc9c89d73ef Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Sep 2025 18:57:18 +0300 Subject: [PATCH] add load from server role --- app/core/database.py | 12 ++++++++++ app/core/models/user_models.py | 23 +++++++++++++++++++ app/core/services/auth_service.py | 37 +++++++++++++++++++++++++++++++ app/ui/views/yobble_home_view.py | 11 ++++----- 4 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 app/core/models/user_models.py diff --git a/app/core/database.py b/app/core/database.py index 2d0560a..fdf8837 100644 --- a/app/core/database.py +++ b/app/core/database.py @@ -103,3 +103,15 @@ def set_last_login(login: str): cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,)) conn.commit() conn.close() + +def get_current_access_token(): + """ + Получает access_token для последней активной сессии. + :return: access_token или None, если сессия не найдена. + """ + last_login = get_last_login() + if not last_login: + return None + + session = get_session(last_login) + return session['access_token'] if session else None diff --git a/app/core/models/user_models.py b/app/core/models/user_models.py new file mode 100644 index 0000000..59f654f --- /dev/null +++ b/app/core/models/user_models.py @@ -0,0 +1,23 @@ +from uuid import UUID +from datetime import datetime +from pydantic import BaseModel, Field +from typing import List, Optional + + +class UserPrivilege(BaseModel): + id: int + code: str + name: str + description: str + is_active: bool + created_at: datetime + + +class UserRoleData(BaseModel): + user_id: UUID = Field(..., description="ID пользователя") + user_privilege: Optional[UserPrivilege] = Field(None, description="Привилегия пользователя") + user_permissions: List[str] = Field(default_factory=list, description="Список кодов прав") + +class UserRoleResponse(BaseModel): + status: str + data: UserRoleData diff --git a/app/core/services/auth_service.py b/app/core/services/auth_service.py index b4d6e79..eadd200 100644 --- a/app/core/services/auth_service.py +++ b/app/core/services/auth_service.py @@ -91,6 +91,43 @@ async def register(login, password, invite=None): return False, f"{localizer.translate('Произошла ошибка')}: {e}" +async def get_user_role(access_token: str): + """ + Получает роль и права пользователя по токену доступа. + + :param access_token: Токен доступа пользователя + :return: Кортеж (успех: bool, данные: UserRoleData | str) + """ + url = f"{config.BASE_URL}/v1/user/role" + headers = {"Authorization": f"Bearer {access_token}"} + + try: + async with httpx.AsyncClient(http2=True) as client: + response = await client.get(url, headers=headers) + + if response.status_code == 200: + data = response.json() + if data.get("status") == "fine": + # Здесь можно добавить валидацию через Pydantic, если необходимо + # from app.core.models.user_models import UserRoleData + # user_role_data = UserRoleData(**data['data']) + return True, data['data'] + else: + return False, data.get("detail", localizer.translate("Неизвестная ошибка ответа")) + + elif response.status_code == 401: + return False, localizer.translate("Токен недействителен или истек") + elif response.status_code == 404: + 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 main(): # Замените на реальные данные для теста diff --git a/app/ui/views/yobble_home_view.py b/app/ui/views/yobble_home_view.py index f1b7774..db56837 100644 --- a/app/ui/views/yobble_home_view.py +++ b/app/ui/views/yobble_home_view.py @@ -40,6 +40,7 @@ class YobbleHomeView(QWidget): # 3. Нижняя панель навигации self.bottom_bar = self.create_bottom_bar() + self.content_stack.setCurrentIndex(2) content_layout.addWidget(self.bottom_bar) main_layout.addWidget(self.content_widget) @@ -168,18 +169,18 @@ class YobbleHomeView(QWidget): bottom_bar_layout.setSpacing(10) btn_feed = self.create_tab_button("☰", "Лента", 0) - btn_search = self.create_tab_button("🔍", "Поиск", 1) + btn_music = self.create_tab_button("🎵", "Музыка", 1) btn_create = self.create_create_button() btn_chats = self.create_tab_button("💬", "Чаты", 2) btn_profile = self.create_tab_button("👤", "Лицо", 3) bottom_bar_layout.addWidget(btn_feed) - bottom_bar_layout.addWidget(btn_search) + bottom_bar_layout.addWidget(btn_music) bottom_bar_layout.addWidget(btn_create) bottom_bar_layout.addWidget(btn_chats) bottom_bar_layout.addWidget(btn_profile) - for btn in [btn_feed, btn_search, btn_chats, btn_profile]: + for btn in [btn_feed, btn_music, btn_chats, btn_profile]: btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) btn.setFocusPolicy(Qt.NoFocus) @@ -230,7 +231,7 @@ class YobbleHomeView(QWidget): def setup_content_pages(self): self.content_stack.addWidget(QLabel("Контент Ленты")) - self.content_stack.addWidget(QLabel("Контент Поиска")) + self.content_stack.addWidget(QLabel("Контент Музыки")) self.content_stack.addWidget(QLabel("Контент Чатов")) self.content_stack.addWidget(QLabel("Контент Профиля")) @@ -238,7 +239,7 @@ class YobbleHomeView(QWidget): self.content_stack.setCurrentIndex(index) self.update_tab_selection(index) - titles = ["Лента", "Поиск", "Чаты", "Лицо"] + titles = ["Лента", "Музыка", "Чаты", "Лицо"] self.title_label.setText(titles[index]) def update_tab_selection(self, selected_index):