From f0f3b9600524e32f685729bb572c49d1ae820fb8 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 23 Nov 2025 17:45:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=87=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes/__init__.py | 4 +-- app/routes/user_routes.py | 49 ++++++++++++++++++++++++++++++------ app/services/db_manager.py | 6 ++++- app/services/postgres_rep.py | 37 +++++++++++++++++++++++++++ instance/config.py | 42 +++++++++++++++++++++++++++++++ main.py | 18 ++++++++++--- 6 files changed, 142 insertions(+), 14 deletions(-) diff --git a/app/routes/__init__.py b/app/routes/__init__.py index eabe4cd..0ae7429 100644 --- a/app/routes/__init__.py +++ b/app/routes/__init__.py @@ -1,6 +1,6 @@ #from .payment_routes import router as payment_router -from .user_routes import router as user_router +from .user_routes import router from .subscription_routes import router as subscription_router from .support_routes import router as sup_router # Экспорт всех маршрутов -__all__ = [ "user_router", "subscription_router","sup_router"] +__all__ = [ "router", "subscription_router","sup_router"] diff --git a/app/routes/user_routes.py b/app/routes/user_routes.py index cd5ca4f..0712ee7 100644 --- a/app/routes/user_routes.py +++ b/app/routes/user_routes.py @@ -1,3 +1,4 @@ +import sys from fastapi import APIRouter, Depends, HTTPException from fastapi.exceptions import HTTPException from app.services.db_manager import DatabaseManager @@ -9,8 +10,12 @@ from uuid import UUID import logging logger = logging.getLogger(__name__) -router = APIRouter() - +if not logger.handlers: + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + logger.propagate = False router = APIRouter() # Модели запросов и ответов @@ -27,6 +32,8 @@ class UserResponse(BaseModel): created_at: str updated_at: str +class AddReferal(BaseModel): + new_user_id: str @router.post("/user/create", response_model=UserResponse, summary="Создать пользователя") async def create_user( @@ -64,15 +71,14 @@ async def get_user( Получение информации о пользователе. """ try: - logger.info(f"Получение пользователя с telegram_id: {telegram_id}") + print(f"Получение пользователя с telegram_id: {telegram_id}") user = await db_manager.get_user_by_telegram_id(telegram_id) if not user: logger.warning(f"Пользователь с telegram_id {telegram_id} не найден.") raise HTTPException(status_code=404, detail="User not found") - logger.info(f"Пользователь найден: ID={user.id}, Username={user.username}") - - return UserResponse( + print(f"Пользователь найден: ID={user.id}, Username={user.username}") + user_response = UserResponse( id=user.id, telegram_id=user.telegram_id, username=user.username, @@ -81,7 +87,6 @@ async def get_user( created_at=user.created_at.isoformat(), updated_at=user.updated_at.isoformat() ) - logger.debug(f"Формирование ответа для пользователя: {user_response}") return user_response @@ -167,3 +172,33 @@ async def last_transactions( except Exception as e: logger.exception(f"Неожиданная ошибка для {user_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) + + + +@router.post("/user/{referrer_id}/add_referral", summary="Обновить баланс") +async def add_referal( + referrer_id: str, + request: AddReferal, + db_manager: DatabaseManager = Depends(get_database_manager) +): + """ + Обновляет баланс пользователя. + """ + logger.info(f"Получен запрос на добавление реферала: telegram_id={referrer_id}") + try: + result = await db_manager.add_referal(referrer_id) + if result == "ERROR": + logger.error(f"Ошибка добавления реферала для {referrer_id} c айди {request.new_user_id}") + raise HTTPException(status_code=500, detail="Failed to update balance") + + logger.info(f"Добавлен реферал для {referrer_id} c айди {request.new_user_id}") + return {"message": "Balance updated successfully"} + except HTTPException as http_ex: + logger.warning(f"HTTP ошибка: {http_ex.detail}") + raise http_ex + except SQLAlchemyError as db_ex: + logger.error(f"Ошибка базы данных при добавлении рефералу {referrer_id}: {db_ex}") + 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)) \ No newline at end of file diff --git a/app/services/db_manager.py b/app/services/db_manager.py index f483f65..6b8dc80 100644 --- a/app/services/db_manager.py +++ b/app/services/db_manager.py @@ -54,7 +54,11 @@ class DatabaseManager: transaction_type="default" ) return await self.postgres_repo.add_record(tran) - + async def add_referal(self,referrer_id: str, new_user_id: str): + """ + Добавление рефералу пользователей + """ + return await self.postgres_repo.add_referal(referrer_id,new_user_id) async def get_transaction(self, user_id: UUID, limit: int = 10): """ Возвращает транзакции. diff --git a/app/services/postgres_rep.py b/app/services/postgres_rep.py index f5ebd9e..c561655 100644 --- a/app/services/postgres_rep.py +++ b/app/services/postgres_rep.py @@ -4,6 +4,7 @@ from sqlalchemy.future import select from sqlalchemy.exc import SQLAlchemyError from decimal import Decimal from sqlalchemy import asc, desc, update +from sqlalchemy.orm import joinedload from instance.model import TicketMessage, User, Subscription, Transaction,SupportTicket @@ -219,3 +220,39 @@ class PostgresRepository: self.logger.error(f"Ошибка обновления статуса тикета {ticket_id}: {e}") await session.rollback() return "ERROR" + + async def add_referal(self,referrer_id: str, referral_id:str): + """ + Добавление рефералу пользователей + """ + async for session in self.session_generator(): + try: + referrer = await session.execute( + select(User) + .where(User.id == referrer_id) + .options(joinedload(User.referrals)) # Загрузка связанных объектов + ) + referrer = referrer.scalars().first() + if not referrer: + raise ValueError("Referrer not found") + + # Проверить, существует ли уже такой реферал + existing_referrals = [ref.id for ref in referrer.referrals] + if referrer_id in existing_referrals: + raise ValueError("Referral already exists") + + # Найти реферала + referral = await session.execute( + select(User).where(User.id == referral_id) + ) + referral = referral.scalars().first() + + if not referral: + raise ValueError("Referral user not found") + + # Добавить реферала в список + referrer.referrals.append(referral) + await session.commit() + except Exception as e: + self.logger(f"Ошибка при добавлении рефералу пользователей") + diff --git a/instance/config.py b/instance/config.py index e69de29..18c3dca 100644 --- a/instance/config.py +++ b/instance/config.py @@ -0,0 +1,42 @@ +import logging +import sys + +def setup_logging(): + # Очистка существующих обработчиков + for handler in logging.root.handlers[:]: + logging.root.removeHandler(handler) + + # Настройка формата + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + # Обработчик для вывода в консоль + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(formatter) + + # Установка уровня для корневого логгера + logging.basicConfig( + level=logging.INFO, + handlers=[console_handler], + force=True # Перезаписать существующие настройки + ) + + # Установка уровня для конкретных логгеров + loggers = [ + 'app.routes', + 'app.services', + 'main', + '__main__' + ] + + for logger_name in loggers: + logger = logging.getLogger(logger_name) + logger.setLevel(logging.INFO) + # Удаляем существующие обработчики + for handler in logger.handlers[:]: + logger.removeHandler(handler) + # Добавляем наш обработчик + logger.addHandler(console_handler) + # Запрещаем передачу родительским логгерам + logger.propagate = False \ No newline at end of file diff --git a/main.py b/main.py index e3e4926..a279468 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,25 @@ +import sys from fastapi import FastAPI +from instance.config import setup_logging +import logging + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[logging.StreamHandler(sys.stdout)], + force=True +) + + from instance.configdb import init_postgresql, init_mongodb, close_connections from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger -from app.routes import user_router, subscription_router, sup_router +from app.routes import router, subscription_router, sup_router from app.services.db_manager import DatabaseManager from instance.configdb import get_postgres_session from app.services.mongo_rep import MongoDBRepository from app.services.xui_rep import PanelInteraction -import logging -logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI() @@ -88,7 +98,7 @@ async def shutdown(): except Exception as e: logger.error(f"Ошибка при закрытии соединений: {e}") -app.include_router(user_router, prefix="/api") +app.include_router(router, prefix="/api") #app.include_router(payment_router, prefix="/api") app.include_router(subscription_router, prefix="/api") app.include_router(sup_router, prefix="/api")