75 lines
4.6 KiB
Markdown
75 lines
4.6 KiB
Markdown
# Сквозная корзина (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 минимальна благодаря короткому времени хранения данных |