BIG_UPDATE deleted vps, added s3 infrastructure.

This commit is contained in:
Georgiy Syralev
2025-11-23 14:35:16 +03:00
parent ae1f93a934
commit c4c2610480
173 changed files with 22684 additions and 5894 deletions

244
NEW_FEATURES.md Normal file
View File

@@ -0,0 +1,244 @@
# Новые функции: Сессии, QR-авторизация и улучшенные тикеты
## 📋 Что было сделано
### ✅ Backend
1. **Система управления сессиями**
- Новая таблица `session` для хранения JWT refresh tokens
- Отслеживание: IP, user-agent, устройство, браузер, геолокация
- Лимит: максимум 10 сессий на пользователя
- Автоматическое удаление старых сессий (30 дней)
- API endpoints:
- `GET /api/sessions` - список всех активных сессий
- `GET /api/sessions/history` - история входов
- `DELETE /api/sessions/:id` - завершить конкретную сессию
- `DELETE /api/sessions/others/all` - завершить все остальные сессии
2. **QR-авторизация (как в Telegram Web)**
- Новая таблица `qr_login_request`
- Генерация уникальных QR-кодов (crypto-based)
- Время жизни: 60 секунд
- Polling механизм для проверки статуса (каждые 2 сек)
- API endpoints:
- `POST /api/qr-auth/generate` - создать QR-код (публичный)
- `GET /api/qr-auth/status/:code` - проверить статус (публичный, polling)
- `POST /api/qr-auth/confirm` - подтвердить вход с мобильного (требует авторизации)
- `POST /api/qr-auth/reject` - отклонить вход (требует авторизации)
3. **Улучшенная система тикетов**
- Новые поля в таблице `ticket`:
- `priority` (low/normal/high/urgent)
- `category` (general/technical/billing/other)
- `assignedTo` (оператор, которому назначен тикет)
- `closedAt` (дата закрытия)
- Новые таблицы:
- `ticket_attachment` - файлы к тикетам
- `response_attachment` - файлы к ответам
- Новое поле в `response`:
- `isInternal` - внутренние комментарии для операторов
- Поддержка файлов: max 5 файлов по 10MB (jpeg/png/gif/pdf/doc/txt/zip)
- Статусы: open → in_progress → awaiting_reply → resolved → closed
- API endpoints:
- `GET /api/ticket/:id` - получить один тикет
- `POST /api/ticket/status` - изменить статус (только операторы)
- `POST /api/ticket/assign` - назначить оператора (только операторы)
- Обновлены существующие endpoints для поддержки новых полей
### ✅ Frontend
1. **Страница управления сессиями**
- Путь: `/dashboard/settings/sessions`
- Компонент: `frontend/src/pages/dashboard/settings/sessions.tsx`
- Функции:
- Список всех активных сессий с карточками
- Текущая сессия выделена зелёным
- Информация: устройство, браузер, IP, геолокация, последняя активность
- Кнопка "Завершить сессию" на каждой карточке
- Кнопка "Завершить все остальные сессии"
- Раздел истории входов (последние 20 попыток)
- Советы по безопасности
2. **Компонент QR-авторизации**
- Путь: `frontend/src/components/QRLogin.tsx`
- Функции:
- Генерация и отображение QR-кода
- Таймер обратного отсчёта (60 секунд)
- Автообновление истёкшего QR
- Polling статуса каждые 2 секунды
- Автоматический вход при подтверждении
- Инструкции для пользователя
- TODO: Интегрировать на страницу `/login` как альтернативу паролю
3. **Новая страница списка тикетов**
- Путь: `/dashboard/tickets-new`
- Компонент: `frontend/src/pages/dashboard/tickets/index.tsx`
- Функции:
- Современный card-дизайн
- Фильтры по статусу, категории, приоритету
- Цветные бейджи статусов
- Индикаторы приоритета
- Иконки категорий
- Счётчик ответов
- Относительное время обновления
- Кнопка создания нового тикета
4. **Страница просмотра тикета**
- Путь: `/dashboard/tickets-new/:id`
- Компонент: `frontend/src/pages/dashboard/tickets/detail.tsx`
- Функции:
- Полная информация о тикете
- История ответов в хронологическом порядке
- Внутренние комментарии (жёлтый фон, только операторы)
- Форма добавления нового ответа
- Кнопка закрытия тикета
- Бейджи статуса и приоритета
- Аватары пользователей
5. **Страница создания тикета**
- Путь: `/dashboard/tickets/new`
- Компонент: `frontend/src/pages/dashboard/tickets/new.tsx`
- Функции:
- Форма с полями: тема, категория, приоритет, описание
- Валидация полей
- Советы по созданию тикетов
- Перенаправление на созданный тикет
## 📁 Структура файлов
### Backend
```
backend/
├── src/
│ ├── index.ts (добавлены новые routes)
│ └── modules/
│ ├── session/
│ │ ├── session.controller.ts (NEW)
│ │ └── session.routes.ts (NEW)
│ ├── qr-auth/
│ │ ├── qr-auth.controller.ts (NEW)
│ │ └── qr-auth.routes.ts (NEW)
│ └── ticket/
│ ├── ticket.controller.ts (REWRITTEN)
│ └── ticket.routes.ts (UPDATED)
├── prisma/
│ ├── schema.prisma (обновлена)
│ ├── apply-migration.ts (NEW - скрипт применения миграции)
│ └── migrations_manual/
│ └── add_sessions_qr_tickets_features.sql (NEW)
└── uploads/
└── tickets/ (NEW)
```
### Frontend
```
frontend/
├── src/
│ ├── components/
│ │ └── QRLogin.tsx (NEW)
│ └── pages/
│ └── dashboard/
│ ├── mainpage.tsx (добавлены routes)
│ ├── settings/
│ │ └── sessions.tsx (NEW)
│ └── tickets/
│ ├── index.tsx (NEW)
│ ├── detail.tsx (NEW)
│ └── new.tsx (NEW)
└── package.json (добавлен qrcode.react)
```
## 🔧 Технические детали
### База данных
- **Миграция применена**: ✅
- **Prisma client сгенерирован**: ✅
- **Новые таблицы**:
- `session` (10 столбцов)
- `login_history` (9 столбцов)
- `qr_login_request` (9 столбцов)
- `ticket_attachment` (7 столбцов)
- `response_attachment` (7 столбцов)
### Зависимости
- **Backend**: Без новых зависимостей (используются встроенные)
- **Frontend**:
- `qrcode.react` ✅ установлен
### Компиляция
- **Backend**: ✅ Собран без ошибок (`npm run build`)
- **Frontend**: ✅ Собран без ошибок (`npm run build`)
## 📝 TODO
### Осталось сделать:
1. **Интеграция QR-компонента на страницу входа**
- Добавить переключатель "Пароль / QR-код" на `/login`
- Импортировать компонент `QRLogin`
2. **Добавить ссылку на сессии в меню настроек**
- В сайдбаре дашборда добавить пункт "Сессии" в разделе настроек
3. **Тестирование**
- Проверить создание/просмотр/ответ на тикеты
- Проверить фильтры тикетов
- Проверить управление сессиями
- Протестировать QR-авторизацию (требуется мобильное приложение)
4. **Дополнительные улучшения (опционально)**:
- WebSocket для real-time обновлений тикетов
- Загрузка файлов в тикеты (multer настроен, нужен UI)
- Интеграция API геолокации (сейчас заглушка "Россия, Москва")
- Email-уведомления о новых ответах
- Push-уведомления для мобильных устройств
## 🚀 Деплой
### Backend:
```bash
cd backend
npm run build
# Перезапустить PM2 или сервер
pm2 reload ecosystem.config.js
```
### Frontend:
```bash
cd frontend
npm run build
# Скопировать dist/ на production сервер
```
## 🔗 API Endpoints
### Сессии
- `GET /api/sessions` - Список активных сессий
- `GET /api/sessions/history?limit=20` - История входов
- `DELETE /api/sessions/:id` - Завершить сессию
- `DELETE /api/sessions/others/all` - Завершить все остальные
### QR-авторизация
- `POST /api/qr-auth/generate` - Сгенерировать QR
- `GET /api/qr-auth/status/:code` - Проверить статус
- `POST /api/qr-auth/confirm` - Подтвердить вход
- `POST /api/qr-auth/reject` - Отклонить вход
### Тикеты (новые/обновлённые)
- `GET /api/ticket/:id` - Получить один тикет
- `POST /api/ticket/status` - Изменить статус
- `POST /api/ticket/assign` - Назначить оператора
## 📱 Мобильное приложение
Для полноценной работы QR-авторизации требуется мобильное приложение, которое:
1. Умеет сканировать QR-коды
2. Может отправить POST запрос на `/api/qr-auth/confirm` с кодом
3. Передаёт авторизационный токен пользователя
Формат QR-кода: `ospabhost://qr-login?code={уникальный_код}`
---
**Дата создания**: 9 ноября 2025
**Статус**: Backend ✅ | Frontend ✅ | Тестирование ⏳