lizerk d491cbdff9 refactor: Сделать communications приложение автономным
- Перенос REST API в communications/api/ для standalone использования
  * Создан communications/api/ с serializers.py, viewsets.py, urls.py
  * Перенесено 1668 строк (442 serializers + 1226 viewsets)
  * Удалена директория api/v1/communications/
  * Обновлены импорты в api/v1/urls.py и api/v2/communications/views.py

- Извлечение WebSocket логики в ChatConsumerMixin
  * Создан communications/consumers.py (709 строк, 32 метода)
  * Перенесены chat event handlers, action handlers, helper methods
  * realtime/consumers.py сокращен с 862 до 211 строк (-75%)
  * Сохранено одно WebSocket соединение через наследование миксина

- Архитектура:
  * communications теперь полностью автономно (REST API + WebSocket)
  * realtime/UserConsumer наследуется от ChatConsumerMixin
  * 0 breaking changes, обратная совместимость 100%
  * Одно WebSocket соединение для всех real-time событий

- Созданы тесты и документация:
  * test_phase3.py - проверка API serializers, filters, WebSocket
  * docs/completed/API_REFACTORING_STANDALONE.md
  * docs/completed/WEBSOCKET_REFACTORING_MIXIN.md
  * docs/completed/CHAT_REFACTORING_PHASE3_COMPLETE.md

Результат:
  ✅ System check: 0 ошибок
  ✅ Phase 3 tests: все прошли
  ✅ Готово к standalone использованию (pip install django-communications)
2026-03-11 15:34:51 +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 соединений