- Перенос 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)
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 соединений