From 6d6b8832cf5e9dd683c85270c592d1fb7c22101c Mon Sep 17 00:00:00 2001 From: Disledg Date: Sat, 18 Jan 2025 15:48:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=8D=D0=BD=D0=B4=D0=BF=D0=BE=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=20=D0=91=D0=94=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=B4=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8=20telegram=5Fid(=D1=81?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D1=82=D0=B8=D0=BF=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=20=D0=B8=D0=BD=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=B8=D0=BD=D0=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes/payment_routes.py | 2 +- app/routes/subscription_routes.py | 4 ++-- app/routes/user_routes.py | 12 +++++++----- app/services/db_manager.py | 12 ++++++------ app/services/postgres_rep.py | 8 ++++---- instance/model.py | 4 +++- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/routes/payment_routes.py b/app/routes/payment_routes.py index 2eebab2..a6506e1 100644 --- a/app/routes/payment_routes.py +++ b/app/routes/payment_routes.py @@ -8,7 +8,7 @@ from app.services.db_manager import DatabaseManager router = APIRouter() class CreatePaymentRequest(BaseModel): - telegram_id: int + telegram_id: str amount: float class PaymentResponse(BaseModel): diff --git a/app/routes/subscription_routes.py b/app/routes/subscription_routes.py index 0e89c93..5c682ec 100644 --- a/app/routes/subscription_routes.py +++ b/app/routes/subscription_routes.py @@ -14,7 +14,7 @@ router = APIRouter() class BuySubscriptionRequest(BaseModel): - telegram_id: int + telegram_id: str plan_id: str class SubscriptionResponse(BaseModel): @@ -126,7 +126,7 @@ async def get_subscriptions(user_id: UUID, database_manager: DatabaseManager = D raise e @router.get("/uri", response_model=dict) -async def get_uri(telegram_id: int, database_manager: DatabaseManager = Depends(get_database_manager)): +async def get_uri(telegram_id: str, database_manager: DatabaseManager = Depends(get_database_manager)): """ Возвращает список подписок пользователя. """ diff --git a/app/routes/user_routes.py b/app/routes/user_routes.py index edcfb0a..db92cab 100644 --- a/app/routes/user_routes.py +++ b/app/routes/user_routes.py @@ -14,11 +14,12 @@ router = APIRouter() # Модели запросов и ответов class CreateUserRequest(BaseModel): - telegram_id: int + telegram_id: str + referrer_id: str class UserResponse(BaseModel): id: UUID - telegram_id: int + telegram_id: str username: str balance: float created_at: str @@ -34,7 +35,7 @@ async def create_user( Создание пользователя через Telegram ID. """ try: - user = await db_manager.create_user(request.telegram_id) + user = await db_manager.create_user(request.telegram_id,request.referrer_id) if user == "ERROR": raise HTTPException(status_code=500, detail="Failed to create user") @@ -43,6 +44,7 @@ async def create_user( telegram_id=user.telegram_id, username=user.username, balance=user.balance, + referrer_id = user.referrer_id, created_at=user.created_at.isoformat(), updated_at=user.updated_at.isoformat() ) @@ -53,7 +55,7 @@ async def create_user( @router.get("/user/{telegram_id}", response_model=UserResponse, summary="Получить информацию о пользователе") async def get_user( - telegram_id: int, + telegram_id: str, db_manager: DatabaseManager = Depends(get_database_manager) ): """ @@ -95,7 +97,7 @@ async def get_user( @router.post("/user/{telegram_id}/balance/{amount}", summary="Обновить баланс") async def update_balance( - telegram_id: int, + telegram_id: str, amount: float, db_manager: DatabaseManager = Depends(get_database_manager) ): diff --git a/app/services/db_manager.py b/app/services/db_manager.py index a0328be..adc3cec 100644 --- a/app/services/db_manager.py +++ b/app/services/db_manager.py @@ -26,14 +26,14 @@ class DatabaseManager: Получает активные подписки пользователя """ return await self.postgres_repo.list_active_tickets(user_id) - async def create_user(self, telegram_id: int): + async def create_user(self, telegram_id: str, referrer_id: str): """ Создаёт пользователя. """ username = self.generate_string(6) - return await self.postgres_repo.create_user(telegram_id, username) + return await self.postgres_repo.create_user(telegram_id, username, str) - async def get_user_by_telegram_id(self, telegram_id: int): + async def get_user_by_telegram_id(self, telegram_id: str): """ Возвращает пользователя по Telegram ID. """ @@ -56,7 +56,7 @@ class DatabaseManager: """ return await self.postgres_repo.get_last_transactions(user_id, limit) - async def update_balance(self, telegram_id: int, amount: float): + async def update_balance(self, telegram_id: str, amount: float): """ Обновляет баланс пользователя и добавляет транзакцию. """ @@ -76,7 +76,7 @@ class DatabaseManager: return "OK" - async def get_active_subscription(self, telegram_id: int): + async def get_active_subscription(self, telegram_id: str): """ Проверяет наличие активной подписки. """ @@ -170,7 +170,7 @@ class DatabaseManager: return new_subscription, server - async def generate_uri(self, telegram_id: int): + async def generate_uri(self, telegram_id: str): """ Генерация URI для пользователя. diff --git a/app/services/postgres_rep.py b/app/services/postgres_rep.py index 0d6cdac..f5ebd9e 100644 --- a/app/services/postgres_rep.py +++ b/app/services/postgres_rep.py @@ -12,13 +12,13 @@ class PostgresRepository: self.session_generator = session_generator self.logger = logger - async def create_user(self, telegram_id: int, username: str): + async def create_user(self, telegram_id: str, username: str, referrer_id: str): """ Создаёт нового пользователя в PostgreSQL. """ async for session in self.session_generator(): try: - new_user = User(telegram_id=telegram_id, username=username) + new_user = User(telegram_id=telegram_id, username=username, referrer_id=referrer_id) session.add(new_user) await session.commit() return new_user @@ -27,7 +27,7 @@ class PostgresRepository: await session.rollback() return None - async def get_active_subscription(self, telegram_id: int): + async def get_active_subscription(self, telegram_id: str): """ Проверяет наличие активной подписки у пользователя. """ @@ -45,7 +45,7 @@ class PostgresRepository: self.logger.error(f"Ошибка проверки активной подписки для пользователя {telegram_id}: {e}") return None - async def get_user_by_telegram_id(self, telegram_id: int): + async def get_user_by_telegram_id(self, telegram_id: str): """ Возвращает пользователя по Telegram ID. """ diff --git a/instance/model.py b/instance/model.py index 6c77500..409c3e9 100644 --- a/instance/model.py +++ b/instance/model.py @@ -23,12 +23,14 @@ class User(Base): __tablename__ = 'users' id = Column(UUID(as_uuid=True), primary_key=True, default=generate_uuid) - telegram_id = Column(Integer, unique=True, nullable=False) + telegram_id = Column(String, unique=True, nullable=False) username = Column(String) balance = Column(Numeric(10, 2), default=0.0) + referrer_id = Column(String, ForeignKey('users.id'), nullable=True) # Кто пригласил created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + referrals = relationship("User", backref="referrer", remote_side=[id]) # Список рефералов subscriptions = relationship("Subscription", back_populates="user") transactions = relationship("Transaction", back_populates="user") admins = relationship("Administrators", back_populates="user")