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

191 lines
6.5 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 REST API
REST API для универсальной системы чатов Django.
## Структура
```
communications/api/
├── __init__.py # Документация модуля
├── serializers.py # DRF serializers (Chat, Message, Poll)
├── viewsets.py # DRF ViewSets (CRUD операции)
└── urls.py # URL routing с DRF router
```
## Установка
### В текущем проекте (уже настроено):
```python
# api/v1/urls.py
from communications.api.viewsets import ChatViewSet, MessageViewSet, PollViewSet
router.register(r"communications/chats", ChatViewSet, basename="chats")
router.register(r"communications/messages", MessageViewSet, basename="messages")
router.register(r"communications/polls", PollViewSet, basename="polls")
```
### Для standalone использования:
```python
# settings.py
INSTALLED_APPS = [
'rest_framework',
'communications',
]
# urls.py
from django.urls import path, include
from communications.api.urls import router as communications_router
urlpatterns = [
path('api/communications/', include(communications_router.urls)),
]
```
## API Endpoints
### Chats
- `GET /api/v1/communications/chats/` - список чатов
- `GET /api/v1/communications/chats/{id}/` - детали чата
- `POST /api/v1/communications/chats/` - создать чат
- `POST /api/v1/communications/chats/{id}/pin/` - закрепить/открепить
- `POST /api/v1/communications/chats/{id}/notifications/` - вкл/выкл уведомления
- `GET /api/v1/communications/chats/{id}/messages/` - список сообщений (с автоотметкой)
- `GET /api/v1/communications/chats/{id}/messages_around/` - сообщения вокруг (с автоотметкой)
### Messages
- `GET /api/v1/communications/messages/` - список сообщений
- `GET /api/v1/communications/messages/{id}/` - детали сообщения
- `POST /api/v1/communications/messages/` - отправить сообщение
- `PATCH /api/v1/communications/messages/{id}/` - редактировать сообщение
- `DELETE /api/v1/communications/messages/{id}/` - удалить сообщение
- `POST /api/v1/communications/messages/{id}/forward/` - переслать
- `POST /api/v1/communications/messages/{id}/react/` - реакция
- `POST /api/v1/communications/messages/bulk_delete/` - массовое удаление
- `GET /api/v1/communications/messages/search/` - поиск
### Polls
- `GET /api/v1/communications/polls/` - список голосований
- `GET /api/v1/communications/polls/{id}/` - детали голосования
- `POST /api/v1/communications/polls/` - создать голосование
- `POST /api/v1/communications/polls/{id}/vote/` - проголосовать
- `POST /api/v1/communications/polls/{id}/close_poll/` - закрыть голосование
## Serializers
### Chat Serializers
- `ChatListSerializer` - облегченный список чатов
- `ChatDetailSerializer` - детальная информация о чате
- `ChatMembershipSerializer` - членство в чате
- `ChatUserSettingsSerializer` - настройки пользователя
### Message Serializers
- `MessageListSerializer` - список сообщений
- `MessageDetailSerializer` - детали сообщения
- `MessageCreateSerializer` - создание сообщения
- `MessageEditSerializer` - редактирование
- `MessageAttachmentSerializer` - вложения
- `MessageReactionSerializer` - реакции
- `ForwardMessageSerializer` - пересылка
- `BulkDeleteSerializer` - массовое удаление
### Poll Serializers
- `PollSerializer` - голосование
- `PollOptionSerializer` - варианты ответа
## Новые поля (GenericFK)
Все serializers поддерживают универсальную систему с GenericForeignKey:
```python
{
"id": 1,
"name": "Чат отдела",
# NEW: универсальные поля
"context_object_id": 5, # ID связанного объекта
"context_type": "department", # Тип объекта
"context_app": "employees", # Приложение
"flags": {"is_primary": true}, # JSON флаги
"extra_data": {}, # Дополнительные данные
"include_all_users": false, # Доступ для всех
# DEPRECATED: для обратной совместимости
"is_main": true,
"department": 5
}
```
## Примеры использования
### Получить список чатов:
```python
import requests
response = requests.get(
'http://localhost:8000/api/v1/communications/chats/',
headers={'Authorization': 'Bearer <token>'}
)
chats = response.json()
```
### Отправить сообщение:
```python
response = requests.post(
'http://localhost:8000/api/v1/communications/messages/',
json={
'chat': 1,
'content': 'Привет!',
'message_type': 'text'
},
headers={'Authorization': 'Bearer <token>'}
)
```
### Создать чат с GenericFK:
```python
from communications.api.serializers import ChatDetailSerializer
from communications.models import Chat
from employees.models import Department
dept = Department.objects.get(id=5)
chat = Chat.objects.create(
name="Новый чат",
type="department",
context_object=dept, # GenericFK
flags={"is_primary": True}
)
```
## Тестирование
```bash
# System check
python manage.py check
# Запуск тестов
python test_phase3.py
# Unit-тесты (если настроены)
pytest communications/tests/
```
## История
- **11 марта 2026**: Перенесен из `api/v1/communications/` для автономности
- **Январь 2026**: Миграция с FBV на ViewSets
- **Фаза 3**: Добавлена поддержка GenericFK (context_object, flags, extra_data)
## Документация
- [Полная документация рефакторинга](../../docs/completed/API_REFACTORING_STANDALONE.md)
- [Фаза 3: GenericFK](../../docs/completed/CHAT_REFACTORING_PHASE3_COMPLETE.md)
- [Руководство по чатам](../../docs/guides/CHAT_REFACTORING_QUICKSTART.md)
## Поддержка
- Обратная совместимость: ✅ Сохранена для `department`, `is_main`
- Django: 5.2.4+
- DRF: 3.14+
- Python: 3.12+