From 522a8779d6935fbbabaa660b7daea6f2fd6ee1d5 Mon Sep 17 00:00:00 2001 From: c0mrade Date: Fri, 10 Apr 2026 15:13:59 +0300 Subject: [PATCH] style: fix ruff format for all sync-related changes --- .../routes/subscription_modules/daily.py | 1 + .../routes/subscription_modules/devices.py | 2 ++ .../routes/subscription_modules/purchase.py | 2 ++ .../routes/subscription_modules/servers.py | 1 + .../subscription_modules/tariff_switch.py | 1 + .../routes/subscription_modules/traffic.py | 2 ++ app/database/crud/tariff.py | 4 +-- app/handlers/simple_subscription.py | 2 ++ app/handlers/stars_payments.py | 1 + app/handlers/start.py | 6 +++- app/handlers/subscription/countries.py | 1 + app/handlers/subscription/purchase.py | 3 ++ app/handlers/subscription/tariff_purchase.py | 7 +++++ app/services/daily_subscription_service.py | 2 ++ app/services/payment/stars.py | 1 + app/services/payment/yookassa.py | 2 ++ app/services/phantom_service.py | 2 ++ app/services/promo_offer_service.py | 1 + app/services/remnawave_resync_service.py | 2 +- app/services/remnawave_retry_queue.py | 31 ++++++++++--------- app/services/remnawave_service.py | 1 + .../subscription_auto_purchase_service.py | 7 +++++ app/services/subscription_purchase_service.py | 1 + app/services/subscription_renewal_service.py | 1 + app/services/user_service.py | 1 + app/webapi/routes/miniapp.py | 3 ++ uv.lock | 2 +- 27 files changed, 70 insertions(+), 20 deletions(-) diff --git a/app/cabinet/routes/subscription_modules/daily.py b/app/cabinet/routes/subscription_modules/daily.py index 4b0b7c79..c10abf21 100644 --- a/app/cabinet/routes/subscription_modules/daily.py +++ b/app/cabinet/routes/subscription_modules/daily.py @@ -169,6 +169,7 @@ async def toggle_subscription_pause( except Exception as e: logger.error('Error syncing RemnaWave user on resume', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/cabinet/routes/subscription_modules/devices.py b/app/cabinet/routes/subscription_modules/devices.py index 816cfe84..1aac38d7 100644 --- a/app/cabinet/routes/subscription_modules/devices.py +++ b/app/cabinet/routes/subscription_modules/devices.py @@ -235,6 +235,7 @@ async def purchase_devices_legacy( except Exception as e: logger.error('Failed to sync devices with RemnaWave (legacy endpoint)', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, @@ -482,6 +483,7 @@ async def purchase_devices( except Exception as e: logger.error('Failed to sync devices with RemnaWave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/cabinet/routes/subscription_modules/purchase.py b/app/cabinet/routes/subscription_modules/purchase.py index b4e68537..2ea16daa 100644 --- a/app/cabinet/routes/subscription_modules/purchase.py +++ b/app/cabinet/routes/subscription_modules/purchase.py @@ -912,6 +912,7 @@ async def purchase_tariff( except Exception as remnawave_error: logger.error('Failed to sync subscription with RemnaWave', remnawave_error=remnawave_error) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, @@ -1263,6 +1264,7 @@ async def activate_trial( except Exception as e: logger.error('Failed to create RemnaWave user for trial', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/cabinet/routes/subscription_modules/servers.py b/app/cabinet/routes/subscription_modules/servers.py index 944d5499..e533fa3e 100644 --- a/app/cabinet/routes/subscription_modules/servers.py +++ b/app/cabinet/routes/subscription_modules/servers.py @@ -250,6 +250,7 @@ async def update_countries( except Exception as e: logger.error('Failed to sync countries with RemnaWave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/cabinet/routes/subscription_modules/tariff_switch.py b/app/cabinet/routes/subscription_modules/tariff_switch.py index 576837ea..3c52fe03 100644 --- a/app/cabinet/routes/subscription_modules/tariff_switch.py +++ b/app/cabinet/routes/subscription_modules/tariff_switch.py @@ -429,6 +429,7 @@ async def switch_tariff( except Exception as e: logger.error('Failed to sync tariff switch with RemnaWave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/cabinet/routes/subscription_modules/traffic.py b/app/cabinet/routes/subscription_modules/traffic.py index 5fa50774..e0359967 100644 --- a/app/cabinet/routes/subscription_modules/traffic.py +++ b/app/cabinet/routes/subscription_modules/traffic.py @@ -330,6 +330,7 @@ async def purchase_traffic( except Exception as e: logger.error('Failed to sync traffic with RemnaWave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, @@ -622,6 +623,7 @@ async def switch_traffic_package( except Exception as e: logger.error('Failed to sync traffic switch with RemnaWave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/database/crud/tariff.py b/app/database/crud/tariff.py index 751a99d8..67346de6 100644 --- a/app/database/crud/tariff.py +++ b/app/database/crud/tariff.py @@ -124,9 +124,7 @@ async def clear_trial_tariff(db: AsyncSession) -> None: async def get_all_active_tariffs(db: AsyncSession) -> list[Tariff]: """Get all active tariffs.""" - result = await db.execute( - select(Tariff).where(Tariff.is_active.is_(True)).order_by(Tariff.tier_level) - ) + result = await db.execute(select(Tariff).where(Tariff.is_active.is_(True)).order_by(Tariff.tier_level)) return list(result.scalars().all()) diff --git a/app/handlers/simple_subscription.py b/app/handlers/simple_subscription.py index 51ed63dd..be4e7272 100644 --- a/app/handlers/simple_subscription.py +++ b/app/handlers/simple_subscription.py @@ -550,6 +550,7 @@ async def handle_simple_subscription_pay_with_balance( exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -2297,6 +2298,7 @@ async def confirm_simple_subscription_purchase( exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/handlers/stars_payments.py b/app/handlers/stars_payments.py index eba9257e..28eaee4b 100644 --- a/app/handlers/stars_payments.py +++ b/app/handlers/stars_payments.py @@ -254,6 +254,7 @@ async def _handle_trial_payment( logger.error('Ошибка создания пользователя RemnaWave для триала', rw_error=rw_error) # Не откатываем подписку, просто логируем - RemnaWave может быть временно недоступен from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/handlers/start.py b/app/handlers/start.py index 4851a165..2b633091 100644 --- a/app/handlers/start.py +++ b/app/handlers/start.py @@ -235,6 +235,7 @@ async def _claim_phantom_user( error=str(exc), ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(phantom_sub, 'id') and hasattr(phantom_sub, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=phantom_sub.id, @@ -2451,13 +2452,16 @@ async def required_sub_channel_check( api_error=api_error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + for sub in _subs: if sub.is_trial and sub.status == SubscriptionStatus.ACTIVE.value: if hasattr(sub, 'id') and hasattr(sub, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=sub.id, user_id=sub.user_id, - action='update' if (getattr(sub, 'remnawave_uuid', None) or user.remnawave_uuid) else 'create', + action='update' + if (getattr(sub, 'remnawave_uuid', None) or user.remnawave_uuid) + else 'create', ) await query.answer( diff --git a/app/handlers/subscription/countries.py b/app/handlers/subscription/countries.py index 48be7765..43beab0f 100644 --- a/app/handlers/subscription/countries.py +++ b/app/handlers/subscription/countries.py @@ -417,6 +417,7 @@ async def apply_countries_changes(callback: types.CallbackQuery, db_user: User, except Exception as rw_err: logger.error('Ошибка синхронизации с RemnaWave при смене стран', error=rw_err) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/handlers/subscription/purchase.py b/app/handlers/subscription/purchase.py index e8a41170..25792b9d 100644 --- a/app/handlers/subscription/purchase.py +++ b/app/handlers/subscription/purchase.py @@ -2624,6 +2624,7 @@ async def confirm_purchase(callback: types.CallbackQuery, state: FSMContext, db_ except Exception as retry_error: logger.error('Повторная попытка создания RemnaWave пользователя также не удалась', error=retry_error) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -3179,6 +3180,7 @@ async def handle_toggle_daily_subscription_pause(callback: types.CallbackQuery, except Exception as e: logger.error('Ошибка синхронизации с Remnawave при возобновлении', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -4624,6 +4626,7 @@ async def _extend_existing_subscription( except Exception as e: logger.error('⚠ ИСКЛЮЧЕНИЕ ПРИ ОБНОВЛЕНИИ REMNAWAVE', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=current_subscription.id, user_id=db_user.id, diff --git a/app/handlers/subscription/tariff_purchase.py b/app/handlers/subscription/tariff_purchase.py index b8f9ae21..33a7d912 100644 --- a/app/handlers/subscription/tariff_purchase.py +++ b/app/handlers/subscription/tariff_purchase.py @@ -1079,6 +1079,7 @@ async def handle_custom_confirm( except Exception as e: logger.error('Ошибка обновления Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -1609,6 +1610,7 @@ async def confirm_tariff_purchase( except Exception as e: logger.error('Ошибка обновления Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -1888,6 +1890,7 @@ async def confirm_daily_tariff_purchase( except Exception as e: logger.error('Ошибка обновления Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -2359,6 +2362,7 @@ async def confirm_tariff_extend( except Exception as e: logger.error('Ошибка обновления Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -2991,6 +2995,7 @@ async def confirm_tariff_switch( except Exception as e: logger.error('Ошибка обновления Remnawave при переключении тарифа', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -3238,6 +3243,7 @@ async def confirm_daily_tariff_switch( except Exception as e: logger.error('Ошибка обновления Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, @@ -3931,6 +3937,7 @@ async def confirm_instant_switch( except Exception as e: logger.error('Ошибка обновления Remnawave при мгновенном переключении', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=db_user.id, diff --git a/app/services/daily_subscription_service.py b/app/services/daily_subscription_service.py index e324bc63..56eed9a1 100644 --- a/app/services/daily_subscription_service.py +++ b/app/services/daily_subscription_service.py @@ -265,6 +265,7 @@ class DailySubscriptionService: except Exception as e: logger.warning('Не удалось обновить Remnawave', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -547,6 +548,7 @@ class DailySubscriptionService: except Exception as e: logger.warning('Не удалось синхронизировать с RemnaWave после сброса трафика', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/services/payment/stars.py b/app/services/payment/stars.py index 9cc7dcc3..b1617d17 100644 --- a/app/services/payment/stars.py +++ b/app/services/payment/stars.py @@ -287,6 +287,7 @@ class TelegramStarsMixin: exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=subscription.user_id, diff --git a/app/services/payment/yookassa.py b/app/services/payment/yookassa.py index 2c45a3fa..9bd102ac 100644 --- a/app/services/payment/yookassa.py +++ b/app/services/payment/yookassa.py @@ -681,6 +681,7 @@ class YooKassaPaymentMixin: except Exception as rw_error: logger.error('Ошибка создания RemnaWave для триала', rw_error=rw_error) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=subscription.user_id, @@ -998,6 +999,7 @@ class YooKassaPaymentMixin: exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=subscription.user_id, diff --git a/app/services/phantom_service.py b/app/services/phantom_service.py index 467dec24..6ea0939a 100644 --- a/app/services/phantom_service.py +++ b/app/services/phantom_service.py @@ -118,6 +118,7 @@ async def claim_phantom( exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(sub, 'id') and hasattr(sub, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=sub.id, @@ -213,6 +214,7 @@ async def sync_remnawave_after_phantom_merge(db: AsyncSession, user: User) -> No exc_info=True, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + for sub in subs: if hasattr(sub, 'id') and hasattr(sub, 'user_id'): remnawave_retry_queue.enqueue( diff --git a/app/services/promo_offer_service.py b/app/services/promo_offer_service.py index bd70485e..9b6cec16 100644 --- a/app/services/promo_offer_service.py +++ b/app/services/promo_offer_service.py @@ -217,6 +217,7 @@ class PromoOfferService: exc=exc, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/services/remnawave_resync_service.py b/app/services/remnawave_resync_service.py index 2198982a..a11fb354 100644 --- a/app/services/remnawave_resync_service.py +++ b/app/services/remnawave_resync_service.py @@ -41,7 +41,7 @@ async def resync_user_subscriptions_with_panel( ) return {'synced': 0, 'failed': 0, 'total': 0, 'skipped': True} - subscriptions = await get_active_subscriptions_by_user_id(db, user.id) + subscriptions = await get_active_subscriptions_by_user_id(db, int(user.id)) if not subscriptions: logger.info( diff --git a/app/services/remnawave_retry_queue.py b/app/services/remnawave_retry_queue.py index 1cbb492e..740676c2 100644 --- a/app/services/remnawave_retry_queue.py +++ b/app/services/remnawave_retry_queue.py @@ -4,6 +4,7 @@ When create_remnawave_user() fails during purchase, the subscription exists in the bot DB but not in the panel. This queue retries the operation periodically until it succeeds or max retries are exhausted. """ + from __future__ import annotations import asyncio @@ -24,7 +25,7 @@ logger = structlog.get_logger(__name__) class RetryItem: subscription_id: int user_id: int - action: Literal["create", "update"] + action: Literal['create', 'update'] attempts: int = 0 created_at: datetime = field(default_factory=lambda: datetime.now(UTC)) last_error: str | None = None @@ -45,19 +46,21 @@ class RemnaWaveRetryQueue: self, subscription_id: int, user_id: int, - action: Literal["create", "update"] = "create", + action: Literal['create', 'update'] = 'create', ) -> None: # Deduplicate by subscription_id for item in self._queue: if item.subscription_id == subscription_id: return - self._queue.append(RetryItem( - subscription_id=subscription_id, - user_id=user_id, - action=action, - )) + self._queue.append( + RetryItem( + subscription_id=subscription_id, + user_id=user_id, + action=action, + ) + ) logger.info( - "Enqueued RemnaWave retry", + 'Enqueued RemnaWave retry', subscription_id=subscription_id, user_id=user_id, action=action, @@ -81,23 +84,23 @@ class RemnaWaveRetryQueue: sub = await get_subscription_by_id(db, item.subscription_id) if not sub: logger.warning( - "Retry: subscription not found, dropping", + 'Retry: subscription not found, dropping', subscription_id=item.subscription_id, ) continue service = SubscriptionService() if not service.is_configured: - self._requeue(item, "RemnaWave not configured") + self._requeue(item, 'RemnaWave not configured') continue - if item.action == "create": + if item.action == 'create': await service.create_remnawave_user(db, sub) else: await service.update_remnawave_user(db, sub) logger.info( - "Retry succeeded", + 'Retry succeeded', subscription_id=item.subscription_id, attempts=item.attempts, ) @@ -110,7 +113,7 @@ class RemnaWaveRetryQueue: if item.attempts < self._max_retries: self._queue.append(item) logger.warning( - "Retry failed, re-enqueued", + 'Retry failed, re-enqueued', subscription_id=item.subscription_id, attempts=item.attempts, max_retries=self._max_retries, @@ -118,7 +121,7 @@ class RemnaWaveRetryQueue: ) else: logger.error( - "Retry exhausted, dropping (MANUAL INTERVENTION NEEDED)", + 'Retry exhausted, dropping (MANUAL INTERVENTION NEEDED)', subscription_id=item.subscription_id, user_id=item.user_id, attempts=item.attempts, diff --git a/app/services/remnawave_service.py b/app/services/remnawave_service.py index 05220070..1dab85bb 100644 --- a/app/services/remnawave_service.py +++ b/app/services/remnawave_service.py @@ -1886,6 +1886,7 @@ class RemnaWaveService: if _squad_uuids: try: from app.database.crud.tariff import get_all_active_tariffs + _all_tariffs = await get_all_active_tariffs(db) for _t in _all_tariffs: if _t.allowed_squads and set(_squad_uuids).issubset(set(_t.allowed_squads)): diff --git a/app/services/subscription_auto_purchase_service.py b/app/services/subscription_auto_purchase_service.py index 3fb49711..ac9678b5 100644 --- a/app/services/subscription_auto_purchase_service.py +++ b/app/services/subscription_auto_purchase_service.py @@ -584,6 +584,7 @@ async def _auto_extend_subscription( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(updated_subscription, 'id') and hasattr(updated_subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=updated_subscription.id, @@ -961,6 +962,7 @@ async def _auto_purchase_tariff( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -1318,6 +1320,7 @@ async def _auto_purchase_daily_tariff( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -1656,6 +1659,7 @@ async def _auto_add_devices( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -2011,6 +2015,7 @@ async def _auto_add_traffic( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -2369,6 +2374,7 @@ async def try_auto_extend_expired_after_topup( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(updated_subscription, 'id') and hasattr(updated_subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=updated_subscription.id, @@ -2756,6 +2762,7 @@ async def try_resume_disabled_daily_after_topup( error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/app/services/subscription_purchase_service.py b/app/services/subscription_purchase_service.py index 0aba98a5..87de0151 100644 --- a/app/services/subscription_purchase_service.py +++ b/app/services/subscription_purchase_service.py @@ -1189,6 +1189,7 @@ class MiniAppSubscriptionPurchaseService: except Exception as remnawave_error: # pragma: no cover - defensive logging logger.error('Failed to sync subscription with RemnaWave', remnawave_error=remnawave_error) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription.id, user_id=user.id, diff --git a/app/services/subscription_renewal_service.py b/app/services/subscription_renewal_service.py index 1f79d071..faee3e52 100644 --- a/app/services/subscription_renewal_service.py +++ b/app/services/subscription_renewal_service.py @@ -519,6 +519,7 @@ class SubscriptionRenewalService: error=error, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + remnawave_retry_queue.enqueue( subscription_id=subscription_after.id, user_id=subscription_after.user_id, diff --git a/app/services/user_service.py b/app/services/user_service.py index a793b400..9613ea09 100644 --- a/app/services/user_service.py +++ b/app/services/user_service.py @@ -769,6 +769,7 @@ class UserService: error=e, ) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(sub, 'id') and hasattr(sub, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=sub.id, diff --git a/app/webapi/routes/miniapp.py b/app/webapi/routes/miniapp.py index 896f91f2..0c276630 100644 --- a/app/webapi/routes/miniapp.py +++ b/app/webapi/routes/miniapp.py @@ -7056,6 +7056,7 @@ async def switch_tariff_endpoint( except Exception as e: logger.error('Ошибка синхронизации с RemnaWave при смене тарифа', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -7253,6 +7254,7 @@ async def purchase_traffic_topup_endpoint( except Exception as e: logger.error('Ошибка синхронизации с RemnaWave при докупке трафика', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, @@ -7499,6 +7501,7 @@ async def toggle_daily_subscription_pause_endpoint( except Exception as e: logger.error('Ошибка синхронизации с RemnaWave при возобновлении', error=e) from app.services.remnawave_retry_queue import remnawave_retry_queue + if hasattr(subscription, 'id') and hasattr(subscription, 'user_id'): remnawave_retry_queue.enqueue( subscription_id=subscription.id, diff --git a/uv.lock b/uv.lock index 38e28239..2d051b58 100644 --- a/uv.lock +++ b/uv.lock @@ -1143,7 +1143,7 @@ wheels = [ [[package]] name = "remnawave-bedolaga-telegram-bot" -version = "3.43.1" +version = "3.45.1" source = { virtual = "." } dependencies = [ { name = "aiogram" },