Изменение эндпоинтов и БД для работы с длинными telegram_id(сменил тип данных с инт на стринг)

This commit is contained in:
Disledg
2025-01-18 15:48:02 +03:00
parent 1aabe8f88e
commit 6d6b8832cf
6 changed files with 23 additions and 19 deletions

View File

@@ -8,7 +8,7 @@ from app.services.db_manager import DatabaseManager
router = APIRouter() router = APIRouter()
class CreatePaymentRequest(BaseModel): class CreatePaymentRequest(BaseModel):
telegram_id: int telegram_id: str
amount: float amount: float
class PaymentResponse(BaseModel): class PaymentResponse(BaseModel):

View File

@@ -14,7 +14,7 @@ router = APIRouter()
class BuySubscriptionRequest(BaseModel): class BuySubscriptionRequest(BaseModel):
telegram_id: int telegram_id: str
plan_id: str plan_id: str
class SubscriptionResponse(BaseModel): class SubscriptionResponse(BaseModel):
@@ -126,7 +126,7 @@ async def get_subscriptions(user_id: UUID, database_manager: DatabaseManager = D
raise e raise e
@router.get("/uri", response_model=dict) @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)):
""" """
Возвращает список подписок пользователя. Возвращает список подписок пользователя.
""" """

View File

@@ -14,11 +14,12 @@ router = APIRouter()
# Модели запросов и ответов # Модели запросов и ответов
class CreateUserRequest(BaseModel): class CreateUserRequest(BaseModel):
telegram_id: int telegram_id: str
referrer_id: str
class UserResponse(BaseModel): class UserResponse(BaseModel):
id: UUID id: UUID
telegram_id: int telegram_id: str
username: str username: str
balance: float balance: float
created_at: str created_at: str
@@ -34,7 +35,7 @@ async def create_user(
Создание пользователя через Telegram ID. Создание пользователя через Telegram ID.
""" """
try: 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": if user == "ERROR":
raise HTTPException(status_code=500, detail="Failed to create user") raise HTTPException(status_code=500, detail="Failed to create user")
@@ -43,6 +44,7 @@ async def create_user(
telegram_id=user.telegram_id, telegram_id=user.telegram_id,
username=user.username, username=user.username,
balance=user.balance, balance=user.balance,
referrer_id = user.referrer_id,
created_at=user.created_at.isoformat(), created_at=user.created_at.isoformat(),
updated_at=user.updated_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="Получить информацию о пользователе") @router.get("/user/{telegram_id}", response_model=UserResponse, summary="Получить информацию о пользователе")
async def get_user( async def get_user(
telegram_id: int, telegram_id: str,
db_manager: DatabaseManager = Depends(get_database_manager) db_manager: DatabaseManager = Depends(get_database_manager)
): ):
""" """
@@ -95,7 +97,7 @@ async def get_user(
@router.post("/user/{telegram_id}/balance/{amount}", summary="Обновить баланс") @router.post("/user/{telegram_id}/balance/{amount}", summary="Обновить баланс")
async def update_balance( async def update_balance(
telegram_id: int, telegram_id: str,
amount: float, amount: float,
db_manager: DatabaseManager = Depends(get_database_manager) db_manager: DatabaseManager = Depends(get_database_manager)
): ):

View File

@@ -26,14 +26,14 @@ class DatabaseManager:
Получает активные подписки пользователя Получает активные подписки пользователя
""" """
return await self.postgres_repo.list_active_tickets(user_id) 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) 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. Возвращает пользователя по Telegram ID.
""" """
@@ -56,7 +56,7 @@ class DatabaseManager:
""" """
return await self.postgres_repo.get_last_transactions(user_id, limit) 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" 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 return new_subscription, server
async def generate_uri(self, telegram_id: int): async def generate_uri(self, telegram_id: str):
""" """
Генерация URI для пользователя. Генерация URI для пользователя.

View File

@@ -12,13 +12,13 @@ class PostgresRepository:
self.session_generator = session_generator self.session_generator = session_generator
self.logger = logger 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. Создаёт нового пользователя в PostgreSQL.
""" """
async for session in self.session_generator(): async for session in self.session_generator():
try: 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) session.add(new_user)
await session.commit() await session.commit()
return new_user return new_user
@@ -27,7 +27,7 @@ class PostgresRepository:
await session.rollback() await session.rollback()
return None 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}") self.logger.error(f"Ошибка проверки активной подписки для пользователя {telegram_id}: {e}")
return None 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. Возвращает пользователя по Telegram ID.
""" """

View File

@@ -23,12 +23,14 @@ class User(Base):
__tablename__ = 'users' __tablename__ = 'users'
id = Column(UUID(as_uuid=True), primary_key=True, default=generate_uuid) 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) username = Column(String)
balance = Column(Numeric(10, 2), default=0.0) balance = Column(Numeric(10, 2), default=0.0)
referrer_id = Column(String, ForeignKey('users.id'), nullable=True) # Кто пригласил
created_at = Column(DateTime, default=datetime.utcnow) created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=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") subscriptions = relationship("Subscription", back_populates="user")
transactions = relationship("Transaction", back_populates="user") transactions = relationship("Transaction", back_populates="user")
admins = relationship("Administrators", back_populates="user") admins = relationship("Administrators", back_populates="user")