4.6 KiB
Сквозная корзина (Persistent Cart) для Remnawave Bedolaga Telegram Bot
Общее описание
Система сквозной корзины позволяет пользователям продолжить оформление подписки после пополнения баланса, не теряя уже выбранные параметры (период, трафик, серверы, устройства и т.д.).
Архитектура
1. Сервис корзины (UserCartService)
Расположение: app/services/user_cart_service.py
Использует Redis для хранения данных корзины между сессиями пользователя.
Основные методы:
save_user_cart(user_id, cart_data, ttl)- сохраняет корзину пользователяget_user_cart(user_id)- возвращает данные корзины пользователяdelete_user_cart(user_id)- удаляет корзину пользователяhas_user_cart(user_id)- проверяет наличие корзины у пользователя
2. Обновленные обработчики подписки
Расположение: app/handlers/subscription/purchase.py
Основные функции:
save_cart_and_redirect_to_topup- сохраняет текущую корзину в Redis при недостатке средств и перенаправляет к пополнениюreturn_to_saved_cart- восстанавливает параметры подписки из Redis и продолжает процесс оформленияclear_saved_cart- очищает сохраненную корзину
3. Обновленные клавиатуры
Расположение: app/keyboards/inline.py
Основные изменения:
get_insufficient_balance_keyboard- добавлена поддержка флагаhas_saved_cartдля отображения кнопки возврата к оформлениюget_insufficient_balance_keyboard_with_cart- обновлена для использования флагаhas_saved_cartget_main_menu_keyboard- добавлен параметрhas_saved_cartдля отображения кнопки возврата к оформлению
4. Интеграция с главным меню
Расположение: app/handlers/menu.py
Функция show_main_menu теперь проверяет наличие сохраненной корзины и отображает соответствующую кнопку.
Использование
Сохранение корзины
Когда пользователь не может завершить покупку из-за недостатка средств, его параметры автоматически сохраняются в Redis с TTL 1 час.
Восстановление корзины
При пополнении баланса пользователь может вернуться к оформлению подписки, нажав на кнопку "Вернуться к оформлению подписки" или через главное меню, если у него есть сохраненная корзина.
Очистка корзины
Корзина автоматически очищается после успешного оформления подписки или по запросу пользователя.
Тестирование
Тесты расположены в:
tests/test_user_cart_service.py- модульные тесты сервиса корзиныtests/test_subscription_cart_integration.py- интеграционные тесты
Безопасность
- Данные корзины хранятся в Redis с ограниченным временем жизни (TTL)
- Используется идентификатор пользователя для изоляции данных
- Корзина автоматически очищается после успешной покупки
Масштабируемость
- Использование Redis позволяет системе масштабироваться на несколько инстансов бота
- TTL автоматически очищает старые данные
- Нагрузка на Redis минимальна благодаря короткому времени хранения данных