Aller au contenu

Règles métier — Notifications

Ce document décrit les règles métier du domaine Notifications. Ces règles définissent le comportement du système de notifications in-app de Primatch.

Canaux de notification

Dans cette version, les notifications in-app sont implémentées. Les préférences push et email sont stockées en base mais l'envoi effectif de push/email est prévu pour une version ultérieure. Les préférences par canal sont d'ores et déjà configurables par l'utilisateur.


Types de notifications

RB-NOTIF-001 — Catégories de notifications

Les notifications sont organisées en quatre catégories :

Catégorie Types Description
Matchs game_joined, game_left, game_cancelled, game_full, game_reminder, game_started Événements liés aux parties
Participation participation_request, participation_approved, participation_rejected Demandes de participation hors intervalle de niveau
Scores score_submitted, score_validated, score_contested, score_finalized Événements liés aux scores
Clubs club_registration_received, club_validated, club_rejected Événements liés à la gestion des clubs

RB-NOTIF-002 — Déclencheurs automatiques

Les notifications sont créées automatiquement lors des actions suivantes :

Action Type Destinataires
Un joueur rejoint une partie game_joined Tous les autres joueurs de la partie
Un joueur quitte une partie game_left Tous les autres joueurs de la partie
Le créateur annule une partie game_cancelled Tous les autres joueurs de la partie
La partie est complète (4 joueurs) game_full Tous les joueurs de la partie
Un joueur envoie un message dans le chat message_received Tous les autres joueurs confirmés
Rappel planifié (2h avant la partie par défaut) game_reminder Tous les joueurs confirmés
Une nouvelle partie est disponible à proximité game_nearby Joueurs de la zone (à venir)
Un joueur soumet un score score_submitted Tous les autres joueurs de la partie
Un joueur valide un score score_validated Tous les autres joueurs de la partie
Un joueur conteste un score score_contested Tous les autres joueurs de la partie
Le score est finalisé (unanimité) score_finalized Tous les joueurs de la partie
Un joueur hors niveau demande à participer participation_request Le créateur de la partie
Le créateur accepte une demande participation_approved Le joueur demandeur
Le créateur refuse une demande participation_rejected Le joueur demandeur
Un joueur est invité à une partie privée game_invitation Le joueur invité
Un club soumet une demande de réservation reservation_request Le gestionnaire du club
Le gestionnaire accepte une réservation reservation_accepted Le joueur demandeur
Le gestionnaire refuse une réservation reservation_rejected Le joueur demandeur
Un club est créé ou revendiqué club_registration_received Tous les administrateurs
Un administrateur valide un club club_validated Le gestionnaire du club
Un administrateur refuse un club club_rejected Le gestionnaire du club

Préférences de notification

RB-NOTIF-030 — Configuration par type et par canal

  • Chaque utilisateur peut configurer ses préférences par type de notification et par canal (in_app, push, email)
  • Les préférences sont stockées dans la table notification_preferences (une ligne par couple utilisateur/type)
  • Par défaut (pas d'entrée en base), tous les canaux applicables sont activés
  • Les canaux non applicables pour un type (ex: email pour game_nearby) sont ignorés

RB-NOTIF-031 — Mode silencieux global

  • L'utilisateur peut désactiver toutes les notifications d'un seul geste (PUT /api/v1/notification-preferences { enabled: false })
  • La réactivation globale (enabled: true) réactive tous les canaux applicables

RB-NOTIF-032 — Respect des préférences à la création

  • Avant de créer une notification in-app, le système vérifie si l'utilisateur a activé le canal in_app pour ce type
  • Si le canal est désactivé, la notification n'est pas créée
  • Ce comportement s'applique aussi aux envois groupés (notifyMany)

RB-NOTIF-033 — Rappel de partie (planifié)

  • La commande games:send-reminders s'exécute toutes les 10 minutes
  • Le délai de rappel est configurable via app_settings.match_reminder_delay (en heures, défaut : 2h)
  • Un rappel n'est envoyé qu'une seule fois par partie (champ reminder_sent_at sur la table games)

Gestion des notifications

RB-NOTIF-010 — État lu/non lu

  • Chaque notification possède un état lu ou non lu
  • Une notification est marquée comme lue lorsque l'utilisateur clique dessus
  • L'utilisateur peut marquer toutes ses notifications comme lues en une action
  • Le compteur de notifications non lues est affiché dans la barre de navigation

RB-NOTIF-011 — Suppression

  • L'utilisateur peut supprimer une notification individuellement
  • La suppression est définitive (pas de corbeille)
  • Un utilisateur ne peut supprimer que ses propres notifications

RB-NOTIF-012 — Isolation des données

  • Un utilisateur ne peut voir que ses propres notifications
  • ❌ Toute tentative d'accès à la notification d'un autre utilisateur → erreur 403 Forbidden

Affichage

RB-NOTIF-020 — Pagination

  • Les notifications sont affichées par ordre chronologique décroissant (plus récentes en premier)
  • La liste est paginée (20 éléments par page par défaut)

RB-NOTIF-021 — Groupement par jour

  • Les notifications sont groupées visuellement par jour :
    • Aujourd'hui — notifications du jour
    • Hier — notifications de la veille
    • Date — notifications plus anciennes (format date locale)

RB-NOTIF-022 — Filtrage par catégorie

  • L'utilisateur peut filtrer les notifications par catégorie :
    • Tout — toutes les notifications
    • Matchs — notifications liées aux parties
    • Scores — notifications liées aux scores

RB-NOTIF-023 — Navigation contextuelle

  • Cliquer sur une notification navigue vers la page de détail de la partie concernée
  • Les données contextuelles (game_id, actor_id) sont stockées dans le champ data de la notification

RB-NOTIF-024 — Temps relatif

Le temps d'affichage des notifications utilise un format relatif :

Condition Affichage
< 1 minute "À l'instant"
< 60 minutes "Il y a X min"
< 24 heures "Il y a Xh"
1 jour "Hier"
< 7 jours "Il y a X jours"
≥ 7 jours Date locale

RB-NOTIF-025 — Badge de notification

  • Un badge rouge avec le nombre de notifications non lues est affiché sur l'icône de notifications dans la barre de navigation
  • Le badge est masqué lorsqu'il n'y a aucune notification non lue
  • Le compteur est rafraîchi automatiquement toutes les 30 secondes