Saltar al contenido principal

Puntos Finales de Mensajería

El módulo de Mensajería administra conversaciones en tiempo real, mensajes de chat, notificaciones push, entrega de SMS/correo electrónico, conexiones WebSocket, mensajería privada, registro de dispositivos y proveedores de mensajería por texto. Proporciona la capa de comunicación utilizada en todas las aplicaciones de ChurchApps tanto para chat de transmisión en vivo como para notificaciones asincrónicas.

Ruta base: /messaging

Conversaciones

Ruta base: /messaging/conversations

MétodoRutaAutenticaciónPermisoDescripción
GET/timeline/ids?ids=JWTCargar conversaciones por IDs separados por comas con primeros/últimos mensajes
GET/messages/:contentType/:contentIdJWTCargar conversaciones para contenido con mensajes paginados (?page=&limit=)
GET/postsJWTObtener conversaciones de tipo publicación para grupos del usuario actual
GET/posts/group/:groupIdJWTObtener conversaciones de tipo publicación para un grupo específico
GET/current/:churchId/:contentType/:contentIdPúblicaObtener o crear la conversación actual para contenido (descifra automáticamente contentId)
GET/:churchId/:contentType/:contentIdPúblicaCargar conversaciones por tipo de contenido e ID
GET/:churchId/:idPúblicaCargar una sola conversación por ID
POST/JWTCrear o actualizar conversaciones (lote)
POST/startJWTIniciar una nueva conversación con un mensaje de comentario inicial
DELETE/:churchId/:idJWTEliminar una conversación

Control de acceso a notas de personas

Las conversaciones con contentType: "person" (la pestaña Notas en un registro de persona) o contentType: "personConfidential" (la sección Notas Confidenciales) se cierren en cada ruta de lectura y escritura, incluidas las rutas públicas anteriores, que devuelven 401 para estos tipos de contenido. person requiere el permiso Personas / Editar de MembershipApi; personConfidential requiere Personas / Ver Notas Confidenciales. Para claves de API con alcance, people:write lleva ambas acciones (el usuario de la clave aún debe poseer el permiso de rol subyacente).

Ejemplo: Iniciar una Conversación

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"
}

Mensajes

Ruta base: /messaging/messages

MétodoRutaAutenticaciónPermisoDescripción
GET/conversation/:conversationIdJWTCargar todos los mensajes para una conversación
GET/catchup/:churchId/:conversationIdPúblicaCargar todos los mensajes para una conversación (puesta al día pública para chat en vivo)
GET/:churchId/:idPúblicaCargar un solo mensaje por ID
POST/JWTGuardar mensajes (lote). Envía actualizaciones en tiempo real y desencadena notificaciones
POST/sendPúblicaEnviar mensajes (lote, pública). Envía actualizaciones en tiempo real a través de WebSocket y desencadena notificaciones
POST/setCalloutJWT(legado) Difundir un mensaje de llamada en tiempo real. Sin cliente activo; el chat de transmisión en vivo ya no muestra aclaraciones
DELETE/:churchId/:idJWTEliminar un mensaje y difundir la eliminación en tiempo real

Ejemplo: Enviar un Mensaje

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"
}
]

Mensajes Privados

Ruta base: /messaging/privatemessages

MétodoRutaAutenticaciónPermisoDescripción
GET/JWTCargar todos los mensajes privados para el usuario actual (incluye último mensaje por conversación, marca todos como leídos)
GET/existing/:personIdJWTEncontrar una conversación privada existente con una persona específica
GET/:idJWTCargar un mensaje privado por ID (borra la notificación si se dirige al usuario actual)
POST/JWTEnviar mensajes privados (lote). Desencadena notificación push al destinatario

Notificaciones

Ruta base: /messaging/notifications

MétodoRutaAutenticaciónPermisoDescripción
GET/unreadCountJWTObtener recuento de notificaciones no leídas para el usuario actual
GET/myJWTCargar todas las notificaciones para el usuario actual (marca todos como leídos)
GET/tmpEmailPúblicaDesencadenar resumen de correo electrónico de notificación diaria (punto final de depuración/cron)
GET/:churchId/person/:personIdJWTCargar notificaciones para una persona específica
GET/:churchId/:idJWTCargar una notificación por ID
POST/JWTCrear o actualizar notificaciones (lote)
POST/createJWTCrear notificaciones para múltiples personas. Cuerpo: { peopleIds, contentType, contentId, message, link }
POST/markRead/:churchId/:personIdJWTMarcar todas las notificaciones como leídas para una persona
POST/sendTestJWTEnviar una notificación push de prueba. Cuerpo: { personId, title }
POST/pingPúblicaCrear una notificación desde un desencadenador externo. Cuerpo: { personId, churchId, contentType, contentId, message, triggeredByPersonId }
DELETE/:churchId/:idJWTEliminar una notificación

Ejemplo: Crear Notificaciones

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"
}

Preferencias de Notificación

Ruta base: /messaging/notificationpreferences

Extiende CRUD estándar. La clase base proporciona POST / (crear o actualizar, sin permiso requerido).

MétodoRutaAutenticaciónPermisoDescripción
POST/JWTCrear o actualizar preferencias de notificación (de la clase base CRUD)
GET/myJWTCargar preferencias de notificación para el usuario actual (crea automáticamente valores predeterminados si no existen)

Conexiones

Ruta base: /messaging/connections

Administra conexiones WebSocket/en tiempo real para chat, conversaciones de grupo, mensajes privados y transmisión en vivo. Consulta Arquitectura en Tiempo Real para el protocolo de extremo a extremo.

MétodoRutaAutenticaciónPermisoDescripción
GET/:churchId/:conversationIdPúblicaCargar todas las conexiones para una conversación
POST/PúblicaRegistrar conexiones (lote). Desencadena una difusión de asistencia en la conversación. Elementos del cuerpo: { churchId, conversationId, socketId, displayName?, personId? }
POST/setNamePúblicaActualizar el nombre mostrado para una conexión por ID de socket. Cuerpo: { socketId, name }
DELETE/:churchId/:conversationId/:socketIdPúblicaDescartar una conexión de una conversación. Desencadena una difusión de asistencia
POST/tmpSendAlertPúblicaEnviar una alerta de notificación a las conexiones de una persona. Cuerpo: { churchId, personId }

Dispositivos

Ruta base: /messaging/devices

Administra el registro de dispositivos para notificaciones push y emparejamiento de contenido (por ejemplo, aplicación de Lecciones en pantallas de TV).

MétodoRutaAutenticaciónPermisoDescripción
POST/enrollJWTRegistrar o actualizar un dispositivo (registro de push móvil). Coincide por token FCM o ID de dispositivo
POST/enrollAnonPúblicaRegistrar un dispositivo anónimo y generar un código de emparejamiento de 4 caracteres
POST/PúblicaGuardar dispositivos (lote)
GET/pair/:pairingCodeJWTEmparejar un dispositivo usando su código de emparejamiento. Opcional ?contentType=&contentId= para asignar contenido
GET/status/:deviceIdPúblicaVerificar estado de emparejamiento de un dispositivo
GET/:churchIdJWTCargar todos los dispositivos para una iglesia
GET/:churchId/person/:personIdJWTCargar todos los dispositivos para una persona
GET/:churchId/:idJWTCargar un dispositivo por ID
DELETE/:churchId/:idJWTEliminar un dispositivo

Ejemplo: Registrar un Dispositivo

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"
}

Contenidos de Dispositivo

Ruta base: /messaging/devicecontents

Administra asignaciones de contenido para dispositivos emparejados (por ejemplo, qué lección se muestra en un televisor).

MétodoRutaAutenticaciónPermisoDescripción
GET/deviceId/:deviceIdJWTCargar asignaciones de contenido para un dispositivo
POST/JWTGuardar asignaciones de contenido de dispositivo (lote)
DELETE/:idJWTEliminar una asignación de contenido de dispositivo

Mensajería por Texto

Ruta base: /messaging/texting

Administra proveedores de SMS, mensajería de texto en grupo y seguimiento de entrega.

MétodoRutaAutenticaciónPermisoDescripción
GET/providersJWTCargar proveedores de mensajería por texto para la iglesia (las credenciales se enmascaran)
GET/preview/:groupIdJWTPrevisualizar destinatarios para un texto grupal (conteos elegibles, desactivados, sin teléfono)
GET/sentJWTCargar todos los registros de mensajes de texto enviados para la iglesia
GET/sent/:id/detailsJWTCargar un texto enviado con registros de entrega por destinatario
POST/providersJWTGuardar proveedores de mensajería por texto (lote). Encripta credenciales de API
POST/sendJWTEnviar un SMS a todos los miembros elegibles de un grupo. Cuerpo: { groupId, message }
POST/sendPersonJWTEnviar un SMS a una sola persona. Cuerpo: { personId, phoneNumber, message }
DELETE/providers/:idJWTEliminar un proveedor de mensajería por texto

Ejemplo: Enviar Texto Grupal

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
}

Plantillas de Correo Electrónico

Ruta base: /messaging/emailTemplates

Administra plantillas de correo electrónico reutilizables y envío de correos electrónicos con plantilla a grupos.

MétodoRutaAutenticaciónPermisoDescripción
GET/JWTCargar todas las plantillas de correo electrónico para la iglesia
GET/:idJWTCargar una sola plantilla de correo electrónico por ID
GET/preview/:groupIdJWTPrevisualizar entrega de correo electrónico para un grupo (recuento de destinatarios elegibles, miembros sin correo electrónico)
POST/JWTCrear o actualizar plantillas de correo electrónico (lote)
POST/sendJWTEnviar un correo electrónico con plantilla a todos los miembros de un grupo. Cuerpo: { groupId, subject, htmlContent }
DELETE/:idJWTEliminar una plantilla de correo electrónico

Ejemplo: Enviar Correo Electrónico a Grupo

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
}

Campos de fusión soportados: {{firstName}}, {{lastName}}, {{displayName}}, {{email}}, {{churchName}}

IPs Bloqueadas

Ruta base: /messaging/blockedips

(legado) Bloqueo de IP para chat de transmisión en vivo. El cliente B1App ya no llama a POST / — el bloqueo de IP se eliminó en la migración de entrega unificada. La ruta /clear aún se invoca servidor a servidor por StreamingServiceController cuando se guardan servicios de transmisión.

MétodoRutaAutenticaciónPermisoDescripción
POST/JWT(legado) Guardar IPs bloqueadas (lote). Sin cliente activo
POST/clearJWTBorrar todas las IPs bloqueadas para servicios específicos. Cuerpo: [{ serviceId, churchId }]

Registros de Entrega

Ruta base: /messaging/deliverylogs

Rastrea el estado de entrega para mensajes enviados (SMS, notificaciones push, correo electrónico).

MétodoRutaAutenticaciónPermisoDescripción
GET/content/:contentType/:contentIdJWTCargar registros de entrega por tipo de contenido e ID
GET/person/:personIdJWTCargar registros de entrega para una persona. Filtros opcionales ?startDate=&endDate=
GET/recentJWTCargar registros de entrega recientes para la iglesia. Opcional ?limit= (predeterminado 100)
GET/:idJWTCargar un registro de entrega por ID

Páginas Relacionadas