desktop_app/app/core/database.py
2025-09-30 02:09:37 +03:00

146 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
user_id TEXT NOT NULL,
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(access_token, refresh_token,login=None, user_id=None, update_existing=False, old_access_token=None, old_refresh_token=None):
"""Добавляет новую сессию или обновляет существующую."""
conn = get_connection()
cursor = conn.cursor()
#print("ffff", login, access_token, refresh_token, user_id, update_existing)
if update_existing:
# Обновляем существующую сессию по access_token
cursor.execute('''
UPDATE sessions
SET access_token = ?, refresh_token = ?
WHERE access_token = ? AND refresh_token = ?
''', (access_token, refresh_token, old_access_token, old_refresh_token))
else:
# Вставляем новую или заменяем существующую по логину
cursor.execute('''
INSERT OR REPLACE INTO sessions (login, user_id, access_token, refresh_token, created_at)
VALUES (?, ?, ?, ?, ?)
''', (login, user_id, access_token, refresh_token, datetime.now()))
conn.commit()
conn.close()
def logout(access_token: str):
"""Удаляет сессию по токену доступа."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute('DELETE FROM sessions WHERE access_token = ?', (access_token,))
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 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