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
|