From 7c1d27fc8a4a2c841a87b84795177a42e8ac72ae Mon Sep 17 00:00:00 2001 From: gnatykdm Date: Tue, 1 Jul 2025 18:03:30 +0200 Subject: [PATCH] DB-Connection C:1 --- telegram_bot_project/.example.env | 2 +- telegram_bot_project/bot/commands.py | 9 +++-- telegram_bot_project/config.py | 17 ++++++++- telegram_bot_project/service/__init__.py | 0 telegram_bot_project/service/user.py | 45 ++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 telegram_bot_project/service/__init__.py create mode 100644 telegram_bot_project/service/user.py diff --git a/telegram_bot_project/.example.env b/telegram_bot_project/.example.env index 2c2d805..5731708 100644 --- a/telegram_bot_project/.example.env +++ b/telegram_bot_project/.example.env @@ -1,2 +1,2 @@ BOT_TOKEN=TELEGRAM_BOT_TOKEN -DATABASE_URL=db_driver://username:password@host:port/db_username \ No newline at end of file +DATABASE_URL=db_driver+asyncpg://username:password@host:port/db_username \ No newline at end of file diff --git a/telegram_bot_project/bot/commands.py b/telegram_bot_project/bot/commands.py index a3e2bcb..b12f32a 100644 --- a/telegram_bot_project/bot/commands.py +++ b/telegram_bot_project/bot/commands.py @@ -2,6 +2,7 @@ from aiogram.types import Message from messages import * +from service.user import UserService # Start Command Handler async def start_command(message: Message)-> None: @@ -10,8 +11,12 @@ async def start_command(message: Message)-> None: user_name: str = message.from_user.username print(f"--[INFO] - User {user_id} ({user_name}) - started the bot") - - await message.answer(START_MSG) + user_find: int = await UserService.get_user_by_id(user_id) + if user_find: + await message.answer(START_MSG_AGAIN) + else: + await UserService.create_user(user_id, user_name) + await message.answer(START_MSG) # Help Command Handler async def help_command(message: Message) -> None: diff --git a/telegram_bot_project/config.py b/telegram_bot_project/config.py index ebeced1..2112671 100644 --- a/telegram_bot_project/config.py +++ b/telegram_bot_project/config.py @@ -1,9 +1,24 @@ import os from dotenv import load_dotenv +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker load_dotenv() TOKEN: str = os.getenv("BOT_TOKEN") +DB_URL: str = os.getenv("DATABASE_URL") + +engine = create_async_engine(DB_URL, echo=True) + +async_session = sessionmaker( + engine, + expire_on_commit=False, + class_=AsyncSession +) def get_token() -> str: - return TOKEN \ No newline at end of file + return TOKEN + +async def get_session() -> AsyncSession: + async with async_session() as session: + yield session diff --git a/telegram_bot_project/service/__init__.py b/telegram_bot_project/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/telegram_bot_project/service/user.py b/telegram_bot_project/service/user.py new file mode 100644 index 0000000..7ad18b6 --- /dev/null +++ b/telegram_bot_project/service/user.py @@ -0,0 +1,45 @@ +from sqlalchemy import text +from config import get_session + +class UserService: + @staticmethod + async def create_user(user_id: int, user_name: str, language: str = "ENGLISH") -> int: + async for session in get_session(): + result = await session.execute( + text(""" + INSERT INTO users (id, user_name, language) + VALUES (:id, :user_name, :language) + RETURNING id + """), + {"id": user_id, "user_name": user_name, "language": language} + ) + await session.commit() + inserted_id = result.scalar_one() + return inserted_id + return None + + @staticmethod + async def get_user_by_id(user_id: int): + async for session in get_session(): + result = await session.execute( + text("SELECT * FROM users WHERE id = :id"), + {"id": user_id} + ) + row = result.first() + return dict(row._mapping) if row else None + return None + + @staticmethod + async def update_user_language(user_id: int, new_language: str) -> bool: + async for session in get_session(): + result = await session.execute( + text(""" + UPDATE users + SET language = :language + WHERE id = :id + """), + {"language": new_language, "id": user_id} + ) + await session.commit() + return result.rowcount == 1 + return None