Push Contract For Front¶
Contrat cible à consommer tel quel par le front après migration.
Catalogue exhaustif des notifications: - Notification catalog
Règles¶
- le backend fournit toujours un
titleet unbodyprêts à afficher - le frontend affiche
titleetbodytels quels - le frontend route avec
data.typeet les IDs présents dansdata - le frontend ne reconstruit jamais le texte utilisateur à partir du type
- l'i18n du texte affiché est gérée côté backend
Format¶
{
"title": "string",
"body": "string",
"data": {
"type": "string",
"datetime": "RFC3339 string",
"conversationId": "string optional",
"eventId": "string optional",
"status": "string optional",
"notifType": "string optional",
"module": "string optional",
"requestId": "string optional",
"helperPersonId": "string optional",
"proposalId": "string optional",
"chosenSlotId": "string optional",
"startAt": "RFC3339 string optional"
}
}
Notes:
- title et body sont les seuls champs destinés à l'affichage utilisateur
- data.type est le discriminant technique
- les IDs restent des strings
Types supportés¶
data.type |
Usage | Champs attendus |
|---|---|---|
newDirectMessage |
nouveau message dans une conversation directe | conversationId, datetime |
newSolidarityMessage |
nouveau message dans une conversation de solidarité | conversationId, datetime |
newEventMessage |
nouveau message dans une conversation d'event | conversationId, eventId, datetime |
profileStatusChanged |
changement d'état du profil | status, notifType, datetime |
solidarityProposalReceived |
un helper a proposé son aide sur une demande solidaire | module, requestId, conversationId, eventId, helperPersonId, datetime |
eventProposalSent |
une proposition de moov a été envoyée à un invité | proposalId, datetime |
eventProposalConverted |
une proposition de moov a été convertie en event | status, proposalId, eventId, chosenSlotId, startAt, datetime |
Exemples¶
newDirectMessage¶
{
"title": "Alice",
"body": "Salut, tu es dispo demain ?",
"data": {
"type": "newDirectMessage",
"conversationId": "123",
"datetime": "2026-04-01T15:00:00Z"
}
}
newSolidarityMessage¶
{
"title": "Alice",
"body": "J'ai une place dans ma voiture.",
"data": {
"type": "newSolidarityMessage",
"conversationId": "456",
"datetime": "2026-04-01T15:00:00Z"
}
}
newEventMessage¶
{
"title": "Tournoi de samedi",
"body": "Alice : Pensez à venir 15 min avant",
"data": {
"type": "newEventMessage",
"conversationId": "789",
"eventId": "42",
"datetime": "2026-04-01T15:00:00Z"
}
}
profileStatusChanged¶
{
"title": "Profil validé",
"body": "Votre profil a été validé.",
"data": {
"type": "profileStatusChanged",
"status": "approved",
"notifType": "9",
"datetime": "2026-04-01T15:00:00Z"
}
}
solidarityProposalReceived¶
{
"title": "Proposition de covoiturage",
"body": "Alice vous propose son aide pour le covoiturage.",
"data": {
"type": "solidarityProposalReceived",
"module": "carpool",
"requestId": "42",
"conversationId": "91",
"eventId": "7",
"helperPersonId": "17",
"datetime": "2026-04-02T10:00:00Z"
}
}
eventProposalSent¶
{
"title": "Nouvelle proposition de moov",
"body": "Club Alpha vous propose le moov Badminton mardi. Indiquez vos disponibilités parmi les créneaux proposés.",
"data": {
"type": "eventProposalSent",
"proposalId": "77",
"datetime": "2026-04-02T10:00:00Z"
}
}
eventProposalConverted¶
{
"title": "Proposition confirmée",
"body": "Le moov Badminton mardi a été créé. Il aura lieu le 20/04/2026 à 18:00. Vous avez une place en liste principale.",
"data": {
"type": "eventProposalConverted",
"status": "registered",
"proposalId": "77",
"eventId": "123",
"chosenSlotId": "5",
"startAt": "2026-04-20T18:00:00Z",
"datetime": "2026-04-02T10:00:00Z"
}
}
Valeurs status pour profileStatusChanged¶
incompletepending_reviewapproveddeniedbanned
Valeurs status pour eventProposalConverted¶
creator: créateur de la propositionregistered: invité inscrit en liste principalewaitlisted: invité inscrit en liste d'attentejoinable: invité sans réponse pouvant encore rejoindre l'event
Responsabilités front¶
Le front doit:
- afficher title et body
- router selon data.type
- utiliser les IDs fournis dans data
- traiter status comme une clé de navigation ou de comportement, pas comme une clé d'affichage
Le front ne doit pas:
- mapper data.type -> texte utilisateur
- localiser le texte du push localement
- conserver la logique legacy basée sur newUserMessage