From a9eee19c95efdc38ecf5fa28f7402a2bbba7dd07 Mon Sep 17 00:00:00 2001 From: Fringg Date: Sun, 8 Feb 2026 16:48:07 +0300 Subject: [PATCH] fix: resolve HWID reset context manager bug and webhook FK violation - Fix async context manager usage in sync_users: __aenter__() result was not assigned, so hwid_api_client held the context manager object instead of the actual API client, causing AttributeError on reset_user_devices() - Add user existence check in _restore_missing_yookassa_payment before INSERT to prevent ForeignKeyViolationError when user_id from payment metadata no longer exists in users table --- app/services/payment/yookassa.py | 21 +++++++++++++++++++++ app/services/remnawave_service.py | 10 ++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/services/payment/yookassa.py b/app/services/payment/yookassa.py index 5358f283..254ea8ed 100644 --- a/app/services/payment/yookassa.py +++ b/app/services/payment/yookassa.py @@ -1328,6 +1328,27 @@ class YooKassaPaymentMixin: ) return None + # Verify user exists before creating FK-linked record + try: + from app.database.crud.user import get_user_by_id + + user = await get_user_by_id(db, user_id) + if not user: + logger.warning( + 'Webhook YooKassa %s: user_id=%s не найден в БД, пропускаем восстановление платежа', + yookassa_payment_id, + user_id, + ) + return None + except Exception as e: + logger.warning( + 'Webhook YooKassa %s: не удалось проверить user_id=%s: %s', + yookassa_payment_id, + user_id, + e, + ) + return None + amount_info = event_object.get('amount') or {} amount_value = amount_info.get('value') currency = (amount_info.get('currency') or 'RUB').upper() diff --git a/app/services/remnawave_service.py b/app/services/remnawave_service.py index 3aa069d0..6a360f66 100644 --- a/app/services/remnawave_service.py +++ b/app/services/remnawave_service.py @@ -1439,12 +1439,14 @@ class RemnaWaveService: # Используем один API клиент для всех операций сброса HWID hwid_api_client = None + hwid_api_cm = None try: - hwid_api_client = self.get_api_client() - await hwid_api_client.__aenter__() + hwid_api_cm = self.get_api_client() + hwid_api_client = await hwid_api_cm.__aenter__() except Exception as api_init_error: logger.warning(f'⚠️ Не удалось создать API клиент для сброса HWID: {api_init_error}') hwid_api_client = None + hwid_api_cm = None try: for telegram_id, db_user in users_to_deactivate: @@ -1565,9 +1567,9 @@ class RemnaWaveService: finally: # Закрываем API клиент - if hwid_api_client: + if hwid_api_cm: try: - await hwid_api_client.__aexit__(None, None, None) + await hwid_api_cm.__aexit__(None, None, None) except Exception: pass