124 lines
4.1 KiB
Python
124 lines
4.1 KiB
Python
|
|
from sqlalchemy import select
|
|||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|||
|
|
from database.models import Vocabulary, WordSource, LanguageLevel
|
|||
|
|
from typing import List, Optional
|
|||
|
|
|
|||
|
|
|
|||
|
|
class VocabularyService:
|
|||
|
|
"""Сервис для работы со словарным запасом"""
|
|||
|
|
|
|||
|
|
@staticmethod
|
|||
|
|
async def add_word(
|
|||
|
|
session: AsyncSession,
|
|||
|
|
user_id: int,
|
|||
|
|
word_original: str,
|
|||
|
|
word_translation: str,
|
|||
|
|
transcription: Optional[str] = None,
|
|||
|
|
examples: Optional[dict] = None,
|
|||
|
|
category: Optional[str] = None,
|
|||
|
|
difficulty_level: Optional[str] = None,
|
|||
|
|
source: WordSource = WordSource.MANUAL,
|
|||
|
|
notes: Optional[str] = None
|
|||
|
|
) -> Vocabulary:
|
|||
|
|
"""
|
|||
|
|
Добавить слово в словарь пользователя
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
session: Сессия базы данных
|
|||
|
|
user_id: ID пользователя
|
|||
|
|
word_original: Оригинальное слово
|
|||
|
|
word_translation: Перевод
|
|||
|
|
transcription: Транскрипция
|
|||
|
|
examples: Примеры использования
|
|||
|
|
category: Категория слова
|
|||
|
|
difficulty_level: Уровень сложности
|
|||
|
|
source: Источник добавления
|
|||
|
|
notes: Заметки пользователя
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
Созданный объект слова
|
|||
|
|
"""
|
|||
|
|
# Преобразование difficulty_level в enum
|
|||
|
|
difficulty_enum = None
|
|||
|
|
if difficulty_level:
|
|||
|
|
try:
|
|||
|
|
difficulty_enum = LanguageLevel[difficulty_level]
|
|||
|
|
except KeyError:
|
|||
|
|
difficulty_enum = None
|
|||
|
|
|
|||
|
|
new_word = Vocabulary(
|
|||
|
|
user_id=user_id,
|
|||
|
|
word_original=word_original,
|
|||
|
|
word_translation=word_translation,
|
|||
|
|
transcription=transcription,
|
|||
|
|
examples=examples,
|
|||
|
|
category=category,
|
|||
|
|
difficulty_level=difficulty_enum,
|
|||
|
|
source=source,
|
|||
|
|
notes=notes
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
session.add(new_word)
|
|||
|
|
await session.commit()
|
|||
|
|
await session.refresh(new_word)
|
|||
|
|
|
|||
|
|
return new_word
|
|||
|
|
|
|||
|
|
@staticmethod
|
|||
|
|
async def get_user_words(session: AsyncSession, user_id: int, limit: int = 50) -> List[Vocabulary]:
|
|||
|
|
"""
|
|||
|
|
Получить все слова пользователя
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
session: Сессия базы данных
|
|||
|
|
user_id: ID пользователя
|
|||
|
|
limit: Максимальное количество слов
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
Список слов пользователя
|
|||
|
|
"""
|
|||
|
|
result = await session.execute(
|
|||
|
|
select(Vocabulary)
|
|||
|
|
.where(Vocabulary.user_id == user_id)
|
|||
|
|
.order_by(Vocabulary.created_at.desc())
|
|||
|
|
.limit(limit)
|
|||
|
|
)
|
|||
|
|
return list(result.scalars().all())
|
|||
|
|
|
|||
|
|
@staticmethod
|
|||
|
|
async def get_words_count(session: AsyncSession, user_id: int) -> int:
|
|||
|
|
"""
|
|||
|
|
Получить количество слов в словаре пользователя
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
session: Сессия базы данных
|
|||
|
|
user_id: ID пользователя
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
Количество слов
|
|||
|
|
"""
|
|||
|
|
result = await session.execute(
|
|||
|
|
select(Vocabulary).where(Vocabulary.user_id == user_id)
|
|||
|
|
)
|
|||
|
|
return len(list(result.scalars().all()))
|
|||
|
|
|
|||
|
|
@staticmethod
|
|||
|
|
async def find_word(session: AsyncSession, user_id: int, word: str) -> Optional[Vocabulary]:
|
|||
|
|
"""
|
|||
|
|
Найти слово в словаре пользователя
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
session: Сессия базы данных
|
|||
|
|
user_id: ID пользователя
|
|||
|
|
word: Слово для поиска
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
Объект слова или None
|
|||
|
|
"""
|
|||
|
|
result = await session.execute(
|
|||
|
|
select(Vocabulary)
|
|||
|
|
.where(Vocabulary.user_id == user_id)
|
|||
|
|
.where(Vocabulary.word_original.ilike(f"%{word}%"))
|
|||
|
|
)
|
|||
|
|
return result.scalar_one_or_none()
|