fix: prevent sync from overwriting subscription URLs with empty strings

- Guard sync update to only overwrite subscription_url when panel_url is non-empty
- Add fallback in /app-config and /subscription endpoints to fetch subscription URL
  from RemnaWave panel when missing in local DB (auto-heals synced users on access)
This commit is contained in:
Fringg
2026-02-27 22:42:04 +03:00
parent cdcabee80d
commit 9c004791f2
2 changed files with 41 additions and 1 deletions
+40
View File
@@ -261,6 +261,24 @@ async def get_subscription(
# Return 200 with has_subscription: false instead of 404
return SubscriptionStatusResponse(has_subscription=False, subscription=None)
# Fallback: restore subscription URL from panel if missing
if not fresh_user.subscription.subscription_url and getattr(fresh_user, 'remnawave_uuid', None):
try:
service = RemnaWaveService()
async with service.get_api_client() as api:
rw_user = await api.get_user_by_uuid(fresh_user.remnawave_uuid)
if rw_user and rw_user.subscription_url:
fresh_user.subscription.subscription_url = rw_user.subscription_url
if rw_user.happ_crypto_link and not fresh_user.subscription.subscription_crypto_link:
fresh_user.subscription.subscription_crypto_link = rw_user.happ_crypto_link
await db.commit()
logger.info(
'Restored subscription URLs from panel for dashboard',
user_id=fresh_user.id,
)
except Exception as e:
logger.warning('Failed to fetch subscription URL from panel', error=e)
# Load tariff for daily subscription check and tariff name
tariff_name = None
if fresh_user.subscription.tariff_id:
@@ -3205,6 +3223,28 @@ async def get_app_config(
subscription_url = user.subscription.subscription_url
subscription_crypto_link = user.subscription.subscription_crypto_link
# Fallback: if subscription URL is missing but user has a RemnaWave UUID,
# fetch fresh data from the panel and persist it
if user.subscription and not subscription_url and getattr(user, 'remnawave_uuid', None):
try:
service = RemnaWaveService()
async with service.get_api_client() as api:
rw_user = await api.get_user_by_uuid(user.remnawave_uuid)
if rw_user and rw_user.subscription_url:
subscription_url = rw_user.subscription_url
user.subscription.subscription_url = subscription_url
if rw_user.happ_crypto_link and not subscription_crypto_link:
subscription_crypto_link = rw_user.happ_crypto_link
user.subscription.subscription_crypto_link = subscription_crypto_link
await db.commit()
logger.info(
'Restored subscription URLs from panel',
user_id=user.id,
subscription_url=subscription_url,
)
except Exception as e:
logger.warning('Failed to fetch subscription URL from panel', error=e)
config = await _load_app_config_async()
if not config:
+1 -1
View File
@@ -1861,7 +1861,7 @@ class RemnaWaveService:
)
panel_url = panel_user.get('subscriptionUrl', '')
if not subscription.subscription_url or subscription.subscription_url != panel_url:
if panel_url and subscription.subscription_url != panel_url:
subscription.subscription_url = panel_url
panel_crypto_link = panel_user.get('subscriptionCryptoLink') or (panel_user.get('happ') or {}).get(