Files
ospab.host/NEW_FEATURES.md
2025-11-23 14:35:16 +03:00

245 lines
11 KiB
Markdown
Raw 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.
# Новые функции: Сессии, 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 ✅ | Тестирование ⏳