← Phase 2 Overview / Groupes & Gamification
👥
Module 10 — Phase 2

Groupes & Gamification

Communautés thématiques par destination et profil, événements/meetups, badges automatiques et niveaux d'engagement pour fidéliser les voyageurs.

Backlog

User Stories

US10.1
En tant qu'utilisateur, je peux créer un groupe avec nom, description, type (destination/profil), visibilité
must 8pts
US10.2
En tant qu'utilisateur, je peux rechercher et rejoindre des groupes
must 4pts
US10.3
En tant qu'utilisateur, je vois un fil de discussion propre à chaque groupe (posts, sondages)
must 6pts
US10.4
En tant que créateur de groupe, je peux désigner des modérateurs
must 3pts
US10.5
En tant que modérateur groupe, je peux retirer un membre ou supprimer un post
must 4pts
US10.6
En tant qu'utilisateur, je peux créer un événement/meetup dans un groupe (lieu, date, nb max)
must 8pts
US10.7
En tant qu'utilisateur, je peux répondre RSVP à un événement (oui/non/peut-être)
must 3pts
US10.8
En tant qu'utilisateur, je reçois un badge "Pionnier" quand je suis un des premiers à poster sur une nouvelle destination
must 4pts
US10.9
En tant qu'utilisateur, je reçois un badge "Local Expert" (contenu vérifié abondant dans une ville)
must 5pts
US10.10
En tant qu'utilisateur, je reçois un badge "Foodie" (10+ reviews food)
must 3pts
US10.11
En tant qu'utilisateur, je reçois un badge "Safety Hero" (signalements de risques utiles)
should 3pts
US10.12
En tant qu'utilisateur, je progresse à travers 4 niveaux (Novice, Explorateur, Expert, Légende)
must 5pts
US10.13
En tant qu'utilisateur, je vois un leaderboard des top contributeurs d'une destination
should 3pts
US10.14
En tant que système (IA), je résume les discussions récentes du groupe (hebdo)
could 8pts
/groups & /badges

Endpoints API

GET /groups Recherche + liste groupes (?q=&type=&country=) 🔒 auth
POST /groups Créer un groupe 🔒 auth
GET /groups/:id Détail + membres + posts récents 🔒 auth
POST /groups/:id/join Rejoindre un groupe 🔒 auth
DELETE /groups/:id/leave Quitter un groupe 🔒 auth
GET /groups/:id/posts Fil du groupe (paginé cursor) 🔒 auth
POST /groups/:id/posts Poster dans le groupe 🔒 auth
POST /groups/:id/moderators Désigner un modérateur 🔒 auth
DELETE /groups/:id/members/:userId Retirer un membre 🔒 auth
POST /groups/:id/events Créer un événement 🔒 auth
GET /groups/:id/events Liste événements du groupe 🔒 auth
POST /events/:id/rsvp RSVP (body: status: yes|no|maybe) 🔒 auth
GET /users/me/groups Mes groupes 🔒 auth
GET /users/:id/badges Badges d'un utilisateur public
GET /badges Catalogue complet des badges public
GET /leaderboard/places/:placeId Top contributeurs d'un lieu public
Schémas de données

Tables Groupes & Badges

TABLE groups
id UUID PRIMARY KEY name TEXT NOT NULL slug TEXT UNIQUE description TEXT type ENUM('destination','profile','topic') visibility ENUM('public','private','invite_only') cover_url TEXT place_id UUID REFERENCES places(id) creator_id UUID REFERENCES users(id) members_count INT DEFAULT 0 posts_count INT DEFAULT 0 ai_summary TEXT -- résumé hebdo IA ai_summary_at TIMESTAMPTZ created_at TIMESTAMPTZ DEFAULT NOW()
TABLE badges
id UUID PRIMARY KEY slug TEXT UNIQUE -- 'pioneer', 'local_expert'... name TEXT NOT NULL description TEXT icon_url TEXT tier ENUM('bronze','silver','gold','platinum') trigger_rule JSONB -- règle déclenchement auto is_active BOOLEAN DEFAULT true
TABLE user_badges
user_id UUID REFERENCES users(id) badge_id UUID REFERENCES badges(id) place_id UUID REFERENCES places(id) -- contexte awarded_at TIMESTAMPTZ DEFAULT NOW() PRIMARY KEY (user_id, badge_id, place_id)

🏆 Catalogue Badges Phase 2

🗺️
Pionnier
Bronze
Premier post dans une ville — avant 10 posts totaux sur ce lieu
🏙️
Local Expert
Or
50+ posts vérifiés dans une même ville
🍜
Foodie
Argent
10+ reviews food validées
🛡️
Safety Hero
Argent
5+ signalements de risques confirmés utiles
🤝
Networker
Bronze
Rejoint 5+ groupes actifs
📸
Visual Storyteller
Argent
100+ posts avec photos vérifiées EXIF
🌍
Globe Trotter
Or
Contenu posté dans 20+ pays différents
Top Reviewer
Platine
1000+ pts qualité (votes communauté sur reviews)
Business Logic

Règles Métier

🎖️
Système de niveaux
Novice (0-99 pts) → Explorateur (100-499) → Expert (500-1999) → Légende (2000+). Points : post validé=5, review food=3, badge=10-50, signalement utile=8, like reçu=0.5.
🤖
IA de groupe (résumé hebdo)
Cron lundi 9h : prend les 50 derniers messages du groupe → GPT-4o-mini → résumé 3-5 phrases → stocké dans groups.ai_summary → affiché en haut du fil de groupe.
📊
Leaderboard live
Calculé via requête PostgreSQL (contributions pondérées par lieu). Cache Redis 1h. Pas de leaderboard global (anti-toxicité) — seulement par destination.
🔔
Notifications badge
Notification push immédiate à l'attribution. In-app animation célébration. Email récapitulatif hebdo des badges gagnés.
Critères d'acceptation
Groupe créé visible en recherche en < 30s (reindex Typesense)
Badge attribué automatiquement en < 1 min après déclenchement de la règle
Résumé IA groupe envoyé chaque lundi avant 10h
RSVP événement : compteur mis à jour en temps réel (WebSocket)