Aller au contenu

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 title et un body prêts à afficher
  • le frontend affiche title et body tels quels
  • le frontend route avec data.type et les IDs présents dans data
  • 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

  • incomplete
  • pending_review
  • approved
  • denied
  • banned

Valeurs status pour eventProposalConverted

  • creator: créateur de la proposition
  • registered: invité inscrit en liste principale
  • waitlisted: invité inscrit en liste d'attente
  • joinable: 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