fix: ensure web app pay button is spawning when enable payment provider
This commit is contained in:
@@ -79,6 +79,12 @@ async def admin_settings_patch_route(request: web.Request) -> web.Response:
|
|||||||
if isinstance(cache, dict):
|
if isinstance(cache, dict):
|
||||||
cache["ts"] = 0.0
|
cache["ts"] = 0.0
|
||||||
cache["data"] = {}
|
cache["data"] = {}
|
||||||
|
try:
|
||||||
|
from bot.app.web.webapp.cache_helpers import invalidate_all_webapp_user_caches
|
||||||
|
|
||||||
|
await invalidate_all_webapp_user_caches(settings, include_devices=True)
|
||||||
|
except Exception:
|
||||||
|
logger.exception("Failed to invalidate WebApp user payload caches after settings update")
|
||||||
if (
|
if (
|
||||||
"WEBAPP_LOGO_URL" in updates
|
"WEBAPP_LOGO_URL" in updates
|
||||||
or "WEBAPP_LOGO_URL" in deletes
|
or "WEBAPP_LOGO_URL" in deletes
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from typing import Any, Awaitable, Callable, Optional
|
from typing import Any, Awaitable, Callable, Optional
|
||||||
|
|
||||||
from bot.infra.redis import cache_delete, redis_key
|
from bot.infra.redis import cache_delete, cache_delete_pattern, redis_key
|
||||||
from bot.utils.ttl_cache import AsyncTTLCache
|
from bot.utils.ttl_cache import AsyncTTLCache
|
||||||
from config.settings import Settings
|
from config.settings import Settings
|
||||||
|
|
||||||
@@ -55,6 +55,20 @@ def invalidate_local_webapp_user_payload(
|
|||||||
cache.invalidate(key)
|
cache.invalidate(key)
|
||||||
|
|
||||||
|
|
||||||
|
def invalidate_all_local_webapp_user_payloads(
|
||||||
|
settings: Settings,
|
||||||
|
namespace: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
for (settings_id, cache_namespace, _ttl), cache in tuple(
|
||||||
|
_WEBAPP_USER_PAYLOAD_CACHES.items()
|
||||||
|
):
|
||||||
|
if settings_id != id(settings):
|
||||||
|
continue
|
||||||
|
if namespace is not None and cache_namespace != namespace:
|
||||||
|
continue
|
||||||
|
cache.invalidate()
|
||||||
|
|
||||||
|
|
||||||
async def invalidate_webapp_user_caches(
|
async def invalidate_webapp_user_caches(
|
||||||
settings: Settings,
|
settings: Settings,
|
||||||
*user_ids: Optional[int],
|
*user_ids: Optional[int],
|
||||||
@@ -79,3 +93,23 @@ async def invalidate_webapp_user_caches(
|
|||||||
invalidate_local_webapp_user_payload(settings, "devices", user_id)
|
invalidate_local_webapp_user_payload(settings, "devices", user_id)
|
||||||
if keys:
|
if keys:
|
||||||
await cache_delete(settings, *keys)
|
await cache_delete(settings, *keys)
|
||||||
|
|
||||||
|
|
||||||
|
async def invalidate_all_webapp_user_caches(
|
||||||
|
settings: Settings,
|
||||||
|
*,
|
||||||
|
include_devices: bool = False,
|
||||||
|
) -> None:
|
||||||
|
namespaces = ["me"]
|
||||||
|
if include_devices:
|
||||||
|
namespaces.append("devices")
|
||||||
|
|
||||||
|
for namespace in namespaces:
|
||||||
|
invalidate_all_local_webapp_user_payloads(settings, namespace)
|
||||||
|
try:
|
||||||
|
await cache_delete_pattern(
|
||||||
|
settings,
|
||||||
|
redis_key(settings, "cache", "webapp", namespace, "*"),
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ from PIL import Image
|
|||||||
from bot.app.web import subscription_webapp
|
from bot.app.web import subscription_webapp
|
||||||
from bot.app.web.admin_api_impl import themes as admin_themes
|
from bot.app.web.admin_api_impl import themes as admin_themes
|
||||||
from bot.app.web.webapp import assets as webapp_assets
|
from bot.app.web.webapp import assets as webapp_assets
|
||||||
|
from bot.app.web.webapp import cache_helpers
|
||||||
from config.settings import Settings
|
from config.settings import Settings
|
||||||
from config.webapp_themes_config import WebappThemesConfig, builtin_webapp_themes_config
|
from config.webapp_themes_config import WebappThemesConfig, builtin_webapp_themes_config
|
||||||
|
|
||||||
@@ -449,6 +450,58 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
[{"id": "yookassa", "name": "Bank card", "icon": "WalletCards"}],
|
[{"id": "yookassa", "name": "Bank card", "icon": "WalletCards"}],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_serialize_payment_methods_includes_wata_from_provider_config(self):
|
||||||
|
from bot.payment_providers import build_provider_configs, get_provider_bundle
|
||||||
|
|
||||||
|
build_provider_configs(force=True)
|
||||||
|
bundle = get_provider_bundle("wata_service")
|
||||||
|
self.assertIsNotNone(bundle)
|
||||||
|
bundle.config.ENABLED = True
|
||||||
|
bundle.config.API_TOKEN = "wata-token"
|
||||||
|
|
||||||
|
settings = Settings(
|
||||||
|
_env_file=None,
|
||||||
|
BOT_TOKEN="token",
|
||||||
|
POSTGRES_USER="app_user",
|
||||||
|
POSTGRES_PASSWORD="app_password",
|
||||||
|
TARIFFS_CONFIG_PATH="missing-tariffs.json",
|
||||||
|
PAYMENT_METHODS_ORDER="wata",
|
||||||
|
STARS_ENABLED=False,
|
||||||
|
)
|
||||||
|
app = {"wata_service": SimpleNamespace(configured=True)}
|
||||||
|
|
||||||
|
methods = subscription_webapp._serialize_payment_methods(settings, app, "en")
|
||||||
|
|
||||||
|
self.assertEqual(methods, [{"id": "wata", "name": "Wata", "icon": "WalletCards"}])
|
||||||
|
|
||||||
|
async def test_invalidate_all_webapp_user_caches_clears_cached_me_payload(self):
|
||||||
|
settings = Settings(
|
||||||
|
_env_file=None,
|
||||||
|
BOT_TOKEN="token",
|
||||||
|
POSTGRES_USER="app_user",
|
||||||
|
POSTGRES_PASSWORD="app_password",
|
||||||
|
REDIS_URL=None,
|
||||||
|
)
|
||||||
|
calls = 0
|
||||||
|
|
||||||
|
async def loader():
|
||||||
|
nonlocal calls
|
||||||
|
calls += 1
|
||||||
|
return {"payment_methods": [{"id": f"method-{calls}"}]}
|
||||||
|
|
||||||
|
first = await cache_helpers.webapp_cached_user_payload(settings, "me", 42, 60, loader)
|
||||||
|
second = await cache_helpers.webapp_cached_user_payload(settings, "me", 42, 60, loader)
|
||||||
|
|
||||||
|
self.assertEqual(first, {"payment_methods": [{"id": "method-1"}]})
|
||||||
|
self.assertEqual(second, first)
|
||||||
|
self.assertEqual(calls, 1)
|
||||||
|
|
||||||
|
await cache_helpers.invalidate_all_webapp_user_caches(settings)
|
||||||
|
third = await cache_helpers.webapp_cached_user_payload(settings, "me", 42, 60, loader)
|
||||||
|
|
||||||
|
self.assertEqual(third, {"payment_methods": [{"id": "method-2"}]})
|
||||||
|
self.assertEqual(calls, 2)
|
||||||
|
|
||||||
def test_serialize_plans_includes_stars_only_subscription_options(self):
|
def test_serialize_plans_includes_stars_only_subscription_options(self):
|
||||||
settings = Settings(
|
settings = Settings(
|
||||||
_env_file=None,
|
_env_file=None,
|
||||||
|
|||||||
Reference in New Issue
Block a user