Add new table and middleware

This commit is contained in:
Zakhar Izmaylov
2024-11-17 14:05:31 +03:00
parent 755f871251
commit 09251f1e9e
3 changed files with 91 additions and 0 deletions
+59
View File
@@ -9,6 +9,22 @@ from logger import logger
async def init_db():
conn = await asyncpg.connect(DATABASE_URL)
# Таблица для хранения основной информации о пользователях из Telegram
await conn.execute(
"""
CREATE TABLE IF NOT EXISTS users (
tg_id BIGINT PRIMARY KEY NOT NULL,
username TEXT,
first_name TEXT,
last_name TEXT,
language_code TEXT,
is_bot BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
)
"""
)
# Таблица для хранения информации о пользователях
await conn.execute(
"""
@@ -420,3 +436,46 @@ async def get_tg_id_by_client_id(client_id: str):
return result["tg_id"] if result else None
finally:
await conn.close()
async def upsert_user(tg_id: int, username: str = None, first_name: str = None, last_name: str = None, language_code: str = None, is_bot: bool = False):
"""
Создает или обновляет информацию о пользователе в базе данных.
Args:
tg_id (int): Уникальный идентификатор пользователя в Telegram
username (str, optional): Никнейм пользователя
first_name (str, optional): Имя пользователя
last_name (str, optional): Фамилия пользователя
language_code (str, optional): Код языка пользователя
is_bot (bool, optional): Флаг, указывающий является ли пользователь ботом
"""
conn = await asyncpg.connect(DATABASE_URL)
try:
await conn.execute(
"""
INSERT INTO users (tg_id, username, first_name, last_name, language_code, is_bot, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
ON CONFLICT (tg_id) DO UPDATE
SET
username = COALESCE(EXCLUDED.username, users.username),
first_name = COALESCE(EXCLUDED.first_name, users.first_name),
last_name = COALESCE(EXCLUDED.last_name, users.last_name),
language_code = COALESCE(EXCLUDED.language_code, users.language_code),
is_bot = EXCLUDED.is_bot,
updated_at = CURRENT_TIMESTAMP
""",
tg_id, username, first_name, last_name, language_code, is_bot
)
# Создаем запись в connections, если ее еще нет
await conn.execute(
"""
INSERT INTO connections (tg_id, balance, trial)
VALUES ($1, 0.0, 0)
ON CONFLICT (tg_id) DO NOTHING
""",
tg_id
)
finally:
await conn.close()