Files
remnawave-bedolaga-telegram…/docs/persistent_cart_system.md

75 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Сквозная корзина (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_cart`
- `get_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 минимальна благодаря короткому времени хранения данных