add autologin

This commit is contained in:
unknown 2025-09-26 03:42:57 +03:00
parent b711734a68
commit 4276b147f2
2 changed files with 44 additions and 8 deletions

View File

@ -6,6 +6,7 @@ from app.core.models.mock_data import get_mock_chats # ← заглушка
from typing import Optional from typing import Optional
from threading import Thread from threading import Thread
import time # эмуляция задержки от сервера import time # эмуляция задержки от сервера
from app.core.database import get_last_login, get_session, set_last_login
class MainController(QStackedWidget): class MainController(QStackedWidget):
def __init__(self): def __init__(self):
@ -16,11 +17,16 @@ class MainController(QStackedWidget):
self.init_app() self.init_app()
def init_app(self): 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): def show_login(self):
@ -30,8 +36,14 @@ class MainController(QStackedWidget):
self.login_view.show() self.login_view.show()
def handle_login_success(self, username: str): def handle_login_success(self, username: str):
"""Обрабатывает успешный вход в систему."""
# Сохраняем пользователя как последнего вошедшего
set_last_login(username)
if self.login_view: if self.login_view:
self.login_view.close() self.login_view.close()
self.removeWidget(self.login_view)
self.login_view = None
# 🔹 1. Загружаем чаты локально # 🔹 1. Загружаем чаты локально
chat_items: list[PrivateChatListItem] = self.load_local_chats() chat_items: list[PrivateChatListItem] = self.load_local_chats()

View File

@ -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 тестовые данные # Проверяем, есть ли в chats тестовые данные
cursor.execute("SELECT COUNT(*) FROM chats") cursor.execute("SELECT COUNT(*) FROM chats")
if cursor.fetchone()[0] == 0: if cursor.fetchone()[0] == 0:
@ -45,10 +53,9 @@ def add_session(login, access_token, refresh_token):
"""Добавляет новую сессию или обновляет существующую.""" """Добавляет новую сессию или обновляет существующую."""
conn = get_connection() conn = get_connection()
cursor = conn.cursor() cursor = conn.cursor()
# Сначала удаляем, потом вставляем, чтобы гарантировать обновление. # REPLACE INTO - удобный способ для вставки или обновления
cursor.execute('DELETE FROM sessions WHERE login = ?', (login,))
cursor.execute(''' 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 (?, ?, ?, ?) VALUES (?, ?, ?, ?)
''', (login, access_token, refresh_token, datetime.now())) ''', (login, access_token, refresh_token, datetime.now()))
conn.commit() conn.commit()
@ -79,3 +86,20 @@ def delete_session(login: str):
cursor.execute('DELETE FROM sessions WHERE login = ?', (login,)) cursor.execute('DELETE FROM sessions WHERE login = ?', (login,))
conn.commit() conn.commit()
conn.close() 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()