diff --git a/backend/src/application/use_cases/document_use_cases.py b/backend/src/application/use_cases/document_use_cases.py index cd984bb..f5356c2 100644 --- a/backend/src/application/use_cases/document_use_cases.py +++ b/backend/src/application/use_cases/document_use_cases.py @@ -3,6 +3,7 @@ Use cases для работы с документами """ from uuid import UUID from typing import BinaryIO, Optional +import httpx from src.domain.entities.document import Document from src.domain.repositories.document_repository import IDocumentRepository from src.domain.repositories.collection_repository import ICollectionRepository @@ -10,6 +11,7 @@ from src.domain.repositories.collection_access_repository import ICollectionAcce from src.application.services.document_parser_service import DocumentParserService from src.application.services.rag_service import RAGService from src.shared.exceptions import NotFoundError, ForbiddenError +from src.shared.config import settings class DocumentUseCases: @@ -60,12 +62,34 @@ class DocumentUseCases: ) return await self.document_repository.create(document) + async def _send_telegram_notification(self, telegram_id: str, message: str): + """Отправить уведомление пользователю через Telegram Bot API""" + if not settings.TELEGRAM_BOT_TOKEN: + return + + try: + url = f"https://api.telegram.org/bot{settings.TELEGRAM_BOT_TOKEN}/sendMessage" + async with httpx.AsyncClient(timeout=5.0) as client: + response = await client.post( + url, + json={ + "chat_id": telegram_id, + "text": message, + "parse_mode": "HTML" + } + ) + if response.status_code != 200: + print(f"Failed to send Telegram notification: {response.status_code}") + except Exception as e: + print(f"Error sending Telegram notification: {e}") + async def upload_and_parse_document( self, collection_id: UUID, file: BinaryIO, filename: str, - user_id: UUID + user_id: UUID, + telegram_id: Optional[str] = None ) -> Document: """Загрузить и распарсить документ, затем автоматически проиндексировать""" collection = await self.collection_repository.get_by_id(collection_id) @@ -86,11 +110,33 @@ class DocumentUseCases: ) document = await self.document_repository.create(document) - if self.rag_service: + if self.rag_service and telegram_id: try: - await self.rag_service.index_document(document) + await self._send_telegram_notification( + telegram_id, + "🔄 Начинаю индексацию документа...\n\n" + f"Документ: {title}\n" + "Это может занять некоторое время." + ) + + chunks = await self.rag_service.index_document(document) + + await self._send_telegram_notification( + telegram_id, + "✅ Индексация завершена!\n\n" + f"Документ: {title}\n" + f"Проиндексировано чанков: {len(chunks)}\n\n" + "Теперь вы можете задавать вопросы по этому документу." + ) except Exception as e: print(f"Ошибка при автоматической индексации документа {document.document_id}: {e}") + if telegram_id: + await self._send_telegram_notification( + telegram_id, + "⚠️ Ошибка при индексации\n\n" + f"Документ загружен, но индексация не завершена.\n" + f"Ошибка: {str(e)[:200]}" + ) return document diff --git a/backend/src/presentation/api/v1/documents.py b/backend/src/presentation/api/v1/documents.py index a013850..5955b9f 100644 --- a/backend/src/presentation/api/v1/documents.py +++ b/backend/src/presentation/api/v1/documents.py @@ -69,7 +69,8 @@ async def upload_document( collection_id=collection_id, file=file.file, filename=file.filename, - user_id=current_user.user_id + user_id=current_user.user_id, + telegram_id=current_user.telegram_id ) return DocumentResponse.from_entity(document) diff --git a/tg_bot/infrastructure/telegram/handlers/document_handler.py b/tg_bot/infrastructure/telegram/handlers/document_handler.py index 824e379..a5f0818 100644 --- a/tg_bot/infrastructure/telegram/handlers/document_handler.py +++ b/tg_bot/infrastructure/telegram/handlers/document_handler.py @@ -360,8 +360,9 @@ async def process_upload_document(message: Message, state: FSMContext): if result: await message.answer( - f"Документ загружен\n\n" - f"Название: {result.get('title', filename)}", + f"✅ Документ загружен и добавлен в коллекцию\n\n" + f"Название: {result.get('title', filename)}\n\n" + f"📄 Документ сейчас индексируется. Вы получите уведомление, когда индексация завершится.\n\n", parse_mode="HTML" ) else: