feat: Система автоматического подтверждения выигрышей с поддержкой множественных счетов
Some checks reported errors
continuous-integration/drone/push Build encountered an error

Основные изменения:

 Новые функции:
- Система регистрации пользователей с множественными счетами
- Автоматическое подтверждение выигрышей через inline-кнопки
- Механизм переигровки для неподтвержденных выигрышей (24 часа)
- Подтверждение на уровне счетов (каждый счет подтверждается отдельно)
- Скрипт полной очистки базы данных

🔧 Технические улучшения:
- Исправлена ошибка MissingGreenlet при lazy loading (добавлен joinedload/selectinload)
- Добавлено поле claimed_at для отслеживания времени подтверждения
- Пакетное добавление счетов с выбором розыгрыша
- Проверка владения конкретным счетом при подтверждении

📚 Документация:
- docs/AUTO_CONFIRM_SYSTEM.md - Полная документация системы подтверждения
- docs/ACCOUNT_BASED_CONFIRMATION.md - Подтверждение на уровне счетов
- docs/REGISTRATION_SYSTEM.md - Система регистрации
- docs/ADMIN_COMMANDS.md - Команды администратора
- docs/CLEAR_DATABASE.md - Очистка БД
- docs/QUICK_GUIDE.md - Быстрое начало
- docs/UPDATE_LOG.md - Журнал обновлений

🗄️ База данных:
- Миграция 003: Таблицы accounts, winner_verifications
- Миграция 004: Поле claimed_at в таблице winners
- Скрипт scripts/clear_database.py для полной очистки

🎮 Новые команды:
Админские:
- /check_unclaimed <lottery_id> - Проверка неподтвержденных выигрышей
- /redraw <lottery_id> - Повторный розыгрыш
- /add_accounts - Пакетное добавление счетов
- /list_accounts <telegram_id> - Список счетов пользователя

Пользовательские:
- /register - Регистрация с вводом данных
- /my_account - Просмотр своих счетов
- Callback confirm_win_{id} - Подтверждение выигрыша

🛠️ Makefile:
- make clear-db - Очистка всех данных из БД (с подтверждением)

🔒 Безопасность:
- Проверка владения счетом при подтверждении
- Защита от подтверждения чужих счетов
- Независимое подтверждение каждого выигрышного счета

📊 Логика работы:
1. Пользователь регистрируется и добавляет счета
2. Счета участвуют в розыгрыше
3. Победители получают уведомление с кнопкой подтверждения
4. Каждый счет подтверждается отдельно (24 часа на подтверждение)
5. Неподтвержденные выигрыши переигрываются через /redraw
This commit is contained in:
2025-11-16 14:01:30 +09:00
parent 31c4c5382a
commit 505d26f0e9
21 changed files with 4217 additions and 68 deletions

227
scripts/README_CLEAR_DB.md Normal file
View File

@@ -0,0 +1,227 @@
# 🗑️ Скрипт очистки базы данных
## Описание
`clear_database.py` - скрипт для полной очистки всех данных из базы данных бота.
## ⚠️ ВНИМАНИЕ!
**Этот скрипт удаляет ВСЕ данные без возможности восстановления:**
- Всех пользователей
- Все розыгрыши (активные и завершенные)
- Все счета участников
- Все записи об участии
- Всех победителей
- Все записи верификации
## Использование
### Через Makefile (рекомендуется)
```bash
make clear-db
```
Система попросит подтверждение:
```
⚠️ ВНИМАНИЕ! Это удалит ВСЕ данные из базы данных!
- Все пользователи
- Все розыгрыши
- Все счета
- Все участия
- Всех победителей
Вы уверены? Введите 'yes' для подтверждения:
```
### Напрямую через Python
```bash
cd /home/trevor/new_lottery_bot
source .venv/bin/activate
python scripts/clear_database.py
```
## Что делает скрипт
1. **Подключается к базе данных** используя `DATABASE_URL` из `.env`
2. **Удаляет данные в правильном порядке:**
- `winner_verifications` - записи верификации победителей
- `winners` - записи о победителях
- `participations` - записи об участии в розыгрышах
- `accounts` - счета участников
- `lotteries` - розыгрыши
- `users` - пользователи
3. **Сбрасывает счетчики ID (sequences):**
- `users_id_seq` → 1
- `lotteries_id_seq` → 1
- `accounts_id_seq` → 1
- `participations_id_seq` → 1
- `winners_id_seq` → 1
- `winner_verifications_id_seq` → 1
4. **Фиксирует транзакцию** (COMMIT)
5. **Закрывает соединение**
## Вывод скрипта
Пример успешного выполнения:
```
INFO:__main__:🔌 Подключение к базе данных...
INFO:__main__:🗑️ Удаление данных из таблиц...
INFO:__main__:------------------------------------------------------------
INFO:__main__:✅ winner_verifications - удалено 0 строк
INFO:__main__:✅ winners - удалено 2 строк
INFO:__main__:✅ participations - удалено 1 строк
INFO:__main__:✅ accounts - удалено 2 строк
INFO:__main__:✅ lotteries - удалено 1 строк
INFO:__main__:✅ users - удалено 2 строк
INFO:__main__:------------------------------------------------------------
INFO:__main__:🔄 Сброс последовательностей...
INFO:__main__:------------------------------------------------------------
INFO:__main__:✅ users_id_seq
INFO:__main__:✅ lotteries_id_seq
INFO:__main__:✅ accounts_id_seq
INFO:__main__:✅ participations_id_seq
INFO:__main__:✅ winners_id_seq
INFO:__main__:✅ winner_verifications_id_seq
INFO:__main__:------------------------------------------------------------
INFO:__main__:============================================================
INFO:__main__:🎉 ВСЕ ДАННЫЕ УСПЕШНО УДАЛЕНЫ ИЗ БАЗЫ ДАННЫХ!
INFO:__main__:============================================================
INFO:__main__:Следующие ID начнутся с 1:
INFO:__main__: - users.id
INFO:__main__: - lotteries.id
INFO:__main__: - accounts.id
INFO:__main__: - participations.id
INFO:__main__: - winners.id
INFO:__main__: - winner_verifications.id
INFO:__main__:✅ Соединение с БД закрыто
```
## Когда использовать
### ✅ Безопасные сценарии:
- **Разработка/тестирование**: Очистка тестовых данных
- **Staging окружение**: Подготовка к тестированию
- **Миграция**: Перед полным переносом данных
- **Сброс демо**: Возврат к чистому состоянию
### ❌ НЕ использовать:
- **Production база**: НИКОГДА не запускайте на рабочей БД
- **Активные розыгрыши**: Если есть незавершенные розыгрыши
- **Без бэкапа**: Всегда делайте резервную копию перед очисткой
## Безопасность
### Файл читает DATABASE_URL из .env:
```env
DATABASE_URL=postgresql+asyncpg://user:password@host:port/database
```
### Проверка перед запуском:
```bash
# Проверьте что вы на правильной базе
grep DATABASE_URL .env
```
### Создание бэкапа (ОБЯЗАТЕЛЬНО для production):
```bash
# PostgreSQL
pg_dump -h localhost -U bot_user -d bot_db > backup_$(date +%Y%m%d_%H%M%S).sql
# Восстановление
psql -h localhost -U bot_user -d bot_db < backup_20251116_140000.sql
```
## Альтернативы
### Мягкая очистка (сохранение структуры):
```sql
-- Очистить только данные розыгрышей
DELETE FROM winners;
DELETE FROM participations;
DELETE FROM lotteries;
```
### Выборочная очистка:
```sql
-- Удалить только тестовые данные
DELETE FROM users WHERE club_card_number LIKE 'TEST%';
```
## Требования
- Python 3.12+
- Установленные зависимости (`pip install -r requirements.txt`)
- Файл `.env` с корректным `DATABASE_URL`
- Права на изменение данных в БД
## Технические детали
### Используемые библиотеки:
```python
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
```
### Асинхронное выполнение:
```python
async with engine.begin() as conn:
await conn.execute(text('DELETE FROM table_name'))
```
### Обработка транзакций:
- `engine.begin()` - автоматический COMMIT при успехе
- `engine.dispose()` - закрытие всех соединений
## Отладка
### Проблемы с подключением:
```bash
# Проверка доступности БД
psql -h 192.168.0.102 -U bot_user -d bot_db -c "SELECT 1"
```
### Проверка прав:
```sql
-- В psql
SELECT has_database_privilege('bot_user', 'bot_db', 'CONNECT');
SELECT has_table_privilege('bot_user', 'users', 'DELETE');
```
### Логи:
Скрипт использует стандартный logging с уровнем INFO. Для отладки:
```python
logging.basicConfig(level=logging.DEBUG)
```
## См. также
- `docs/ADMIN_GUIDE.md` - Руководство администратора
- `scripts/setup_postgres.sh` - Настройка PostgreSQL
- `migrations/` - Миграции базы данных
- `Makefile` - Все доступные команды