import logging
from typing import Any, Dict
from aiogram_dialog import DialogManager
from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.ext.asyncio import AsyncSession
from shopbot.bot.database.db import async_session
from shopbot.bot.database.models import UserModel
RESULT_MESSAGES = {
"not_enough_funds": "❌ Недостаточно средств на балансе пользователя!",
"not_found": "❌ Пользователь не найден!",
"no_user_id_or_amount": "❌ Не указаны ID пользователя или сумма!",
"invalid_user_id_or_amount": "❌ Некорректный ID пользователя или сумма!",
"balance_increased": "✅ Баланс пользователя {username} пополнен на {amount:.2f}₽!",
"balance_decreased": "✅ Баланс пользователя {username} уменьшен на {amount:.2f}₽!",
}
async def _get_user_and_validate(
session: AsyncSession, user_id: str, amount: str
) -> Dict[str, Any]:
if not user_id or not amount:
return {"result": RESULT_MESSAGES["no_user_id_or_amount"]}
try:
user_id = int(user_id)
amount = float(amount)
except ValueError:
return {"result": RESULT_MESSAGES["invalid_user_id_or_amount"]}
try:
user = await session.scalar(select(UserModel).where(UserModel.tg_id == user_id))
if not user:
logging.warning(f"User with tg_id {user_id} not found.")
return {"result": RESULT_MESSAGES["not_found"]}
return {"user": user, "amount": amount}
except SQLAlchemyError as e:
logging.error(f"Database error: {e}", exc_info=True)
return {"result": "❌ Произошла ошибка при работе с базой данных."}
except Exception as e:
logging.error(f"An unexpected error occurred: {e}", exc_info=True)
return {"result": "❌ Произошла непредвиденная ошибка."}
async def take_balance_user(dialog_manager: DialogManager, **kwargs) -> Dict[str, str]:
user_id = dialog_manager.find("user_id_input").get_value()
amount = dialog_manager.find("amount_input").get_value()
async with async_session() as session:
user_data = await _get_user_and_validate(session, user_id, amount)
if "result" in user_data:
return user_data
user = user_data["user"]
amount = user_data["amount"]
try:
if user.balance >= amount:
user.balance -= amount
await session.commit()
return {
"result": RESULT_MESSAGES["balance_decreased"].format(
username=user.username, amount=amount
)
}
else:
return {"result": RESULT_MESSAGES["not_enough_funds"]}
except SQLAlchemyError as e:
logging.error(f"Database error: {e}", exc_info=True)
return {"result": "❌ Произошла ошибка при работе с базой данных."}
except Exception as e:
logging.error(f"An unexpected error occurred: {e}", exc_info=True)
return {"result": "❌ Произошла непредвиденная ошибка."}
async def gift_balance_data(dialog_manager: DialogManager, **kwargs) -> Dict[str, str]:
user_id = dialog_manager.find("user_id_input").get_value()
amount = dialog_manager.find("amount_input").get_value()
async with async_session() as session:
user_data = await _get_user_and_validate(session, user_id, amount)
if "result" in user_data:
return user_data
user = user_data["user"]
amount = user_data["amount"]
try:
user.balance += amount
await session.commit()
return {
"result": RESULT_MESSAGES["balance_increased"].format(
username=user.username, amount=amount
)
}
except SQLAlchemyError as e:
logging.error(f"Database error: {e}", exc_info=True)
return {"result": "❌ Произошла ошибка при работе с базой данных."}
except Exception as e:
logging.error(f"An unexpected error occurred: {e}", exc_info=True)
return {"result": "❌ Произошла непредвиденная ошибка."}