Игорь Надеин fa0948c159 feat(communications): добавлена поддержка редактирования сообщений с изменением attachments
Изменения:
- Новый 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 с задачей очистки
2026-01-15 11:13:54 +03:00
..

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 автоматически подписывается на:

  1. Группы чатов - все чаты пользователя (chat_{chat_id})
  2. Личный канал - для direct updates (user_{user_id})
  3. Канал уведомлений - для 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, MessageReaction
  • communications.consumers - serialize_message()
  • notifications.models - для уведомлений (планируется)

Миграция с старой архитектуры

Ранее использовались:

  • communications/user_consumer.py - чаты
  • notifications/consumers.py - уведомления

Теперь все в одном месте: realtime/consumers.py

TODO

  • Добавить онлайн-статус пользователей
  • Интеграция с календарем для real-time событий
  • Кэширование статуса "печатает..." через Redis
  • Метрики и мониторинг WebSocket соединений