fix: не пересылать activeInternalSquads в рутинных обновлениях RemnaWave (A039)

Стейловые UUID сквадов в connected_squads вызывали FK violation в RemnaWave → A039.
- update_remnawave_user: добавлен параметр sync_squads (default=False)
- Сквады шлются только при явном sync_squads=True (promo_offer, countries)
- monitoring_service: убрана пересылка сквадов в рутинном sync
- Расширен лог PATCH payload для диагностики
This commit is contained in:
Fringg
2026-03-16 03:41:56 +03:00
parent db2f0c93f2
commit 4aaf0ddd25
4 changed files with 12 additions and 5 deletions

View File

@@ -398,7 +398,7 @@ async def apply_countries_changes(callback: types.CallbackQuery, db_user: User,
await db.commit()
subscription_service = SubscriptionService()
await subscription_service.update_remnawave_user(db, subscription)
await subscription_service.update_remnawave_user(db, subscription, sync_squads=True)
await db.refresh(subscription)
@@ -906,7 +906,7 @@ async def confirm_add_countries_to_subscription(
await db.commit()
subscription_service = SubscriptionService()
await subscription_service.update_remnawave_user(db, subscription)
await subscription_service.update_remnawave_user(db, subscription, sync_squads=True)
await db.refresh(db_user)
await db.refresh(subscription)

View File

@@ -384,9 +384,11 @@ class MonitoringService:
description=settings.format_remnawave_user_description(
full_name=user.full_name, username=user.username, telegram_id=user.telegram_id
),
active_internal_squads=subscription.connected_squads,
)
# Не пересылаем activeInternalSquads в рутинном sync — сквады уже назначены
# при создании подписки, пересылка стейловых UUID вызывает FK violation → A039
if hwid_limit is not None:
update_kwargs['hwid_device_limit'] = hwid_limit

View File

@@ -115,6 +115,7 @@ class PromoOfferService:
remnawave_user = await self.subscription_service.update_remnawave_user(
db,
subscription,
sync_squads=True,
)
if remnawave_user is None:
await db.rollback()
@@ -188,7 +189,7 @@ class PromoOfferService:
subscription.connected_squads = list(updated)
subscription.updated_at = now
try:
await self.subscription_service.update_remnawave_user(db, subscription)
await self.subscription_service.update_remnawave_user(db, subscription, sync_squads=True)
except Exception as exc: # pragma: no cover - defensive logging
logger.error(
'Ошибка обновления Remnawave при отзыве тестового доступа подписки',

View File

@@ -330,6 +330,7 @@ class SubscriptionService:
*,
reset_traffic: bool = False,
reset_reason: str | None = None,
sync_squads: bool = False,
) -> RemnaWaveUser | None:
try:
user = await get_user_by_id(db, subscription.user_id)
@@ -384,7 +385,10 @@ class SubscriptionService:
),
)
if subscription.connected_squads:
# Сквады отправляем только при явном sync_squads=True (propagate_squads и пр.)
# В рутинных обновлениях пропускаем — сквады уже назначены при создании подписки,
# а пересылка стейловых UUID вызывает FK violation → A039 в RemnaWave
if sync_squads and subscription.connected_squads:
update_kwargs['active_internal_squads'] = subscription.connected_squads
if user_tag is not None: