Corp/docs/in-progress/COMMUNICATIONS_STATUS.md
Игорь Надеин 2b61564837 feat(communications): Реализация управления уведомлениями чатов и оптимизация
- Добавлен API endpoint для включения/выключения уведомлений чата
- Реализован frontend для управления уведомлениями через меню чата
- Обновлены сигналы для проверки настроек notifications_enabled
- Стандартизирована логика уведомлений для всех типов чатов
- Оптимизированы запросы к БД (1 запрос вместо N для ChatUserSettings)
- Переведены детальные логи с INFO на DEBUG уровень

Файлы:
- backend/api/v1/communications/views.py (новый endpoint)
- backend/api/v1/urls.py (новый маршрут)
- backend/static/js/components/chatMenuActions.js (полная реализация)
- backend/communications/notification_signals.py (проверка настроек + оптимизация)
- backend/notifications/services.py (оптимизация логирования)
2026-01-08 14:39:40 +03:00

742 lines
32 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.

# Текущее состояние приложения Communications
**Дата анализа:** 8 января 2026 г.
**Ветка:** feature/communications-work
---
## 📊 Общий обзор
Приложение **communications** представляет собой полнофункциональный корпоративный мессенджер, интегрированный в систему EUSRR. Основная работа по реализации функционала выполнена, включая модели данных, WebSocket коммуникацию, REST API и базовый фронтенд.
---
## ✅ Что полностью реализовано
### 1. **Модели данных** (15 моделей)
Все модели созданы и протестированы через миграции (20 миграций применено):
#### Основные модели:
- **Chat** - базовая модель чата с типами: `private`, `group`, `department`, `channel`, `announcement`, `global`
- Поля: name, description, avatar, created_by, include_all_employees
- Блокировка чатов (для announcement)
- Уникальные ограничения для main-чатов
- **Message** - сообщения с расширенным функционалом
- Редактирование: `is_edited`, `edited_at`, `edit_history`
- Мягкое удаление: `is_deleted`, `deleted_at`, `deleted_by`
- Ответы: `reply_to`
- Системные сообщения: `is_system`, `system_type`, `system_metadata`
- Закрепление: `is_pinned`, `pinned_by`, `pinned_at`
- Пересылка: `is_forwarded`
- Вложения: `has_attachments`
- Треды: `thread_root`, `thread_reply_count`
- **ChatReadState** - состояние прочтения
- Последнее прочитанное: `last_read_at`, `last_read_message`
- Упоминания: `unread_mentions_count`
- Треды: `unread_thread_replies_count`
- Статус набора: `is_typing`, `typing_updated_at`
#### Настройки пользователя:
- **ChatUserSettings** - персональные настройки чата
- Закрепление: `is_pinned`, `pinned_at`, `pin_order`
- Уведомления: `notifications_enabled`
- Кастомизация: `custom_name`
- Скрытие: `is_hidden`
#### Участники и права:
- **ChatMembership** - участие в чате с ролями
- Роли: `owner`, `admin`, `moderator`, `member`, `guest`
- Права: `can_send_messages`, `can_add_members`, `can_remove_members`, `can_pin_messages`, `can_edit_chat`
- История: `joined_at`, `left_at`, `invited_by`
- **ChatAccessPermission** - временные права доступа
- Уровни: `read`, `write`, `moderate`
- Временные: `expires_at`
- Аудит: `granted_by`, `granted_at`
#### Вложения и медиа:
- **MessageAttachment** - файлы и медиа
- Типы: `image`, `video`, `audio`, `file`
- Превью для изображений: `thumbnail`
- Метаданные: `file_size`, `mime_type`, `file_name`
#### Пересылка и ответы:
- **ForwardedMessage** - информация о пересылке
- Цепочка: `original_message`, `immediate_source`
- Счетчик: `forward_count`
- Сохранение контента при удалении оригинала
- **MessageReply** - расширенная информация об ответах
- Типы: `inline`, `quote`, `thread`
- Кросс-чат: `is_cross_chat_reply`
- Сохранение контекста
- **CrossChatMessage** - отправка в чужие чаты
- Модерация: `approved`, `approved_by`, `approved_at`
- Режимы отображения: `guest`, `forwarded`, `announcement`
- Причина: `reason`
#### Реакции:
- **MessageReaction** - реакции на сообщения
- Эмодзи и пользователь
- Временные метки
- **AvailableReaction** - доступные реакции
- Unicode emoji
- Категории и популярность
- Активация/деактивация
#### Опросы (новое):
- **Poll** - опросы в чатах
- Типы: `single`, `multiple`, `quiz`
- Анонимность, публичные результаты
- Ограничение по времени: `closes_at`
- Статистика голосов
- **PollOption** - варианты ответа
- Текст и порядок
- Счетчик голосов
- **PollVote** - голоса пользователей
- Отслеживание выбора
- Временные метки
---
### 2. **WebSocket Consumer** (consumers.py)
**ChatConsumer** полностью реализован:
#### Поддерживаемые действия:
- `send_message` - отправка сообщений (с reply_to)
- `edit_message` - редактирование в реальном времени
- `delete_message` - мягкое удаление
- `add_reaction` - добавление реакции
- `remove_reaction` - удаление реакции
- `typing` - начало набора текста
- `stop_typing` - окончание набора
#### Real-time события:
- `chat.message` - новое сообщение
- `chat.message_edited` - сообщение отредактировано
- `chat.message_deleted` - сообщение удалено
- `chat.reaction_added` - реакция добавлена
- `chat.reaction_removed` - реакция удалена
- `chat.user_typing` - пользователь печатает
- `chat.user_stopped_typing` - пользователь остановил печатать
#### Особенности:
- Полная сериализация сообщений с вложениями
- Обработка пересланных сообщений
- Информация о реакциях всех пользователей
- Превью ответов
- Автоматическая группировка по чатам
---
### 3. **Views и URL** (views.py, urls.py)
#### Реализованные view:
- **ChatListView** - список чатов пользователя
- Отображение последних сообщений
- Счетчик непрочитанных
- Фильтрация по типам
- **ChatDetailView** - детальный просмотр чата
- Пагинация сообщений (50 на страницу)
- Форма отправки
- Проверка прав доступа
- Загрузка истории (before/after timestamp)
- **start_private_chat** - создание приватного чата
- Автоматический поиск существующего
- Создание нового при необходимости
- **chat_mark_read** - отметка как прочитанное
- Обновление ChatReadState
#### URL маршруты:
```
/communications/chats/ - список чатов
/communications/chats/<id>/ - детали чата
/communications/chats/start/<employee_id>/ - начать личный чат
/communications/chats/<id>/mark-read/ - отметить прочитанным
```
---
### 4. **Frontend** (JavaScript модули)
#### Реализованные JS модули:
**chat-detail-enhanced.js** (~500 строк):
- WebSocket интеграция
- Редактирование сообщений
- Удаление сообщений
- Быстрые реакции (6 эмодзи при наведении)
- Ответы на сообщения
- Индикатор "печатает..."
- Отображение вложений
- Информация о пересылке
- Автопереподключение WebSocket
**chat-reactions-integration.js**:
- Обработка WS событий реакций
- Обновление UI реакций в реальном времени
**chat-detail-init.js**:
- Инициализация модулей
- Настройка WebSocket подключения
#### CSS стили:
**css/components/chat-list-enhanced.css**:
- Стили для списка чатов
- Контекстное меню
- Закрепленные чаты (желтый фон)
- Анимация обновлений
**css/components/chat-enhanced.css** (частично):
- Превью ответов
- Информация о пересылке
- Кнопки действий
- Реакции
- Вложения
---
### 5. **Админ-панель** (admin.py)
Полностью настроена для всех моделей:
- Inline редактирование вложений
- Inline редактирование участников
- Фильтры по типам, статусам
- Поиск по названию, контенту
- Read-only поля для системных данных
---
## ⚠️ Что требует доработки
### 1. **REST API** ✅ РЕАЛИЗОВАНО!
✅ **API реализован в отдельном приложении** `backend/api/v1/communications/`
#### Реализованные endpoints (18 штук):
**Чаты:**
- ✅ `GET /api/v1/communications/chats/` - список чатов пользователя
- ✅ `POST /api/v1/communications/chats/create/` - создание чата
- ✅ `GET /api/v1/communications/chats/<pk>/messages/` - загрузка истории
- ✅ `POST /api/v1/communications/chats/<chat_id>/pin/` - закрепление чата
**Сообщения:**
- ✅ `POST /api/v1/communications/upload-message/` - отправка с вложениями
- ✅ `POST /api/v1/communications/messages/<id>/edit/` - редактирование
- ✅ `POST /api/v1/communications/messages/<id>/delete/` - удаление
- ✅ `POST /api/v1/communications/messages/forward/` - пересылка
- ✅ `POST /api/v1/communications/messages/bulk-delete/` - массовое удаление
**Реакции:**
- ✅ `GET /api/v1/communications/reactions/available/` - доступные реакции
- ✅ `GET /api/v1/communications/messages/<id>/reactions/` - реакции сообщения
- ✅ `POST /api/v1/communications/messages/<id>/react/` - добавить реакцию
- ✅ `POST /api/v1/communications/messages/<id>/unreact/` - удалить реакцию
**Опросы (Polls):**
- ✅ `POST /api/v1/communications/polls/create/` - создание опроса
- ✅ `POST /api/v1/communications/polls/<id>/vote/` - голосование
- ✅ `POST /api/v1/communications/polls/<id>/close/` - закрытие опроса
- ✅ `GET /api/v1/communications/polls/<id>/results/` - результаты
**Файлы:**
- ✅ Загрузка файлов интегрирована в `upload_message_with_attachments`
- ✅ Автоопределение типа файла (image/video/audio/file)
- ✅ Сохранение метаданных (размер, MIME-тип, имя)
**Статус:** ✅ Полностью реализовано
**Приоритет:** Завершено
### Недостающие endpoints (низкий приоритет):
❌ `POST /api/v1/communications/chats/<id>/update/` - обновление чата
❌ `POST /api/v1/communications/chats/<id>/notifications/` - настройки уведомлений
❌ `POST /api/v1/communications/messages/<id>/pin/` - закрепление сообщения
❌ `POST /api/v1/communications/chats/<id>/member/add/` - добавление участника
❌ `POST /api/v1/communications/chats/<id>/member/remove/` - удаление участника
### 2. **Опросы (Polls)** ✅ Backend готов!
✅ Модели созданы (Poll, PollOption, PollVote)
✅ Админ-панель настроена
✅ **API полностью реализован** (4 эндпоинта):
- `POST /polls/create/` - создание с настройками (анонимность, множественный выбор, викторина)
- `POST /polls/<id>/vote/` - голосование с валидацией
- `POST /polls/<id>/close/` - закрытие опроса
- `GET /polls/<id>/results/` - получение результатов
✅ WebSocket интеграция (отправка через chat.message)
✅ Поддержка викторин с правильными ответами
✅ Автозакрытие опросов по таймеру
❌ Frontend UI не реализован
**Требуется:**
- Модальное окно создания опроса
- Отображение опросов в чате
- UI голосования
- Визуализация результатов (графики)
- Отображение правильных ответов в викторинах
**Статус:** 🟡 Backend готов, нужен Frontend
**Приоритет:** Средний
### 3. **Вложения (Attachments)** ✅ Полностью работает!
✅ Модель MessageAttachment создана
✅ Связь с Message настроена
✅ **Upload endpoint реализован** (`/upload-message/`)
✅ Автоопределение типа файла (image/video/audio/file)
✅ Сохранение метаданных (размер, MIME-тип, имя)
✅ Отправка через WebSocket с полной информацией
🟡 Frontend частично реализован (отображение файлов)
❌ Drag & drop загрузка не реализована
❌ Прогресс-бар загрузки отсутствует
❌ Превью для видео/аудио базовое
**Требуется доработать:**
- Drag & drop интерфейс
- Прогресс-бар при загрузке
- Превью для видео с плеером
- Превью для аудио с waveform
- Валидация размера файлов (клиент)
- Пакетная загрузка нескольких файлов
**Статус:** ✅ Backend готов, Frontend требует улучшения
**Приоритет:** Средний
### 4. **Пересылка сообщений (Forward)** ✅ Полностью работает!
✅ Модель ForwardedMessage создана
✅ Поля в Message добавлены (is_forwarded, metadata)
✅ **API endpoint реализован** (`POST /messages/forward/`)
✅ Поддержка пересылки нескольких сообщений
✅ Сохранение цепочки пересылок
✅ Копирование вложений
✅ WebSocket уведомления
✅ Отображение метаданных (оригинальный автор, чат, дата)
❌ UI выбора целевого чата не реализован
❌ Модальное окно для пересылки отсутствует
**Требуется доработать:**
- Модальное окно с выбором чата
- Список доступных чатов для пересылки
- Предпросмотр пересылаемых сообщений
- Возможность добавить комментарий к пересылке
**Статус:** ✅ Backend готов, нужен UI
**Приоритет:** Средний
### 5. **Треды (Threads)**
✅ Поля в Message (`thread_root`, `thread_reply_count`)
❌ UI для тредов отсутствует
❌ WebSocket обработка отсутствует
❌ Боковая панель для тредов не реализована
**Требуется:**
- Боковая панель с тредами
- Счетчики ответов
- Навигация по тредам
- WebSocket события для тредов
**Статус:** ❌ Не реализовано
**Приоритет:** Низкий
### 6. **Упоминания (@mentions)**
✅ Поле `unread_mentions_count` в ChatReadState
❌ Парсинг @username в тексте
❌ Подсветка упоминаний
❌ Уведомления об упоминаниях
❌ Автодополнение при вводе @
**Требуется:**
- Regex парсинг @username
- Подсветка в UI
- Интеграция с notifications
- Dropdown с предложениями пользователей
**Статус:** ❌ Не реализовано
**Приоритет:** Средний
### 7. **Поиск по сообщениям**
❌ Полностью отсутствует
**Требуется:**
- Поисковая строка в чате
- Full-text search по содержимому
- Фильтры (дата, автор, тип)
- Навигация по результатам
- Подсветка найденного текста
**Статус:** ❌ Не реализовано
**Приоритет:** Средний
### 8. **Контекстное меню чатов** 🟡 Частично
🟡 Частично реализовано в CSS
✅ **API endpoints реализованы:**
- `POST /chats/<id>/pin/` - закрепление/открепление
- Остальные действия можно сделать через существующие endpoints
❌ JavaScript обработчики контекстного меню отсутствуют
❌ Модальные окна для действий не реализованы
**Функции контекстного меню:**
- ✅ Закрепить/открепить чат (API готов)
- ❌ Выключить уведомления (нужен UI)
- ❌ Скрыть чат (нужен UI)
- ❌ Отметить прочитанным (есть endpoint, нужен UI)
- ❌ Покинуть чат (нужна реализация)
- ❌ Удалить чат (для владельца)
**Статус:** 🟡 API готов, нужны JS обработчики
**Приоритет:** Средний
### 9. **Групповые чаты** ✅ Backend готов!
✅ Модель Chat поддерживает type='group'
✅ ChatMembership для участников
✅ **API endpoint реализован** (`POST /chats/create/`)
✅ Поддержка добавления участников при создании
✅ Создатель автоматически добавляется
✅ Загрузка аватара чата
❌ UI создания группового чата отсутствует
❌ Управление участниками не реализовано
❌ Редактирование названия/описания/аватара отсутствует (UI)
**Требуется:**
- Модальное окно создания группы
- Список сотрудников с checkbox для выбора
- UI для управления участниками (добавление/удаление)
- Редактирование информации о группе
- Отображение ролей и прав участников
**Статус:** ✅ Backend готов, нужен UI
**Приоритет:** Высокий
### 10. **Каналы и объявления**
✅ Модели поддерживают channel и announcement
✅ Блокировка чатов реализована
❌ UI для создания канала отсутствует
❌ Система модерации не реализована
❌ Права только на чтение не обработаны
**Статус:** 🟡 Частично
**Приоритет:** Средний
---
## 🔧 Технические проблемы
### 1. **Архитектура API** ✅ Решено!
✅ **API вынесен в отдельное приложение** `backend/api/v1/communications/`
✅ Правильная организация:
- `views.py` - основные API views (14 функций)
- `poll_views.py` - API для опросов (4 функции)
- Регистрация в `api/v1/urls.py`
✅ REST-интерфейс для внешних интеграций
✅ Легко тестировать отдельные функции
✅ Возможна документация API (Swagger)
**Статус:** ✅ Решено
### 2. **Неполная интеграция фронтенда**
Модули `chat-detail-enhanced.js` созданы, но:
- Не все функции подключены
- Отсутствуют модальные окна
- Нет обработки ошибок
- Слабая валидация на клиенте
**Решение:** Завершить интеграцию JS модулей
### 3. **Отсутствие тестов**
Файл `tests.py` существует, но пустой:
- Нет unit-тестов для моделей
- Нет интеграционных тестов API
- Не тестируется WebSocket
- Нет e2e тестов
**Решение:** Написать тесты с pytest/pytest-django
### 4. **Производительность**
Потенциальные проблемы:
- N+1 запросы при загрузке списка чатов
- Не используется select_related/prefetch_related везде
- Нет кэширования часто запрашиваемых данных
- WebSocket группы могут стать узким местом
**Решение:** Оптимизация запросов, Redis для кэша
### 5. **Безопасность**
Требует внимания:
- Загрузка файлов без проверки типа/размера
- Отсутствие rate limiting для API
- XSS уязвимости при отображении контента
- CSRF проверки для API
**Решение:** Добавить валидацию, throttling, санитизацию
---
## 📝 Приоритетный план доработки
### ✅ Завершено в Backend (больше не требуется)
1. ✅ **REST API создан** - 18 эндпоинтов реализовано
2. ✅ **Загрузка файлов работает** - upload endpoint готов
3. ✅ **Групповые чаты (Backend)** - API создания готов
4. ✅ **Опросы (Backend)** - полный цикл реализован
5. ✅ **Пересылка сообщений (Backend)** - API готов
6. ✅ **Реакции** - полностью работают
---
### Этап 1: Критичные UI компоненты (1-2 недели)
1. **Создание групповых чатов (UI)** 🔴
- Модальное окно создания
- Выбор участников (список сотрудников)
- Загрузка аватара
- Установка названия и описания
2. **Модальное окно пересылки** 🔴
- Список доступных чатов
- Выбор целевого чата
- Предпросмотр пересылаемых сообщений
- Интеграция с API `/messages/forward/`
3. **Контекстное меню чатов (JS)** 🔴
- Обработчики ПКМ
- Интеграция с API закрепления
- Действия: скрыть, уведомления, прочитано
- Покинуть/удалить чат
4. **Drag & Drop загрузка файлов** 🔴
- Зона перетаскивания
- Прогресс-бар загрузки
- Превью перед отправкой
- Валидация размера
### Этап 2: Важные UI функции (2-3 недели)
5. **Опросы (UI)** 🟡
- Модальное окно создания опроса
- Отображение опросов в чате
- UI голосования с анимацией
- Графики результатов
- Индикация правильных ответов (викторины)
6. **Управление групповыми чатами** 🟡
- Редактирование названия/описания
- Список участников с ролями
- Добавление/удаление участников
- Управление правами
7. **Упоминания (@mentions)** 🟡
- Парсинг @username в тексте
- Подсветка упоминаний
- Автодополнение при вводе @
- Уведомления об упоминаниях
8. **Поиск по сообщениям** 🟡
- UI поиска в чате
- Full-text search
- Фильтры (дата, автор, тип)
- Навигация по результатам
### Этап 3: Дополнительные функции (3-4 недели)
9. **Треды (Threads)** 🟢
- Боковая панель с тредами
- Счетчики ответов
- Навигация по тредам
- WebSocket для тредов
10. **Каналы и объявления (UI)** 🟢
- UI создания канала
- Модерация сообщений
- Права только на чтение
11. **Оптимизация производительности** 🟢
- Query optimization (select_related/prefetch)
- Redis кэширование
- Индексы БД
- Пагинация везде
12. **Тестирование** 🟢
- Unit тесты для API
- Integration тесты WebSocket
- E2E тесты UI
### Отложенные функции (низкий приоритет)
- Недостающие endpoints (update chat, pin message, manage members)
- Голосовые сообщения
- Видеозвонки
- Экспорт истории чата
- Боты и автоматизация
- Rich text редактор
- Push-уведомления
---
## 🎯 Рекомендации
### Немедленные действия:
1. ✅ **Создать ветку** feature/communications-work (СДЕЛАНО)
2. ✅ **REST API** - полностью реализован (18 endpoints)
3. ✅ **Загрузка файлов** - endpoint работает
4. 🔴 **UI для групповых чатов** - модальное окно создания
5. 🔴 **Модальное окно пересылки** - выбор целевого чата
6. 🟡 **Добавить тесты** - для стабильности API
### Архитектурные решения:
- ✅ **Django function-based views** используются для API (правильный выбор)
- ✅ **WebSocket интеграция** работает корректно
- 🟡 Рассмотреть **Celery** для асинхронной обработки медиа (оптимизация)
- ✅ **Redis** уже используется для Channels
- 🔴 Применить **select_related/prefetch_related** везде (оптимизация)
- 🟡 Внедрить **pytest** для тестирования API
### Документация:
- 🔴 Создать API документацию (можно использовать drf-spectacular)
- 🟡 Написать пользовательские инструкции
- ✅ WebSocket протокол задокументирован (в consumers.py)
- 🟡 Добавить архитектурные диаграммы
---
## 📚 Существующая документация
В папке `backend/communications/`:
- ✅ **MESSENGER_IMPLEMENTATION_COMPLETE.md** - что реализовано
- ✅ **MESSENGER_IMPROVEMENTS.md** - планы улучшений
- ❌ **MESSENGER_INTEGRATION_GUIDE.md** - пусто
- ❌ **MODERN_CHAT_LIST_REDESIGN.md** - пусто
**Требуется обновить документацию под текущее состояние.**
---
## 🔍 Структура файлов
```
backend/communications/
├── models.py ✅ (15 моделей, 1248 строк)
├── views.py ✅ (4 view, 530 строк)
├── consumers.py ✅ (WebSocket, 841 строк)
├── urls.py ✅ (5 маршрутов)
├── admin.py ✅ (админки для всех моделей)
├── forms.py ✅
├── signals.py ✅
├── notification_signals.py ✅
├── context_processors.py ✅
├── tests.py ❌ (пустой)
├── management/
│ └── commands/
│ ├── init_reactions.py ✅
│ └── update_department_chat_names.py ✅
└── migrations/ ✅ (20 миграций)
backend/api/v1/communications/ 🆕
├── views.py ✅ (14 API функций, 1037 строк)
├── poll_views.py ✅ (4 API функции, 398 строк)
└── __init__.py ✅
backend/api/v1/
└── urls.py ✅ (18 маршрутов для communications)
static/js/
├── chat-detail-enhanced.js ✅
├── chat-detail-init.js ✅
├── chat-reactions-integration.js ✅
└── chat-list-enhanced.js.old ❓
static/css/components/
├── chat-enhanced.css 🟡 (частично)
└── chat-list-enhanced.css ✅
templates/communications/
├── chat_list.html ✅
└── chat_detail.html ✅
```
---
## 📊 Статистика кода
- **Python файлы:** ~5900 строк
- communications/: ~3500 строк
- api/v1/communications/: ~1435 строк
- consumers.py: ~841 строк
- **JavaScript:** ~800 строк
- **CSS:** ~400 строк
- **Моделей:** 15
- **Миграций:** 20 (все применены ✅)
- **Django Views:** 4
- **API Endpoints:** 18 ✅
- **WebSocket actions:** 7
- **WS events:** 7
- **URL маршрутов:** 5 (UI) + 18 (API)
---
## ✅ Выводы
### Что хорошо:
1. ✅ Качественная архитектура моделей
2. ✅ Полная WebSocket реализация
3. ✅ **REST API полностью реализован** (18 endpoints)
4. ✅ Расширенная админ-панель
5. ✅ Миграции применены и работают
6. ✅ Базовый фронтенд реализован
7. ✅ **Опросы (Polls) backend готов**
8. ✅ **Загрузка файлов работает**
9. ✅ **Пересылка сообщений backend готов**
### Что требует работы:
1. 🔴 **UI для создания групповых чатов** - критично
2. 🔴 **Модальное окно пересылки** - критично
3. 🔴 **Контекстное меню чатов (JS)** - важно
4. 🟡 **UI для опросов** - важно
5. 🟡 **Drag & Drop загрузки** - улучшение UX
6. 🟡 **Управление участниками групп** - важно
7. ❌ **Нет тестов** - рискованно для продакшена
8. 🟡 **Упоминания (@mentions)** - дополнительная функция
9. 🟡 **Поиск по сообщениям** - улучшение UX
### Готовность к продакшену:
**~80%** - backend практически готов, требуется доработка UI компонентов.
**Backend готовность: 95%**
**Frontend готовность: 60%**
---
**Следующий шаг:** Начать с UI для создания групповых чатов и модального окна пересылки.