Встроил марзбан в бекенд, исправил бывшие проблемы с получением активной подписки
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user