style: fix ruff format for all sync-related changes

This commit is contained in:
c0mrade
2026-04-10 15:13:59 +03:00
parent be32010d63
commit 522a8779d6
27 changed files with 70 additions and 20 deletions
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
+1 -3
View File
@@ -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())
+2
View File
@@ -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,
+1
View File
@@ -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,
+5 -1
View File
@@ -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(
+1
View File
@@ -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,
+3
View File
@@ -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,
@@ -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,
@@ -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,
+1
View File
@@ -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,
+2
View File
@@ -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,
+2
View File
@@ -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(
+1
View File
@@ -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,
+1 -1
View File
@@ -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(
+17 -14
View File
@@ -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,
+1
View File
@@ -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)):
@@ -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,
@@ -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,
@@ -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,
+1
View File
@@ -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,
+3
View File
@@ -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,
Generated
+1 -1
View File
@@ -1143,7 +1143,7 @@ wheels = [
[[package]]
name = "remnawave-bedolaga-telegram-bot"
version = "3.43.1"
version = "3.45.1"
source = { virtual = "." }
dependencies = [
{ name = "aiogram" },