Встроил марзбан в бекенд, исправил бывшие проблемы с получением активной подписки

This commit is contained in:
root
2025-11-26 18:04:22 +03:00
parent e975bf4774
commit a001694608
6 changed files with 271 additions and 209 deletions

View File

@@ -6,7 +6,7 @@ from sqlalchemy.exc import SQLAlchemyError
from decimal import Decimal
from sqlalchemy import asc, desc, update
from sqlalchemy.orm import joinedload
from instance.model import Referral, User, Subscription, Transaction
from instance.model import Referral, User, Subscription, Transaction, Plan
class PostgresRepository:
@@ -37,12 +37,18 @@ class PostgresRepository:
try:
result = await session.execute(
select(Subscription)
.join(User, Subscription.user_id == User.id)
.where(User.telegram_id == telegram_id, Subscription.expiry_date > datetime.utcnow())
.join(User, Subscription.user_id == User.telegram_id)
.where(User.telegram_id == telegram_id, Subscription.end_date > datetime.utcnow())
)
result= result.scalars().first()
self.logger.info(f"Пользователь с id {telegram_id}, проверен и имеет {result}")
return result
subscription = result.scalars().first()
if subscription:
# Отделяем объект от сессии
session.expunge(subscription)
self.logger.info(f"Пользователь с id {telegram_id}, проверен и имеет подписку ID: {subscription.id}")
else:
self.logger.info(f"Пользователь с id {telegram_id}, проверен и имеет None")
return subscription
except SQLAlchemyError as e:
self.logger.error(f"Ошибка проверки активной подписки для пользователя {telegram_id}: {e}")
return None
@@ -104,7 +110,7 @@ class PostgresRepository:
self.logger.error(f"Ошибка получения транзакций пользователя {user_telegram_id}: {e}")
return None
async def get_last_subscription_by_user_id(self, user_telegram_id: int, limit: int = 1):
async def get_last_subscription_by_user_id(self, user_telegram_id: int):
"""
Извлекает последнюю подписку пользователя на основании user_id.
@@ -117,12 +123,19 @@ class PostgresRepository:
select(Subscription)
.where(Subscription.user_id == user_telegram_id)
.order_by(desc(Subscription.created_at))
.limit(limit)
.limit(1)
)
subscriptions = list(result.scalars())
result.scalars()
self.logger.info(f"Найдены такие подписки: {subscriptions}")
return subscriptions
subscription = result.scalars().first()
self.logger.info(f"Найдены такие подписки: {subscription}")
if subscription:
session.expunge(subscription)
self.logger.info(f"Найдена подписка ID: {subscription.id} для пользователя {user_telegram_id}")
return subscription
else:
return None
except SQLAlchemyError as e:
self.logger.error(f"Ошибка при получении подписки для пользователя {user_telegram_id}: {e}")
return None
@@ -142,7 +155,7 @@ class PostgresRepository:
except SQLAlchemyError as e:
self.logger.error(f"Ошибка при добавлении записи: {record}: {e}")
await session.rollback()
return None
raise Exception
async def add_referral(self, referrer_id: int, referral_id: int):
"""
@@ -198,4 +211,42 @@ class PostgresRepository:
except Exception as e:
await session.rollback()
self.logger.error(f"Ошибка при добавлении реферальной связи: {str(e)}")
raise
raise
async def get_subscription_plan(self, plan_name:str) -> Plan | None:
"""
Поиск плана для подписки
:param plan_name: Объект записи.
:return: Запись или None в случае ошибки.
"""
async for session in self.session_generator():
try:
result = await session.execute(
select(Plan)
.where(Plan.name == plan_name)
)
return result.scalar_one_or_none()
except SQLAlchemyError as e:
self.logger.error(f"Ошибка при поиске плана: {plan_name}: {e}")
await session.rollback()
return Noneэ
async def get_plan_by_id(self, plan_id: int) -> Plan | None:
"""
Поиск плана для подписки
:param plan_name: Объект записи.
:return: Запись или None в случае ошибки.
"""
async for session in self.session_generator():
try:
result = await session.execute(
select(Plan)
.where(Plan.id == plan_id)
)
return result.scalar_one_or_none()
except SQLAlchemyError as e:
self.logger.error(f"Ошибка при поиске плана: {plan_id}: {e}")
await session.rollback()
return None