From 4276b147f29063611aaa84850d919679705a4dd1 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Sep 2025 03:42:57 +0300 Subject: [PATCH] add autologin --- app/controllers/main_controller.py | 22 +++++++++++++++++----- app/core/database.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/controllers/main_controller.py b/app/controllers/main_controller.py index 9618c51..232bfaa 100644 --- a/app/controllers/main_controller.py +++ b/app/controllers/main_controller.py @@ -6,6 +6,7 @@ from app.core.models.mock_data import get_mock_chats # ← заглушка from typing import Optional from threading import Thread import time # эмуляция задержки от сервера +from app.core.database import get_last_login, get_session, set_last_login class MainController(QStackedWidget): def __init__(self): @@ -16,12 +17,17 @@ class MainController(QStackedWidget): self.init_app() def init_app(self): - session_found = False # ← здесь позже будет логика автологина + """Проверяет наличие сессии для автологина.""" + last_login = get_last_login() + if last_login: + session = get_session(last_login) + if session: + # Если сессия найдена, сразу переходим к списку чатов + self.handle_login_success(last_login) + return - if session_found: - self.handle_login_success("user_from_session") - else: - self.show_login() + # Если сессия не найдена, показываем экран входа + self.show_login() def show_login(self): self.login_view = LoginView(on_login=self.handle_login_success) @@ -30,8 +36,14 @@ class MainController(QStackedWidget): self.login_view.show() def handle_login_success(self, username: str): + """Обрабатывает успешный вход в систему.""" + # Сохраняем пользователя как последнего вошедшего + set_last_login(username) + if self.login_view: self.login_view.close() + self.removeWidget(self.login_view) + self.login_view = None # 🔹 1. Загружаем чаты локально chat_items: list[PrivateChatListItem] = self.load_local_chats() diff --git a/app/core/database.py b/app/core/database.py index c657d18..2d0560a 100644 --- a/app/core/database.py +++ b/app/core/database.py @@ -33,6 +33,14 @@ def init_db(): ) ''') + # Создаем таблицу для хранения состояния приложения (ключ-значение) + cursor.execute(''' + CREATE TABLE IF NOT EXISTS app_state ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ) + ''') + # Проверяем, есть ли в chats тестовые данные cursor.execute("SELECT COUNT(*) FROM chats") if cursor.fetchone()[0] == 0: @@ -45,10 +53,9 @@ def add_session(login, access_token, refresh_token): """Добавляет новую сессию или обновляет существующую.""" conn = get_connection() cursor = conn.cursor() - # Сначала удаляем, потом вставляем, чтобы гарантировать обновление. - cursor.execute('DELETE FROM sessions WHERE login = ?', (login,)) + # REPLACE INTO - удобный способ для вставки или обновления cursor.execute(''' - INSERT INTO sessions (login, access_token, refresh_token, created_at) + INSERT OR REPLACE INTO sessions (login, access_token, refresh_token, created_at) VALUES (?, ?, ?, ?) ''', (login, access_token, refresh_token, datetime.now())) conn.commit() @@ -79,3 +86,20 @@ def delete_session(login: str): cursor.execute('DELETE FROM sessions WHERE login = ?', (login,)) conn.commit() conn.close() + +def get_last_login(): + """Получает логин последнего вошедшего пользователя.""" + conn = get_connection() + cursor = conn.cursor() + cursor.execute("SELECT value FROM app_state WHERE key = 'last_login'") + result = cursor.fetchone() + conn.close() + return result['value'] if result else None + +def set_last_login(login: str): + """Сохраняет логин последнего вошедшего пользователя.""" + conn = get_connection() + cursor = conn.cursor() + cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,)) + conn.commit() + conn.close()