131 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import sqlite3
 | 
						||
import aiosqlite
 | 
						||
import os
 | 
						||
from datetime import datetime
 | 
						||
 | 
						||
DB_PATH = "messenger.db"
 | 
						||
 | 
						||
def get_connection():
 | 
						||
    """Получает соединение с базой данных."""
 | 
						||
    conn = sqlite3.connect(DB_PATH)
 | 
						||
    conn.row_factory = sqlite3.Row # Для доступа к колонкам по имени
 | 
						||
    return conn
 | 
						||
 | 
						||
def init_db():
 | 
						||
    """Инициализирует базу данных и создает таблицы, если они не существуют."""
 | 
						||
    conn = get_connection()
 | 
						||
    cursor = conn.cursor()
 | 
						||
 | 
						||
    # Создаем таблицу для чатов (если ее нет)
 | 
						||
    cursor.execute('''
 | 
						||
        CREATE TABLE IF NOT EXISTS chats (
 | 
						||
            id INTEGER PRIMARY KEY AUTOINCREMENT,
 | 
						||
            title TEXT NOT NULL
 | 
						||
        )
 | 
						||
    ''')
 | 
						||
 | 
						||
    # Создаем таблицу для сессий
 | 
						||
    cursor.execute('''
 | 
						||
        CREATE TABLE IF NOT EXISTS sessions (
 | 
						||
            login TEXT PRIMARY KEY,
 | 
						||
            access_token TEXT NOT NULL,
 | 
						||
            refresh_token TEXT NOT NULL,
 | 
						||
            created_at TIMESTAMP NOT NULL
 | 
						||
        )
 | 
						||
    ''')
 | 
						||
 | 
						||
    # Создаем таблицу для хранения состояния приложения (ключ-значение)
 | 
						||
    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:
 | 
						||
        cursor.execute('INSERT INTO chats (title) VALUES (?)', ("Чат с Alice",))
 | 
						||
 | 
						||
    conn.commit()
 | 
						||
    conn.close()
 | 
						||
 | 
						||
def add_session(login, access_token, refresh_token):
 | 
						||
    """Добавляет новую сессию или обновляет существующую."""
 | 
						||
    conn = get_connection()
 | 
						||
    cursor = conn.cursor()
 | 
						||
    # REPLACE INTO - удобный способ для вставки или обновления
 | 
						||
    cursor.execute('''
 | 
						||
        INSERT OR REPLACE INTO sessions (login, access_token, refresh_token, created_at)
 | 
						||
        VALUES (?, ?, ?, ?)
 | 
						||
    ''', (login, access_token, refresh_token, datetime.now()))
 | 
						||
    conn.commit()
 | 
						||
    conn.close()
 | 
						||
 | 
						||
def get_session(login: str):
 | 
						||
    """Получает сессию по логину."""
 | 
						||
    conn = get_connection()
 | 
						||
    cursor = conn.cursor()
 | 
						||
    cursor.execute('SELECT * FROM sessions WHERE login = ?', (login,))
 | 
						||
    session = cursor.fetchone()
 | 
						||
    conn.close()
 | 
						||
    return session
 | 
						||
 | 
						||
def get_all_sessions():
 | 
						||
    """Получает все сессии, отсортированные по дате создания (сначала новые)."""
 | 
						||
    conn = get_connection()
 | 
						||
    cursor = conn.cursor()
 | 
						||
    cursor.execute('SELECT * FROM sessions ORDER BY created_at DESC')
 | 
						||
    sessions = cursor.fetchall()
 | 
						||
    conn.close()
 | 
						||
    return sessions
 | 
						||
 | 
						||
def delete_session(login: str):
 | 
						||
    """Удаляет сессию по логину."""
 | 
						||
    conn = get_connection()
 | 
						||
    cursor = conn.cursor()
 | 
						||
    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()
 | 
						||
 | 
						||
# 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
 | 
						||
 | 
						||
async def get_current_access_token():
 | 
						||
    async with aiosqlite.connect(DB_PATH) as db:
 | 
						||
        db.row_factory = aiosqlite.Row
 | 
						||
        async with db.execute("SELECT value FROM app_state WHERE key = 'last_login'") as cur:
 | 
						||
            row = await cur.fetchone()
 | 
						||
            if not row:
 | 
						||
                return None
 | 
						||
            last_login = row[0]
 | 
						||
        async with db.execute('SELECT access_token FROM sessions WHERE login = ?', (last_login,)) as cur:
 | 
						||
            row = await cur.fetchone()
 | 
						||
            return row[0] if row else None
 |