2025-12-04 11:09:54 +03:00
|
|
|
|
from sqlalchemy import select
|
|
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
|
|
from database.models import User, LanguageLevel
|
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserService:
|
|
|
|
|
|
"""Сервис для работы с пользователями"""
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
async def get_or_create_user(session: AsyncSession, telegram_id: int, username: Optional[str] = None) -> User:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Получить пользователя или создать нового
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
session: Сессия базы данных
|
|
|
|
|
|
telegram_id: Telegram ID пользователя
|
|
|
|
|
|
username: Username пользователя
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
Объект пользователя
|
|
|
|
|
|
"""
|
|
|
|
|
|
# Попытка найти существующего пользователя
|
|
|
|
|
|
result = await session.execute(
|
|
|
|
|
|
select(User).where(User.telegram_id == telegram_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = result.scalar_one_or_none()
|
|
|
|
|
|
|
|
|
|
|
|
if user:
|
|
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
|
# Создание нового пользователя
|
|
|
|
|
|
new_user = User(
|
|
|
|
|
|
telegram_id=telegram_id,
|
|
|
|
|
|
username=username,
|
|
|
|
|
|
level=LanguageLevel.A1
|
|
|
|
|
|
)
|
|
|
|
|
|
session.add(new_user)
|
|
|
|
|
|
await session.commit()
|
|
|
|
|
|
await session.refresh(new_user)
|
|
|
|
|
|
|
|
|
|
|
|
return new_user
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
async def get_user_by_telegram_id(session: AsyncSession, telegram_id: int) -> Optional[User]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Получить пользователя по Telegram ID
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
session: Сессия базы данных
|
|
|
|
|
|
telegram_id: Telegram ID пользователя
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
Объект пользователя или None
|
|
|
|
|
|
"""
|
|
|
|
|
|
result = await session.execute(
|
|
|
|
|
|
select(User).where(User.telegram_id == telegram_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
return result.scalar_one_or_none()
|
2025-12-04 14:46:30 +03:00
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
async def update_user_level(session: AsyncSession, user_id: int, level: LanguageLevel):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Обновить уровень английского пользователя
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
session: Сессия базы данных
|
|
|
|
|
|
user_id: ID пользователя
|
|
|
|
|
|
level: Новый уровень
|
|
|
|
|
|
"""
|
|
|
|
|
|
result = await session.execute(
|
|
|
|
|
|
select(User).where(User.id == user_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = result.scalar_one_or_none()
|
|
|
|
|
|
|
|
|
|
|
|
if user:
|
|
|
|
|
|
user.level = level
|
|
|
|
|
|
await session.commit()
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
async def update_user_language(session: AsyncSession, user_id: int, language: str):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Обновить язык интерфейса пользователя
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
session: Сессия базы данных
|
|
|
|
|
|
user_id: ID пользователя
|
|
|
|
|
|
language: Новый язык (ru/en)
|
|
|
|
|
|
"""
|
|
|
|
|
|
result = await session.execute(
|
|
|
|
|
|
select(User).where(User.id == user_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = result.scalar_one_or_none()
|
|
|
|
|
|
|
|
|
|
|
|
if user:
|
|
|
|
|
|
user.language_interface = language
|
|
|
|
|
|
await session.commit()
|
2025-12-04 19:40:01 +03:00
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
async def update_user_learning_language(session: AsyncSession, user_id: int, language: str):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Обновить язык изучения пользователя
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
session: Сессия базы данных
|
|
|
|
|
|
user_id: ID пользователя
|
|
|
|
|
|
language: Новый язык изучения (ISO2)
|
|
|
|
|
|
"""
|
|
|
|
|
|
result = await session.execute(
|
|
|
|
|
|
select(User).where(User.id == user_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = result.scalar_one_or_none()
|
|
|
|
|
|
|
|
|
|
|
|
if user:
|
|
|
|
|
|
user.learning_language = language
|
|
|
|
|
|
await session.commit()
|