Aller au contenu principal

Points d'extrémité de la messagerie

Le module Messagerie gère les conversations en temps réel, les messages de chat, les notifications push, la livraison SMS/email, les connexions WebSocket, la messagerie privée, l'enregistrement des appareils et les fournisseurs de textos. Il fournit la couche de communication utilisée dans toutes les applications ChurchApps pour les conversations de chat en direct et les notifications asynchrones.

Chemin de base : /messaging

Conversations

Chemin de base : /messaging/conversations

MéthodeCheminAuthPermissionDescription
GET/timeline/ids?ids=JWTCharger des conversations par IDs séparés par des virgules avec premiers/derniers messages
GET/messages/:contentType/:contentIdJWTCharger les conversations pour le contenu avec les messages paginés (?page=&limit=)
GET/postsJWTObtenir les conversations de type post pour les groupes de l'utilisateur actuel
GET/posts/group/:groupIdJWTObtenir les conversations de type post pour un groupe spécifique
GET/current/:churchId/:contentType/:contentIdPublicObtenir ou créer la conversation actuelle pour le contenu (déchiffrage auto contentId)
GET/:churchId/:contentType/:contentIdPublicCharger les conversations par type de contenu et ID
GET/:churchId/:idPublicCharger une conversation unique par ID
POST/JWTCréer ou mettre à jour les conversations (par lots)
POST/startJWTDémarrer une nouvelle conversation avec un message de commentaire initial
DELETE/:churchId/:idJWTSupprimer une conversation

Contrôle d'accès des notes de personne

Les conversations avec contentType: "person" (l'onglet Notes sur un enregistrement de personne) ou contentType: "personConfidential" (la section Notes confidentielles) sont bloquées sur chaque chemin de lecture et d'écriture, y compris les itinéraires autrement publics ci-dessus, qui retournent 401 pour ces types de contenu. person requiert la permission MembershipApi Personnes / Édition ; personConfidential requiert Personnes / Afficher les notes confidentielles. Pour les clés API délimitées, people:write porte les deux actions (l'utilisateur de la clé doit toujours détenir la permission de rôle sous-jacente).

Exemple : Démarrer une conversation

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

Messages

Chemin de base : /messaging/messages

MéthodeCheminAuthPermissionDescription
GET/conversation/:conversationIdJWTCharger tous les messages pour une conversation
GET/catchup/:churchId/:conversationIdPublicCharger tous les messages pour une conversation (catchup public pour chat en direct)
GET/:churchId/:idPublicCharger un message unique par ID
POST/JWTEnregistrer les messages (par lots). Envoie les mises à jour en temps réel et déclenche les notifications
POST/sendPublicEnvoyer les messages (par lots, public). Envoie les mises à jour en temps réel via WebSocket et déclenche les notifications
POST/setCalloutJWT(hérité) Diffuser un message de callout en temps réel. Pas de client actif ; le chat en direct ne rend plus les callouts
DELETE/:churchId/:idJWTSupprimer un message et diffuser la suppression en temps réel

Exemple : Envoyer un message

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

Messages privés

Chemin de base : /messaging/privatemessages

MéthodeCheminAuthPermissionDescription
GET/JWTCharger tous les messages privés pour l'utilisateur actuel (inclut le dernier message par conversation, marque tous comme lus)
GET/existing/:personIdJWTTrouver une conversation privée existante avec une personne spécifique
GET/:idJWTCharger un message privé par ID (efface la notification si adressée à l'utilisateur actuel)
POST/JWTEnvoyer des messages privés (par lots). Déclenche une notification push au destinataire

Notifications

Chemin de base : /messaging/notifications

MéthodeCheminAuthPermissionDescription
GET/unreadCountJWTObtenir le nombre de notifications non lues pour l'utilisateur actuel
GET/myJWTCharger toutes les notifications pour l'utilisateur actuel (marque tous comme lus)
GET/tmpEmailPublicDéclencher le digest de notification email quotidien (endpoint debug/cron)
GET/:churchId/person/:personIdJWTCharger les notifications pour une personne spécifique
GET/:churchId/:idJWTCharger une notification par ID
POST/JWTCréer ou mettre à jour les notifications (par lots)
POST/createJWTCréer des notifications pour plusieurs personnes. Corps : { peopleIds, contentType, contentId, message, link }
POST/markRead/:churchId/:personIdJWTMarquer toutes les notifications comme lues pour une personne
POST/sendTestJWTEnvoyer une notification push de test. Corps : { personId, title }
POST/pingPublicCréer une notification à partir d'un déclencheur externe. Corps : { personId, churchId, contentType, contentId, message, triggeredByPersonId }
DELETE/:churchId/:idJWTSupprimer une notification

Exemple : Créer des notifications

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

Préférences de notification

Chemin de base : /messaging/notificationpreferences

Étend CRUD standard. La classe de base fournit POST / (créer ou mettre à jour, aucune permission requise).

MéthodeCheminAuthPermissionDescription
POST/JWTCréer ou mettre à jour les préférences de notification (à partir de la classe de base CRUD)
GET/myJWTCharger les préférences de notification pour l'utilisateur actuel (crée automatiquement les valeurs par défaut si aucune n'existe)

Connexions

Chemin de base : /messaging/connections

Gère les connexions WebSocket/temps réel pour le chat, les conversations de groupe, les messages privés et le streaming en direct. Voir Architecture temps réel pour le protocole de bout en bout.

MéthodeCheminAuthPermissionDescription
GET/:churchId/:conversationIdPublicCharger toutes les connexions pour une conversation
POST/PublicEnregistrer les connexions (par lots). Déclenche une diffusion de présence sur la conversation. Éléments du corps : { churchId, conversationId, socketId, displayName?, personId? }
POST/setNamePublicMettre à jour le nom d'affichage pour une connexion par ID de socket. Corps : { socketId, name }
DELETE/:churchId/:conversationId/:socketIdPublicSupprimer une connexion d'une conversation. Déclenche une diffusion de présence
POST/tmpSendAlertPublicEnvoyer une alerte de notification aux connexions d'une personne. Corps : { churchId, personId }

Appareils

Chemin de base : /messaging/devices

Gère l'enregistrement des appareils pour les notifications push et l'appairage du contenu (par exemple, l'application Lessons sur les affichages TV).

MéthodeCheminAuthPermissionDescription
POST/enrollJWTInscrire ou mettre à jour un appareil (enregistrement push mobile). Correspond par jeton FCM ou ID d'appareil
POST/enrollAnonPublicInscrire un appareil anonyme et générer un code d'appairage de 4 caractères
POST/PublicEnregistrer les appareils (par lots)
GET/pair/:pairingCodeJWTAppairer un appareil en utilisant son code d'appairage. ?contentType=&contentId= optionnel pour assigner le contenu
GET/status/:deviceIdPublicVérifier l'état d'appairage d'un appareil
GET/:churchIdJWTCharger tous les appareils d'une église
GET/:churchId/person/:personIdJWTCharger tous les appareils d'une personne
GET/:churchId/:idJWTCharger un appareil par ID
DELETE/:churchId/:idJWTSupprimer un appareil

Exemple : Inscrire un appareil

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

Contenu de l'appareil

Chemin de base : /messaging/devicecontents

Gère les affectations de contenu pour les appareils appairés (par exemple, quelle leçon est affichée sur une TV).

MéthodeCheminAuthPermissionDescription
GET/deviceId/:deviceIdJWTCharger les affectations de contenu pour un appareil
POST/JWTEnregistrer les affectations de contenu d'appareil (par lots)
DELETE/:idJWTSupprimer une affectation de contenu d'appareil

Textos

Chemin de base : /messaging/texting

Gère les fournisseurs de SMS, la messagerie textuelle de groupe et le suivi de la livraison.

MéthodeCheminAuthPermissionDescription
GET/providersJWTCharger les fournisseurs de textos pour l'église (les identifiants sont masqués)
GET/preview/:groupIdJWTAperçu des destinataires pour un texte de groupe (nombre d'éligibles, refusés, sans téléphone)
GET/sentJWTCharger tous les enregistrements de messages texte envoyés pour l'église
GET/sent/:id/detailsJWTCharger un texte envoyé avec des journaux de livraison par destinataire
POST/providersJWTEnregistrer les fournisseurs de textos (par lots). Chiffre les identifiants API
POST/sendJWTEnvoyer un SMS à tous les membres éligibles d'un groupe. Corps : { groupId, message }
POST/sendPersonJWTEnvoyer un SMS à une seule personne. Corps : { personId, phoneNumber, message }
DELETE/providers/:idJWTSupprimer un fournisseur de textos

Exemple : Envoyer un texte de groupe

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
}

Modèles d'email

Chemin de base : /messaging/emailTemplates

Gère les modèles d'email réutilisables et l'envoi d'emails basés sur des modèles aux groupes.

MéthodeCheminAuthPermissionDescription
GET/JWTCharger tous les modèles d'email pour l'église
GET/:idJWTCharger un seul modèle d'email par ID
GET/preview/:groupIdJWTAperçu de la livraison d'email pour un groupe (nombre de destinataires éligibles, membres sans email)
POST/JWTCréer ou mettre à jour les modèles d'email (par lots)
POST/sendJWTEnvoyer un email modèle à tous les membres d'un groupe. Corps : { groupId, subject, htmlContent }
DELETE/:idJWTSupprimer un modèle d'email

Exemple : Envoyer un email au groupe

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
}

Champs de fusion supportés : {{firstName}}, {{lastName}}, {{displayName}}, {{email}}, {{churchName}}

IPs bloquées

Chemin de base : /messaging/blockedips

(hérité) Blocage d'IP pour le chat en direct. Le client B1App n'appelle plus POST / -- le blocage d'IP a été supprimé lors de la migration de livraison unifiée. L'itinéraire /clear est toujours invoqué serveur-à-serveur par StreamingServiceController lors de l'enregistrement des services de streaming.

MéthodeCheminAuthPermissionDescription
POST/JWT(hérité) Enregistrer les IPs bloquées (par lots). Pas de client actif
POST/clearJWTEffacer tous les IPs bloquées pour des services spécifiques. Corps : [{ serviceId, churchId }]

Journaux de livraison

Chemin de base : /messaging/deliverylogs

Suit l'état de livraison des messages envoyés (SMS, notifications push, email).

MéthodeCheminAuthPermissionDescription
GET/content/:contentType/:contentIdJWTCharger les journaux de livraison par type de contenu et ID
GET/person/:personIdJWTCharger les journaux de livraison pour une personne. ?startDate=&endDate= optionnel pour filtrer
GET/recentJWTCharger les journaux de livraison récents pour l'église. ?limit= optionnel (par défaut 100)
GET/:idJWTCharger un journal de livraison par ID

Pages connexes