Перейти к основному содержимому

Конечные точки обмена сообщениями

Модуль "Обмена сообщениями" управляет беседами в реальном времени, сообщениями в чате, отправкой push-уведомлений, доставкой SMS/электронной почты, соединениями WebSocket, частными сообщениями, регистрацией устройств и поставщиками текстовых сообщений. Он предоставляет коммуникационный уровень, используемый во всех приложениях ChurchApps как для прямого чата трансляции, так и для асинхронных уведомлений.

Базовый путь: /messaging

Беседы

Базовый путь: /messaging/conversations

МетодПутьAuthРазрешениеОписание
GET/timeline/ids?ids=JWTЗагрузите беседы по идентификаторам, разделённым запятыми, с первыми/последними сообщениями
GET/messages/:contentType/:contentIdJWTЗагрузите беседы по содержанию с разбивкой на страницы сообщений (?page=&limit=)
GET/postsJWTПолучите беседы типа-публикации для групп текущего пользователя
GET/posts/group/:groupIdJWTПолучите беседы типа-публикации для определённой группы
GET/current/:churchId/:contentType/:contentIdPublicПолучите или создайте текущую беседу по содержанию (автоматически расшифровывает contentId)
GET/:churchId/:contentType/:contentIdPublicЗагрузите беседы по типу содержания и ID
GET/:churchId/:idPublicЗагрузите одну беседу по ID
POST/JWTСоздавайте или обновляйте беседы (пакет)
POST/startJWTНачните новую беседу с начальным сообщением-комментарием
DELETE/:churchId/:idJWTУдалите беседу

Контроль доступа к личным примечаниям

Беседы с contentType: "person" (вкладка "Примечания" в записи о человеке) или contentType: "personConfidential" (раздел "Конфиденциальные примечания") контролируются на каждом пути чтения и записи, включая в противном случае публичные маршруты выше, которые возвращают 401 для этих типов содержания. person требует разрешение MembershipApi Люди / Редактировать; personConfidential требует Люди / Просмотр конфиденциальных примечаний. Для ограниченных ключей API, people:write имеет оба действия (пользователь ключа должен всё ещё иметь базовое разрешение роли).

Пример: начните беседу

POST /messaging/conversations/start
Authorization: Bearer <token>

{
"groupId": "group-123",
"contentType": "group",
"contentId": "group-123",
"title": "Weekly Discussion",
"comment": "Welcome to this week's discussion thread!"
}
{
"id": "conv-456",
"churchId": "church-789",
"contentType": "group",
"contentId": "group-123",
"title": "Weekly Discussion",
"dateCreated": "2026-02-17T10:00:00.000Z",
"visibility": "public",
"allowAnonymousPosts": false,
"groupId": "group-123"
}

Сообщения

Базовый путь: /messaging/messages

МетодПутьAuthРазрешениеОписание
GET/conversation/:conversationIdJWTЗагрузите все сообщения для беседы
GET/catchup/:churchId/:conversationIdPublicЗагрузите все сообщения для беседы (публичное наверстывание для прямого чата)
GET/:churchId/:idPublicЗагрузите одно сообщение по ID
POST/JWTСохраняйте сообщения (пакет). Отправляйте обновления в реальном времени и запускайте уведомления
POST/sendPublicОтправьте сообщения (пакет, публичное). Отправляйте обновления в реальном времени через WebSocket и запускайте уведомления
POST/setCalloutJWT(устарелое) Транслируйте сообщение объявления в реальном времени. Без активного клиента; чат прямой трансляции больше не отображает объявления
DELETE/:churchId/:idJWTУдалите сообщение и транслируйте удаление в реальном времени

Пример: отправьте сообщение

POST /messaging/messages/send

[
{
"churchId": "church-789",
"conversationId": "conv-456",
"personId": "person-123",
"displayName": "John Smith",
"content": "Hello everyone!",
"messageType": "comment"
}
]
[
{
"id": "msg-001",
"churchId": "church-789",
"conversationId": "conv-456",
"personId": "person-123",
"displayName": "John Smith",
"timeSent": "2026-02-17T10:05:00.000Z",
"content": "Hello everyone!",
"messageType": "comment"
}
]

Частные сообщения

Базовый путь: /messaging/privatemessages

МетодПутьAuthРазрешениеОписание
GET/JWTЗагрузите все частные сообщения для текущего пользователя (включает последнее сообщение за беседу, помечает все как прочитанные)
GET/existing/:personIdJWTНайдите существующую приватную беседу с определённым человеком
GET/:idJWTЗагрузите частное сообщение по ID (очищает уведомление, если адресовано текущему пользователю)
POST/JWTОтправьте частные сообщения (пакет). Запускайте отправку push-уведомления получателю

Уведомления

Базовый путь: /messaging/notifications

МетодПутьAuthРазрешениеОписание
GET/unreadCountJWTПолучите непрочитанное количество уведомлений для текущего пользователя
GET/myJWTЗагрузите все уведомления для текущего пользователя (помечает все как прочитанные)
GET/tmpEmailPublicЗапустите дневное резюме уведомления по электронной почте (отладка/крон конечная точка)
GET/:churchId/person/:personIdJWTЗагрузите уведомления для определённого человека
GET/:churchId/:idJWTЗагрузите уведомление по ID
POST/JWTСоздавайте или обновляйте уведомления (пакет)
POST/createJWTСоздавайте уведомления для нескольких людей. Тело: { peopleIds, contentType, contentId, message, link }
POST/markRead/:churchId/:personIdJWTПометьте все уведомления как прочитанные для человека
POST/sendTestJWTОтправьте тестовое push-уведомление. Тело: { personId, title }
POST/pingPublicСоздайте уведомление из внешнего триггера. Тело: { personId, churchId, contentType, contentId, message, triggeredByPersonId }
DELETE/:churchId/:idJWTУдалите уведомление

Пример: создавайте уведомления

POST /messaging/notifications/create
Authorization: Bearer <token>

{
"peopleIds": ["person-123", "person-456"],
"contentType": "group",
"contentId": "group-789",
"message": "New event posted in your group",
"link": "/groups/group-789"
}

Предпочтения уведомлений

Базовый путь: /messaging/notificationpreferences

Расширяет стандартный CRUD. Базовый класс предоставляет POST / (создавайте или обновляйте, без требуемого разрешения).

МетодПутьAuthРазрешениеОписание
POST/JWTСоздавайте или обновляйте предпочтения уведомлений (из базового класса CRUD)
GET/myJWTЗагрузите предпочтения уведомлений для текущего пользователя (автоматически создаёт значения по умолчанию, если они не существуют)

Соединения

Базовый путь: /messaging/connections

Управляет подключениями WebSocket/реального времени для чата, групповых бесед, частных сообщений и прямой трансляции. Полный протокол см. в Архитектура реального времени.

МетодПутьAuthРазрешениеОписание
GET/:churchId/:conversationIdPublicЗагрузите все соединения для беседы
POST/PublicРегистрируйте соединения (пакет). Запускайте трансляцию присутствия на беседу. Элементы тела: { churchId, conversationId, socketId, displayName?, personId? }
POST/setNamePublicОбновите отображаемое имя для соединения по ID сокета. Тело: { socketId, name }
DELETE/:churchId/:conversationId/:socketIdPublicУдалите соединение из беседы. Запускайте трансляцию присутствия
POST/tmpSendAlertPublicОтправьте оповещение об уведомлении на соединения человека. Тело: { churchId, personId }

Устройства

Базовый путь: /messaging/devices

Управляет регистрацией устройств для отправки push-уведомлений и спаривания содержания (например, приложение уроков на дисплеях телевизора).

МетодПутьAuthРазрешениеОписание
POST/enrollJWTЗачислите или обновите устройство (регистрация мобильного push-сервиса). Совпадает по токену FCM или ID устройства
POST/enrollAnonPublicЗачислите анонимное устройство и создайте 4-значный код спаривания
POST/PublicСохраняйте устройства (пакет)
GET/pair/:pairingCodeJWTСпарьте устройство с использованием его кода спаривания. Опционально ?contentType=&contentId= для назначения содержания
GET/status/:deviceIdPublicПроверьте статус спаривания устройства
GET/:churchIdJWTЗагрузите все устройства для церкви
GET/:churchId/person/:personIdJWTЗагрузите все устройства для человека
GET/:churchId/:idJWTЗагрузите устройство по ID
DELETE/:churchId/:idJWTУдалите устройство

Пример: зачислите устройство

POST /messaging/devices/enroll
Authorization: Bearer <token>

{
"fcmToken": "firebase-token-abc123",
"appName": "B1Mobile",
"label": "John's iPhone",
"deviceInfo": "iOS 17, iPhone 15"
}
{
"id": "device-001",
"churchId": "church-789",
"fcmToken": "firebase-token-abc123",
"appName": "B1Mobile",
"label": "John's iPhone",
"registrationDate": "2026-02-17T10:00:00.000Z",
"lastActiveDate": "2026-02-17T10:00:00.000Z"
}

Содержание устройства

Базовый путь: /messaging/devicecontents

Управляет назначениями содержания для спаренных устройств (например, какой урок отображается на телевизоре).

МетодПутьAuthРазрешениеОписание
GET/deviceId/:deviceIdJWTЗагрузите назначения содержания для устройства
POST/JWTСохраняйте назначения содержания устройства (пакет)
DELETE/:idJWTУдалите назначение содержания устройства

Обмен текстовыми сообщениями

Базовый путь: /messaging/texting

Управляет поставщиками SMS, групповыми текстовыми сообщениями и отслеживанием доставки.

МетодПутьAuthРазрешениеОписание
GET/providersJWTЗагрузите поставщиков текстовых сообщений для церкви (учётные данные маскируются)
GET/preview/:groupIdJWTПросмотрите получателей для текстового сообщения группы (подходящие, отказано, количество без телефона)
GET/sentJWTЗагрузите все отправленные записи текстовых сообщений для церкви
GET/sent/:id/detailsJWTЗагрузите отправленный текст с логами доставки для каждого получателя
POST/providersJWTСохраняйте поставщиков текстовых сообщений (пакет). Шифрует учётные данные API
POST/sendJWTОтправьте SMS всем подходящим членам группы. Тело: { groupId, message }
POST/sendPersonJWTОтправьте SMS одному человеку. Тело: { personId, phoneNumber, message }
DELETE/providers/:idJWTУдалите поставщика текстовых сообщений

Пример: отправьте групповой текст

POST /messaging/texting/send
Authorization: Bearer <token>

{
"groupId": "group-123",
"message": "Reminder: Service starts at 10 AM this Sunday!"
}
{
"totalMembers": 50,
"recipientCount": 42,
"successCount": 40,
"failCount": 2,
"optedOutCount": 5,
"noPhoneCount": 3
}

Шаблоны писем

Базовый путь: /messaging/emailTemplates

Управляет повторно используемыми шаблонами писем и отправкой писем на основе шаблонов группам.

МетодПутьAuthРазрешениеОписание
GET/JWTЗагрузите все шаблоны писем для церкви
GET/:idJWTЗагрузите один шаблон письма по ID
GET/preview/:groupIdJWTПросмотрите доставку писем для группы (количество подходящих получателей, члены без электронной почты)
POST/JWTСоздавайте или обновляйте шаблоны писем (пакет)
POST/sendJWTОтправьте письмо на основе шаблона всем членам группы. Тело: { groupId, subject, htmlContent }
DELETE/:idJWTУдалите шаблон письма

Пример: отправьте письмо группе

POST /messaging/emailTemplates/send
Authorization: Bearer <token>

{
"groupId": "group-123",
"subject": "This Week's Update - {{churchName}}",
"htmlContent": "<p>Hello {{firstName}},</p><p>Here's what's happening this week...</p>"
}
{
"totalMembers": 50,
"recipientCount": 45,
"successCount": 44,
"failCount": 1,
"noEmailCount": 5
}

Поддерживаемые поля слияния: {{firstName}}, {{lastName}}, {{displayName}}, {{email}}, {{churchName}}

Заблокированные IP-адреса

Базовый путь: /messaging/blockedips

(устарелое) Блокировка IP для чата прямой трансляции. Клиент B1App больше не вызывает POST / — блокировка IP была удалена при миграции унифицированной доставки. Маршрут /clear всё ещё вызывается сервер-к-серверу StreamingServiceController при сохранении служб трансляции.

МетодПутьAuthРазрешениеОписание
POST/JWT(устарелое) Сохраняйте заблокированные IP-адреса (пакет). Без активного клиента
POST/clearJWTОчистите все заблокированные IP-адреса для определённых служб. Тело: [{ serviceId, churchId }]

Журналы доставки

Базовый путь: /messaging/deliverylogs

Отслеживает статус доставки отправленных сообщений (SMS, push-уведомления, электронная почта).

МетодПутьAuthРазрешениеОписание
GET/content/:contentType/:contentIdJWTЗагрузите журналы доставки по типу содержания и ID
GET/person/:personIdJWTЗагрузите журналы доставки для человека. Опционально ?startDate=&endDate= фильтры
GET/recentJWTЗагрузите недавние журналы доставки для церкви. Опционально ?limit= (по умолчанию 100)
GET/:idJWTЗагрузите журнал доставки по ID

Связанные страницы