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_apppour 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-reminderss'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_atsur la tablegames)
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 champdatade 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