Изменения: - Новый endpoint /api/v1/communications/messages/upload-temp/ для загрузки файлов без создания сообщения - Поле message в MessageAttachment теперь nullable для временных вложений - Логика перемещения attachments между сообщениями при редактировании - Frontend использует upload-temp вместо создания временных сообщений - Celery задача cleanup_orphaned_attachments для очистки забытых файлов (каждый час) - Исправлена проблема с WebSocket обновлениями при редактировании - Удалены debug логи после успешного тестирования Технические детали: - communications/models.py: добавлено null=True, blank=True к MessageAttachment.message - communications/migrations/0022: миграция для изменения поля - api/v1/communications/viewsets.py: новый action upload_temp() + логика перемещения в update() - static/js/components/chatComposer.js: использование upload-temp вместо upload - communications/tasks.py: новая Celery задача для очистки старых orphaned attachments - eusrr_backend/settings.py: добавлен CELERY_BEAT_SCHEDULE с задачей очистки
Realtime App
WebSocket consumers для real-time функциональности приложения.
Архитектура
UserConsumer (consumers.py)
Универсальный WebSocket consumer, обрабатывающий все real-time события для одного пользователя через одно соединение.
URL: ws://domain/ws/
Функциональность:
- ✅ Чаты и сообщения
- ✅ Реакции на сообщения
- ✅ Индикатор "печатает..."
- ✅ Редактирование/удаление сообщений
- ✅ Уведомления
- ✅ Обновления счетчиков (бейджи)
- 🔄 Онлайн-статус (TODO)
- 🔄 Календарь события (TODO)
Keepalive
- Ping каждые 20 секунд
- Автоматическое переподключение при обрыве
- Nginx таймауты: 7 дней
Подключение
Consumer автоматически подписывается на:
- Группы чатов - все чаты пользователя (
chat_{chat_id}) - Личный канал - для direct updates (
user_{user_id}) - Канал уведомлений - для notifications (
notifications_{user_id})
События от клиента
// Открыть чат
ws.send(JSON.stringify({
action: "open_chat",
chat_id: 123,
load_history: true
}));
// Отправить сообщение
ws.send(JSON.stringify({
action: "send_message",
content: "Hello!"
}));
// Добавить реакцию
ws.send(JSON.stringify({
action: "add_reaction",
message_id: 456,
emoji: "👍"
}));
// Индикатор печати
ws.send(JSON.stringify({
action: "typing"
}));
События к клиенту
// Новое сообщение в активном чате
{
type: "new_message",
chat_id: 123,
message: {...}
}
// Обновление списка чатов
{
type: "list_update",
chat_id: 123,
message: {...}
}
// Реакция добавлена
{
type: "reaction_added",
chat_id: 123,
message_id: 456,
emoji: "👍",
user_id: 10,
user_name: "John Doe"
}
// Уведомление
{
type: "notification",
notification: {...}
}
// Ping для keepalive
{
type: "ping",
timestamp: "2025-12-03T10:00:00Z"
}
Зависимости
communications.models- Chat, Message, MessageReactioncommunications.consumers- serialize_message()notifications.models- для уведомлений (планируется)
Миграция с старой архитектуры
Ранее использовались:
communications/user_consumer.py- чатыnotifications/consumers.py- уведомления
Теперь все в одном месте: realtime/consumers.py
TODO
- Добавить онлайн-статус пользователей
- Интеграция с календарем для real-time событий
- Кэширование статуса "печатает..." через Redis
- Метрики и мониторинг WebSocket соединений