diff --git a/app/routes/user_routes.py b/app/routes/user_routes.py index c5ab3ae..67ad455 100644 --- a/app/routes/user_routes.py +++ b/app/routes/user_routes.py @@ -170,4 +170,27 @@ async def add_referal( raise HTTPException(status_code=500, detail="Database error") except Exception as e: logger.exception(f"Неожиданная ошибка при добавлении рефералу {referrer_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/user/{telegram_id}/referrals", summary="Получить колво рефералов") +async def get_referral_count( + telegram_id: int, + db_manager: DatabaseManager = Depends(get_database_manager) +): + try: + result = await db_manager.get_referrals_count(telegram_id) + if result == "ERROR": + logger.error(f"Ошибка получения рефералов для пользователя: {telegram_id}") + raise HTTPException(status_code=500, detail="Failed to get referrals") + logger.info(f"Количество приглашённых {result}") + return {"invited_count": result} + except HTTPException as http_ex: + logger.warning(f"HTTP ошибка: {http_ex.detail}") + raise http_ex + except SQLAlchemyError as db_ex: + logger.error(f"Ошибка базы данных при получении рефералов пользователя {telegram_id}: {db_ex}") + raise HTTPException(status_code=500, detail="Database error") + except Exception as e: + logger.exception(f"Неожиданная ошибка при получении рефералов {telegram_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/app/services/db_manager.py b/app/services/db_manager.py index 14c8fe0..23541dd 100644 --- a/app/services/db_manager.py +++ b/app/services/db_manager.py @@ -61,6 +61,18 @@ class DatabaseManager: """ return await self.postgres_repo.get_last_transactions(telegram_id, limit) + async def get_referrals_count(self,telegram_id: int) -> int: + """ + Docstring for get_referrals_count + + :param self: Description + :param telegram_id: Description + :type telegram_id: int + :return: Description + :rtype: int + """ + return await self.postgres_repo.get_referrals_count(telegram_id) + # async def update_balance(self, telegram_id: int, amount: float): # """ # Обновляет баланс пользователя и добавляет транзакцию. diff --git a/app/services/postgres_rep.py b/app/services/postgres_rep.py index d36d371..d5431a4 100644 --- a/app/services/postgres_rep.py +++ b/app/services/postgres_rep.py @@ -277,4 +277,24 @@ class PostgresRepository: except SQLAlchemyError as e: self.logger.error(f"Ошибка при поиске плана: {plan_id}: {e}") await session.rollback() - return None \ No newline at end of file + return None + + async def get_referrals_count(self, user_telegram_id: int) -> int: + """ + Получить количество рефералов пользователя. + + :param user_telegram_id: Telegram ID пользователя-пригласителя + :return: Количество рефералов + """ + async for session in self.session_generator(): + try: + result = await session.execute( + select(Referral) + .where(Referral.inviter_id == user_telegram_id) + ) + referrals = result.scalars().all() + return len(referrals) + except SQLAlchemyError as e: + self.logger.error(f"Ошибка при получении количества рефералов для пользователя {user_telegram_id}: {e}") + return 0 + \ No newline at end of file