add autologin
This commit is contained in:
parent
b711734a68
commit
4276b147f2
@ -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,12 +17,17 @@ 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")
|
self.show_login()
|
||||||
else:
|
|
||||||
self.show_login()
|
|
||||||
|
|
||||||
def show_login(self):
|
def show_login(self):
|
||||||
self.login_view = LoginView(on_login=self.handle_login_success)
|
self.login_view = LoginView(on_login=self.handle_login_success)
|
||||||
@ -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()
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user