Merge branch 'refactor/docs-reorganization' into main

This commit is contained in:
jpgiannetti
2026-02-08 20:59:35 +01:00
35 changed files with 819 additions and 1022 deletions

2
.gitignore vendored
View File

@@ -66,4 +66,4 @@ site/
.cache/ .cache/
# Generated documentation # Generated documentation
/generated/ docs/generated/

View File

@@ -70,7 +70,7 @@ clean:
## docs-clean: Remove generated documentation (BDD docs and PDF) ## docs-clean: Remove generated documentation (BDD docs and PDF)
docs-clean: docs-clean:
@echo "$(YELLOW)Cleaning generated documentation...$(NC)" @echo "$(YELLOW)Cleaning generated documentation...$(NC)"
@rm -rf generated/ @rm -rf docs/generated/
@docker rmi roadwave-pdf-generator 2>/dev/null || true @docker rmi roadwave-pdf-generator 2>/dev/null || true
@echo "$(GREEN)✓ Documentation cleaned$(NC)" @echo "$(GREEN)✓ Documentation cleaned$(NC)"

456
docs/CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,456 @@
# Guide de Contribution à la Documentation
Bienvenue ! Ce guide explique comment contribuer à la documentation RoadWave tout en respectant son architecture et ses conventions.
## Principes Fondamentaux
### 1. Source Unique de Vérité (Single Source of Truth)
Chaque information doit exister à **un seul endroit** :
- **Règles métier** → `docs/domains/[domain]/rules/*.md`
- **Features BDD** → `domains/[domain]/features/**/*.feature` (sources Gherkin)
- **Documentation BDD** → `docs/generated/bdd/` (générée automatiquement)
- **Entités** → `docs/domains/[domain]/entities/*.md`
- **États** → `docs/domains/[domain]/states/*.md`
- **Séquences** → `docs/domains/[domain]/sequences/*.md`
**Ne jamais** dupliquer une information
**Toujours** référencer via des liens
### 2. Langue : 100% Français
Tous les fichiers de documentation doivent être en français :
- ✅ Noms de fichiers en français (kebab-case)
- ✅ Contenu en français
- ✅ Navigation `mkdocs.yml` en français
- ⚠️ Exception : code backend en anglais (convention internationale)
### 3. Dossier `generated/` = Read-Only
Le dossier `docs/generated/` contient **exclusivement** des fichiers générés automatiquement.
**Ne JAMAIS** créer de fichiers manuels dans `generated/`
**Ne JAMAIS** éditer des fichiers dans `generated/`
✅ Modifier les sources (`.feature`) et regénérer
## Ajouter une Nouvelle Feature BDD
### Étape 1 : Créer le fichier `.feature`
```bash
# Créer dans le bon domaine
touch domains/[domain]/features/[category]/ma-feature.feature
```
**Exemple** : Feature de recherche dans le domaine recommendation
```bash
touch domains/recommendation/features/recherche/recherche-avancee.feature
```
### Étape 2 : Écrire la feature en Gherkin
```gherkin
# language: fr
Fonctionnalité: Recherche avancée de contenus
En tant qu'utilisateur
Je veux rechercher des contenus avec des filtres avancés
Afin de trouver exactement ce que je cherche
Contexte:
Étant donné que je suis connecté
Et que je suis sur la page de recherche
Scénario: Recherche par catégorie et distance
Quand je sélectionne la catégorie "Tourisme"
Et je définis un rayon de 10 km
Alors je vois uniquement les contenus de type "Tourisme"
Et tous les résultats sont à moins de 10 km
Scénario: Recherche avec filtres multiples
# ... autres scénarios
```
**Conventions Gherkin** :
- Langue française (`# language: fr`)
- Mots-clés : `Fonctionnalité`, `Scénario`, `Étant donné`, `Quand`, `Alors`
- Commentaires pour référencer les règles DDD
### Étape 3 : Regénérer la documentation
```bash
make bdd-docs
```
Cette commande :
1. Parse les fichiers `.feature`
2. Génère les `.md` dans `generated/bdd/`
3. Démarre le serveur MkDocs (http://localhost:8000)
### Étape 4 : Ajouter dans `mkdocs.yml`
Si la catégorie n'existe pas encore, l'ajouter :
```yaml
- '🎯 Recommendation':
# ...
- Tests BDD:
- 'Recherche':
- Recherche de contenu: generated/bdd/recommendation/features/recherche/recherche.md
- Recherche avancée: generated/bdd/recommendation/features/recherche/recherche-avancee.md # ← NOUVEAU
```
### Étape 5 : Commit
```bash
git add domains/recommendation/features/recherche/recherche-avancee.feature
git add mkdocs.yml
git commit -m "feat(bdd): ajouter feature recherche avancée
- Ajout recherche par catégorie et distance
- Ajout filtres multiples
- Couverture domaine recommendation"
```
## Ajouter une Règle Métier
### Étape 1 : Identifier le domaine
Déterminer dans quel domaine DDD se situe la règle :
- **Shared** : Authentification, RGPD, erreurs, profil
- **Recommendation** : Algorithme, jauges d'intérêt, recherche
- **Content** : Audio-guides, création, streaming
- **Moderation** : Signalements, validation, sanctions
- **Advertising** : Publicités, ciblage
- **Premium** : Abonnements, mode offline
- **Monetization** : Paiements, revenus créateurs
### Étape 2 : Créer ou éditer le fichier de règles
```bash
# Éditer fichier existant
vim domains/[domain]/rules/[theme].md
# Ou créer un nouveau fichier
touch domains/[domain]/rules/nouveau-theme.md
```
### Étape 3 : Documenter la règle
```markdown
# Règles - Nouveau Thème
## Contexte
Description du contexte métier...
## Règles
### Règle 1 : Titre de la règle
**Contexte** : Quand...
**Règle** : L'utilisateur doit/peut/ne peut pas...
**Justification** : Parce que...
**Exemple** :
- Cas nominal : ...
- Cas d'erreur : ...
### Règle 2 : Autre règle
...
## Liens avec d'autres domaines
- [Entité X](../entities/entite-x.md)
- [Séquence Y](../sequences/sequence-y.md)
- [ADR-XXX](../../adr/XXX-decision.md)
```
### Étape 4 : Créer les features BDD correspondantes
Les règles métier doivent être testables → créer des features BDD.
### Étape 5 : Ajouter dans `mkdocs.yml`
```yaml
- '🎙️ Content':
- Règles:
- Création & Publication: domains/content/rules/creation-publication.md
- Nouveau Thème: domains/content/rules/nouveau-theme.md # ← NOUVEAU
```
## Ajouter une Entité
### Créer le fichier
```bash
touch domains/[domain]/entities/nouvelle-entite.md
```
### Documenter l'entité
```markdown
# Entité : NouvelleThing
## Description
Brève description de l'entité...
## Attributs
| Attribut | Type | Description | Contraintes |
|----------|------|-------------|-------------|
| `id` | UUID | Identifiant unique | PK, NOT NULL |
| `name` | String | Nom de la chose | NOT NULL, max 255 |
| `created_at` | Timestamp | Date de création | NOT NULL |
## Relations
- **BelongsTo** : [User](../../../_shared/entities/users.md)
- **HasMany** : [Items](./items.md)
## États du Cycle de Vie
Voir [Lifecycle](../states/nouvelle-thing-lifecycle.md)
## Règles Métier
- [Règle de création](../rules/creation.md#nouvelle-thing)
- [Règle de validation](../rules/validation.md#nouvelle-thing)
## Implémentation Backend
**Module** : `backend/internal/[domain]/`
**Table** : `nouvelle_things`
**Repository** : `nouvelle_thing_repository.go`
Requêtes sqlc : `backend/queries/nouvelle_thing.sql`
```
### Ajouter dans `mkdocs.yml`
```yaml
- Entités:
- Vue d'ensemble: domains/[domain]/entities/vue-ensemble.md
- Nouvelle Entité: domains/[domain]/entities/nouvelle-entite.md # ← NOUVEAU
```
## Ajouter un Diagramme
### Diagrammes de Séquence
```bash
touch domains/[domain]/sequences/nouveau-processus.md
```
```markdown
# Séquence - Nouveau Processus
## Diagramme
\`\`\`mermaid
sequenceDiagram
participant U as Utilisateur
participant A as API
participant DB as Database
U->>A: POST /nouvelle-action
A->>DB: Vérifier permissions
DB-->>A: OK
A->>DB: INSERT nouvelle_thing
A-->>U: 201 Created
\`\`\`
## Légende
**Acteurs** :
- Utilisateur : Client de l'API
- API : Backend RoadWave
- Database : PostgreSQL
**Étapes clés** :
1. Vérification des permissions
2. Insertion en base
3. Retour confirmation
## Cas d'Erreur
### Permissions insuffisantes
...
### Contrainte violée
...
```
### Diagrammes d'États
```bash
touch domains/[domain]/states/nouvelle-thing-lifecycle.md
```
```markdown
# États - Lifecycle NouvelleThing
## Diagramme
\`\`\`mermaid
stateDiagram-v2
[*] --> Draft
Draft --> Pending: Submit
Pending --> Approved: Approve
Pending --> Rejected: Reject
Approved --> Published: Publish
Published --> Archived: Archive
Archived --> [*]
\`\`\`
## États
| État | Description | Transitions Possibles |
|------|-------------|----------------------|
| Draft | Création en cours | → Pending |
| Pending | En attente validation | → Approved, Rejected |
| Approved | Validé | → Published |
| Rejected | Refusé | → Draft (correction) |
| Published | Publié | → Archived |
| Archived | Archivé | (final) |
## Règles de Transition
### Draft → Pending
**Conditions** : Tous les champs obligatoires remplis
**Actions** : Notification modérateurs
```
## Conventions de Nommage
### Fichiers Markdown
```bash
# Format : kebab-case-francais.md
✅ export-donnees.md
✅ suppression-compte.md
✅ moderation-communautaire.md
✅ vue-ensemble.md
❌ data-export.md (anglais)
❌ entities-overview.md (anglais)
❌ ExportDonnees.md (PascalCase)
❌ export_donnees.md (snake_case)
```
### Fichiers Features
```bash
# Format : kebab-case-francais.feature
✅ signalement.feature
✅ jauge-initiale.feature
✅ creation-audio-guide.feature
❌ reporting.feature (anglais)
❌ initial-gauge.feature (anglais)
```
### Répertoires
```bash
# Format : kebab-case-anglais (convention internationale)
✅ features/
✅ interest-gauges/
✅ content-creation/
✅ rgpd-compliance/
```
## Vérifications Avant Commit
### Checklist
- [ ] Tous les fichiers sont en français (sauf code backend)
- [ ] Pas de fichiers dans `generated/` (seulement sources modifiées)
- [ ] Les liens internes fonctionnent
- [ ] `mkdocs.yml` mis à jour si nécessaire
- [ ] Features BDD regénérées (`make bdd-docs`)
- [ ] Message de commit descriptif
### Tester Localement
```bash
# Vérifier syntaxe YAML
python3 -c "import yaml; yaml.safe_load(open('mkdocs.yml'))"
# Tester la navigation
make docs-serve
# → http://localhost:8000
```
### Vérifier les Liens
```bash
# Chercher liens cassés vers anciens noms
grep -r "entities-overview\.md" docs/
grep -r "user-account-lifecycle\.md" docs/
grep -r "data-export\.md" docs/
# Ne devrait rien retourner
```
## Messages de Commit
### Format
```
type(scope): description courte
Corps optionnel avec détails...
Refs: #issue-number
```
### Types
- `feat(bdd)` : Nouvelle feature BDD
- `docs(rules)` : Nouvelle règle métier
- `docs(entity)` : Nouvelle entité
- `fix(link)` : Correction de lien
- `refactor(nav)` : Réorganisation navigation
### Exemples
```bash
# Feature BDD
git commit -m "feat(bdd): ajouter recherche avancée dans recommendation"
# Règle métier
git commit -m "docs(rules): documenter règles de modération préventive"
# Entité
git commit -m "docs(entity): ajouter entité Campaign pour advertising"
# Fix
git commit -m "fix(link): corriger lien vers vue-ensemble.md"
```
## Ressources
- **Architecture DDD** : [domains/README.md](domains/README.md)
- **Tests BDD** : [ADR-007](adr/007-tests-bdd.md)
- **ADRs** : [adr/README.md](adr/README.md)
## Support
Questions ? Consultez :
1. Cette documentation
2. Les ADRs existants
3. Les exemples dans les domaines existants
4. L'équipe RoadWave
## Auteurs
- Équipe RoadWave
- Claude Sonnet 4.5 (documentation)
Dernière mise à jour : 2026-02-08

View File

@@ -1,320 +0,0 @@
# Diagramme de Séquence : Cache Géospatial Redis
> Architecture du cache Redis Geospatial pour l'optimisation des requêtes de découverte de contenu géolocalisé.
## Vue d'ensemble
Le cache Redis Geospatial permet d'accélérer la recherche de contenus audio à proximité d'une position GPS en évitant des calculs PostGIS coûteux sur PostgreSQL à chaque requête.
**Performance** :
- Sans cache : ~200-500ms (calcul PostGIS sur 100K points)
- Avec cache : ~5-10ms (filtrage Redis en mémoire)
---
## Flux complet : Cold Start → Warm Cache
```mermaid
sequenceDiagram
participant User as 📱 Utilisateur<br/>(Paris)
participant Backend as 🔧 Backend Go
participant Redis as 🔴 Redis Geospatial<br/>(Cache)
participant PostgreSQL as 🗄️ PostgreSQL<br/>+ PostGIS
participant CDN as 🌐 NGINX Cache (OVH VPS)
Note over User,CDN: 🥶 Cold Start - Cache vide
User->>Backend: GET /contents?lat=48.8566&lon=2.3522&radius=50km
Backend->>Redis: EXISTS geo:catalog
Redis-->>Backend: false (cache vide)
Backend->>PostgreSQL: SELECT id, lat, lon, title, geo_level<br/>FROM contents WHERE active=true
Note over PostgreSQL: Tous les contenus actifs<br/>de la plateforme (métadonnées)
PostgreSQL-->>Backend: 100K contenus (métadonnées)
Backend->>Redis: GEOADD geo:catalog<br/>lon1 lat1 "content:1"<br/>lon2 lat2 "content:2"<br/>... (100K entrées)
Note over Redis: Stockage index spatial<br/>en mémoire (~20 MB)
Redis-->>Backend: OK (100000)
Backend->>Redis: EXPIRE geo:catalog 300
Note over Redis: TTL 5 minutes
Backend->>Redis: GEORADIUS geo:catalog<br/>2.3522 48.8566 50 km
Note over Redis: Filtrage spatial instantané<br/>(index geohash)
Redis-->>Backend: [content:123, content:456, ...]<br/>(~500 IDs dans rayon)
Backend->>PostgreSQL: SELECT * FROM contents<br/>WHERE id IN (123, 456, ...)<br/>AND geo_level = 'gps_precise'
Note over PostgreSQL: Récupération détails complets<br/>uniquement contenus proches
PostgreSQL-->>Backend: Détails complets (500 contenus GPS)
Backend->>PostgreSQL: SELECT * FROM contents<br/>WHERE city='Paris' OR dept='75'<br/>OR region='IDF' OR geo_level='national'
Note over PostgreSQL: Contenus par niveau géographique
PostgreSQL-->>Backend: Contenus ville/région/national
Backend->>Backend: Scoring & mixage :<br/>- GPS proche : 70%<br/>- Ville : 20%<br/>- Région : 8%<br/>- National : 2%
Backend-->>User: JSON: [{id, title, creator, audioUrl, score}, ...]<br/>(playlist mixée et scorée)
Note over User,CDN: 🎵 Lecture audio (requêtes séparées)
User->>CDN: GET /audio/content-123.m3u8
CDN-->>User: Playlist HLS
User->>CDN: GET /audio/content-123-segment-001.ts
CDN-->>User: Segment audio Opus
Note over User,CDN: 🔥 Warm Cache - Utilisateur 2 à Lyon (45km+)
participant User2 as 📱 Utilisateur 2<br/>(Lyon)
User2->>Backend: GET /contents?lat=45.7640&lon=4.8357&radius=50km
Backend->>Redis: EXISTS geo:catalog
Redis-->>Backend: true ✅ (cache chaud)
Backend->>Redis: GEORADIUS geo:catalog<br/>4.8357 45.7640 50 km
Note over Redis: Filtrage instantané<br/>sur cache existant
Redis-->>Backend: [content:789, content:012, ...]<br/>(~300 IDs différents)
Backend->>PostgreSQL: SELECT * FROM contents<br/>WHERE id IN (789, 012, ...)<br/>AND geo_level = 'gps_precise'
PostgreSQL-->>Backend: Détails complets
Backend->>PostgreSQL: SELECT * FROM contents<br/>WHERE city='Lyon' OR dept='69'<br/>OR region='Auvergne-RA' OR geo_level='national'
PostgreSQL-->>Backend: Contenus ville/région/national
Backend->>Backend: Scoring & mixage
Backend-->>User2: JSON: [{id, title, creator, audioUrl, score}, ...]
```
---
## Stratégie de cache
### Cache du catalogue complet (approche choisie)
**Principe** : Au premier cache miss, charger **TOUS** les contenus géolocalisés en une seule fois dans Redis.
**Avantages** :
- ✅ 1 seul cache miss au démarrage de l'instance
- ✅ Toutes les requêtes suivantes servies par Redis (n'importe quelle position GPS)
- ✅ Simple à gérer (1 seule clé Redis : `geo:catalog`)
- ✅ Pas de duplication de données
**Inconvénients** :
- ⚠️ Premier utilisateur subit le cold start (~500ms-1s)
- ⚠️ Nécessite charger toute la base (acceptable : ~20 MB pour 100K contenus)
**Alternatives non retenues** :
- Cache par zone géographique → cache miss fréquents, complexité gestion chevauchements
- Cache à la demande → trop de cache miss, pas d'optimisation réelle
---
## Détails techniques
### 1. Données stockées dans Redis
**Clé Redis** : `geo:catalog`
**Structure** :
```
GEOADD geo:catalog
2.3522 48.8566 "content:12345" # lon, lat, member
4.8357 45.7640 "content:67890"
...
```
**Taille mémoire** :
- ~200 bytes par entrée (ID + coordonnées + index geohash)
- 100K contenus = ~20 MB
- Négligeable pour Redis (plusieurs GB RAM disponibles)
**TTL** : 5 minutes (300 secondes)
- Le contenu géolocalisé est quasi-statique (change peu)
- Rechargement automatique toutes les 5 minutes si cache expiré
- Permet de propager les nouveaux contenus rapidement
### 2. Niveaux géographiques
Le cache Redis ne contient que les contenus avec **GPS précis** (`geo_level = 'gps_precise'`).
Les autres niveaux géographiques sont gérés par filtrage applicatif :
| Niveau | Stockage | Requête |
|--------|----------|---------|
| **GPS précis** | Redis + PostgreSQL | `GEORADIUS` puis `SELECT WHERE id IN (...)` |
| **Ville** | PostgreSQL uniquement | `SELECT WHERE city = ?` |
| **Département** | PostgreSQL uniquement | `SELECT WHERE department = ?` |
| **Région** | PostgreSQL uniquement | `SELECT WHERE region = ?` |
| **National** | PostgreSQL uniquement | `SELECT WHERE geo_level = 'national'` |
### 3. Commandes Redis utilisées
```bash
# Vérifier existence du cache
EXISTS geo:catalog
# Retour : 0 (n'existe pas) ou 1 (existe)
# Charger le catalogue complet (cold start)
GEOADD geo:catalog 2.3522 48.8566 "content:1" 4.8357 45.7640 "content:2" ...
# Retour : nombre d'éléments ajoutés
# Définir TTL 5 minutes
EXPIRE geo:catalog 300
# Rechercher contenus dans un rayon
GEORADIUS geo:catalog 2.3522 48.8566 50 km
# Retour : ["content:123", "content:456", ...]
# Optionnel : obtenir distance et coordonnées
GEORADIUS geo:catalog 2.3522 48.8566 50 km WITHDIST WITHCOORD
# Retour : [["content:123", "12.5", ["2.35", "48.85"]], ...]
```
### 4. Algorithme de scoring
Le backend mixe les résultats selon une pondération :
```
Score final =
(Pertinence GPS × 0.70) +
(Pertinence Ville × 0.20) +
(Pertinence Région × 0.08) +
(Pertinence National × 0.02)
```
**Critères de pertinence** :
- **GPS** : Plus proche = score élevé (distance inversée)
- **Ville/Région** : Matching exact = score maximal
- **National** : Score fixe faible (contenu générique)
**Mixage playlist** :
1. Trier tous les contenus par score décroissant
2. Appliquer diversité créateurs (pas 3 contenus du même créateur d'affilée)
3. Injecter contenus sponsorisés/mis en avant (futurs)
4. Retourner top 50 pour la session d'écoute
---
## Métriques de performance
### Temps de réponse typiques
| Scénario | Latence | Détail |
|----------|---------|--------|
| **Cold start** | 500-1000ms | Chargement 100K contenus dans Redis + requête |
| **Warm cache** | 5-10ms | `GEORADIUS` + `SELECT WHERE id IN (...)` |
| **TTL expiré** | 500-1000ms | Rechargement automatique |
### Charge serveurs
| Composant | Sans cache | Avec cache |
|-----------|------------|------------|
| **PostgreSQL CPU** | 60-80% | 10-20% |
| **Redis CPU** | N/A | 5-15% |
| **Throughput** | ~50 req/s | ~500 req/s |
---
## Cas limites et optimisations futures
### Cas limite 1 : Contenu très dense (Paris intra-muros)
**Problème** : 10K contenus dans rayon 5km → trop de résultats
**Solution actuelle** :
- Limiter résultats Redis à 1000 premiers (tri par distance)
- Scorer et filtrer côté application
**Optimisation future** :
- Ajuster rayon dynamiquement selon densité
- Utiliser `GEORADIUS ... COUNT 500` pour limiter côté Redis
### Cas limite 2 : Zones rurales (peu de contenu)
**Problème** : Rayon 50km retourne <10 contenus
**Solution actuelle** :
- Augmenter poids contenus région/national dans le scoring
- Suggérer contenus nationaux populaires
**Optimisation future** :
- Augmenter rayon automatiquement jusqu'à obtenir min 20 contenus
- `GEORADIUS ... 100 km` si rayon initial insuffisant
### Cas limite 3 : Nombreux créateurs actifs (évolutivité)
**Problème** : Cache 100K → 1M contenus (200 MB Redis)
**Solution actuelle** :
- 200 MB reste acceptable pour Redis
**Optimisation future** :
- Sharding géographique : cache Europe, cache USA, etc.
- Limiter cache aux contenus actifs 90 derniers jours
---
## Invalidation du cache
### Stratégies d'invalidation
| Événement | Action cache | Détail |
|-----------|--------------|--------|
| **Nouveau contenu publié** | Lazy (TTL) | Visible sous 5 minutes max |
| **Contenu supprimé/modéré** | Lazy (TTL) | Disparaît sous 5 minutes max |
| **Mise à jour GPS contenu** | Lazy (TTL) | Nouvelle position sous 5 minutes |
| **Déploiement backend** | Flush volontaire | `DEL geo:catalog` si schema change |
**Pas d'invalidation immédiate** pour simplifier l'architecture (cohérence éventuelle acceptable).
**Alternative future** :
- Pub/Sub Redis : notifier toutes les instances backend lors d'un changement
- `GEOADD geo:catalog 2.35 48.85 "content:new"` pour ajout immédiat
---
## Schéma simplifié
```
┌─────────────────────────────────────────────────────────┐
│ Utilisateur │
│ (Position GPS actuelle) │
└────────────────────────┬────────────────────────────────┘
│ GET /contents?lat=X&lon=Y&radius=Z
┌─────────────────────────────────────────────────────────┐
│ Backend Go (Fiber) │
│ │
│ 1. Vérifier cache Redis │
│ ├─ Cache HIT → GEORADIUS rapide │
│ └─ Cache MISS → Charger catalogue complet │
│ │
│ 2. Filtrer contenus GPS proches (Redis) │
│ 3. Récupérer contenus ville/région/national (PG) │
│ 4. Scorer et mixer selon pondération │
│ 5. Retourner playlist │
└────────────┬───────────────────────────┬────────────────┘
│ │
│ GEORADIUS │ SELECT détails
▼ ▼
┌─────────────────────┐ ┌───────────────────────────┐
│ Redis Geospatial │ │ PostgreSQL + PostGIS │
│ (Index spatial) │ │ (Données complètes) │
│ │ │ │
│ • geo:catalog │ │ • contents (détails) │
│ • TTL 5 min │ │ • users │
│ • ~20 MB mémoire │ │ • playlists │
└─────────────────────┘ └───────────────────────────┘
```
---
## Références
- [ADR-005 : Base de données](../../adr/005-base-de-donnees.md)
- [Redis Geospatial Commands](https://redis.io/docs/data-types/geospatial/)
- [PostGIS Documentation](https://postgis.net/documentation/)
- [Règles métier : Algorithme de recommandation](../../domains/recommendation/rules/algorithme-recommandation.md)
- [Règles métier : Centres d'intérêt](../../domains/recommendation/rules/centres-interet-jauges.md)

View File

@@ -19,7 +19,7 @@ Le domaine **Shared** constitue le **Core Domain** de RoadWave. Il contient les
## Modèle de données ## Modèle de données
- [Diagramme entités globales](entities/../entities/entities-overview.md) - Entités centrales : USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY - [Diagramme entités globales](entities/../entities/vue-ensemble.md) - Entités centrales : USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY
## Ubiquitous Language ## Ubiquitous Language

View File

@@ -1,48 +0,0 @@
# Séquence - Suppression de compte
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant API as Backend API
participant DB as PostgreSQL
participant E as Email
participant J as Job Quotidien
U->>API: DELETE /account (demande suppression)
API->>DB: UPDATE account_status=grace_period
API->>DB: UPDATE deletion_requested_at=NOW()
API->>DB: UPDATE sessions.revoked_at=NOW() (toutes)
API->>DB: UPDATE contents (cachés, non diffusés)
API->>E: Email avec lien annulation (30j)
API-->>U: Compte désactivé
alt Utilisateur change d'avis
U->>API: GET /account/cancel-deletion (lien email)
API->>DB: UPDATE account_status=active
API->>DB: UPDATE deletion_requested_at=NULL
API->>DB: Réactivation contenus
API->>E: Email confirmation annulation
API-->>U: Compte réactivé
else Après 30 jours
J->>DB: SELECT users WHERE grace_period > 30j
J->>DB: UPDATE account_status=deleted
J->>DB: Anonymisation données (email, pseudo...)
J->>DB: UPDATE contents.creator="Utilisateur supprimé"
J->>DB: DELETE listening_history, location_history, sessions
J->>DB: Conservation contenus anonymisés
J-->>DB: Suppression complète
end
```
## Légende
**Grace period** : 30 jours pour annuler
**Annulation** : Via lien email unique
**Anonymisation** :
- Données perso supprimées (email, pseudo, GPS...)
- Contenus conservés anonymes (intérêt communauté)
- Irréversible après 30j
**Alternative** : Purge auto inactivité 5 ans (notifications 90j/30j/7j avant)

View File

@@ -20,9 +20,9 @@ sequenceDiagram
Z-->>API: Token valide + user_id Z-->>API: Token valide + user_id
API->>DB: SELECT user WHERE id = ? API->>DB: SELECT user WHERE id = ?
DB-->>API: Données utilisateur DB-->>API: Données utilisateur
API->>DB: INSERT session (hash tokens, IP, device)
DB-->>API: Session créée
API-->>A: Profil utilisateur API-->>A: Profil utilisateur
A->>DB: INSERT session (hash tokens, IP, device)
A->>U: Connexion réussie A->>U: Connexion réussie
``` ```

View File

@@ -1,49 +0,0 @@
# Séquence - Export de données RGPD
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant API as Backend API
participant DB as PostgreSQL
participant W as Worker
participant S as OVH Storage
participant E as Email
U->>API: POST /exports (demande)
API->>DB: Vérification limite (1/mois)
API->>DB: INSERT export (status=pending)
API->>W: Job asynchrone
API-->>U: Export en préparation
W->>DB: Collecte données (profil, écoutes, contenus...)
W->>W: Génération JSON + HTML
loop Contenus audio
W->>DB: SELECT audio_url
W->>W: Copie fichier
end
W->>W: Création ZIP
W->>S: Upload fichier
S-->>W: URL signée (7j)
W->>DB: UPDATE export (status=ready, url, size)
W->>E: Email avec lien download
E-->>U: Export prêt (expire 7j)
U->>S: GET /export-signed-url
S-->>U: Téléchargement ZIP
Note over DB: Job quotidien
DB->>S: DELETE exports expirés (> 7j)
```
## Légende
**Conformité RGPD** : Délai max 48h (Article 20)
**Format** : ZIP (JSON machine-readable + HTML human-readable + audio)
**Limite** : 1 export/mois
**Expiration** : 7 jours calendaires
**Sécurité** : URL signée unique

View File

@@ -0,0 +1,32 @@
# Cycle de vie - Consentement parental
## Diagramme
```mermaid
stateDiagram-v2
[*] --> PendingValidation: Ado saisit email parent
PendingValidation --> Validated: Parent clique lien (< 7j)
PendingValidation --> Expired: Délai 7j écoulé
Validated --> Revoked: Parent révoque consentement
Validated --> AutoRevoked: Ado atteint 16 ans
Expired --> [*]
Revoked --> [*]
AutoRevoked --> [*]
```
## Règles
| État | Valeur | Description |
|------|--------|-------------|
| Pending Validation | `pending_validation` | Email envoyé parent, token valide 7j |
| Validated | `validated` | Parent a validé, restrictions 13-15 ans actives |
| Expired | `expired` | Token expiré sans validation, compte inactif |
| Revoked | `revoked` | Parent révoque, compte désactivé immédiatement |
| Auto-Revoked | `auto_revoked` | Ado atteint 16 ans, restrictions levées automatiquement |
**Délai expiration** : 7 jours
**Révocation** : Possible à tout moment via dashboard parent
**Transition automatique** : À 16 ans → compte passe en `active` standard

View File

@@ -0,0 +1,44 @@
# Cycle de vie - Incident de violation de données
## Diagramme
```mermaid
stateDiagram-v2
[*] --> Detected: Alerte monitoring
Detected --> Contained: Confinement immédiat (H+0)
Contained --> UnderInvestigation: Évaluation gravité (H+24)
UnderInvestigation --> Resolved: Risque faible (mesures suffisantes)
UnderInvestigation --> CNILNotificationRequired: Risque utilisateurs
CNILNotificationRequired --> CNILNotified: Notification CNIL (< H+72)
CNILNotified --> Resolved: Pas de risque élevé utilisateurs
CNILNotified --> UsersNotificationRequired: Risque élevé
UsersNotificationRequired --> UsersNotified: Email + push utilisateurs (< H+72)
UsersNotified --> Resolved: Post-mortem + correctifs
Resolved --> [*]
```
## Règles
| État | Valeur | Délai max |
|------|--------|-----------|
| Detected | `detected` | H+0 |
| Contained | `contained` | H+0 (immédiat) |
| Under Investigation | `under_investigation` | H+24 |
| CNIL Notification Required | `cnil_notification_required` | H+48 |
| CNIL Notified | `cnil_notified` | H+72 (Article 33 RGPD) |
| Users Notification Required | `users_notification_required` | H+48 |
| Users Notified | `users_notified` | H+72 (Article 34 RGPD) |
| Resolved | `resolved` | Post-incident |
**Sévérité** : `low` / `medium` / `high` / `critical`
**Notification CNIL** : Obligatoire si risque pour droits/libertés utilisateurs
**Notification utilisateurs** : Obligatoire si risque **élevé**
**Runbook** : `docs/rgpd/procedure-breach.md`

View File

@@ -0,0 +1,42 @@
# Cycle de vie - Suppression de compte
## Diagramme
```mermaid
stateDiagram-v2
[*] --> Requested: Utilisateur demande suppression
Requested --> GracePeriod: Compte désactivé, email envoyé
GracePeriod --> Cancelled: Clic lien annulation (< 30j)
GracePeriod --> PendingDeletion: Délai 30j écoulé
Cancelled --> [*]
PendingDeletion --> Deleted: Job cron suppression effective
Deleted --> [*]
```
## Règles
| État | Valeur | Description |
|------|--------|-------------|
| Requested | `requested` | Demande initiée, validation requise |
| Grace Period | `grace_period` | 30j annulation possible, compte inaccessible |
| Cancelled | `cancelled` | Utilisateur a annulé, compte réactivé |
| Pending Deletion | `pending_deletion` | File job cron (< 24h) |
| Deleted | `deleted` | Données supprimées, contenus anonymisés |
**Grace period** : 30 jours
**Pendant grace period** :
- Compte désactivé (login impossible)
- Contenus cachés (non diffusés)
- Sessions/tokens révoqués
- Email avec token annulation (valide 30j)
**Après 30j** :
- Données personnelles supprimées
- Contenus créés anonymisés (créateur = "Utilisateur supprimé")
- Historique GPS/écoute supprimé
- Irréversible

View File

@@ -1,6 +1,6 @@
# Modèle de données - Publicités # Modèle de données - Publicités
📖 Voir [Règles métier - Section 16 : Publicités](../rules/publicites.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 16 : Publicités](../rules/publicites.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Audio-guides # Modèle de données - Audio-guides
📖 Voir [Règles métier - Section 06 : Audio-guides multi-séquences](../rules/audio-guides.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 06 : Audio-guides multi-séquences](../rules/audio-guides.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Radio Live # Modèle de données - Radio Live
📖 Voir [Règles métier - Section 12 : Radio Live](../rules/radio-live.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 12 : Radio Live](../rules/radio-live.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Modération # Modèle de données - Modération
📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Monétisation créateurs # Modèle de données - Monétisation créateurs
📖 Voir [Règles métier - Section 18 : Monétisation](../rules/monetisation-createurs.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 18 : Monétisation](../rules/monetisation-createurs.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Premium # Modèle de données - Premium
📖 Voir [Règles métier - Section 17 : Premium](../rules/premium.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 17 : Premium](../rules/premium.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,6 +1,6 @@
# Modèle de données - Recommandation # Modèle de données - Recommandation
📖 Voir [Règles métier - Section 03 : Centres d'intérêt](../rules/centres-interet-jauges.md) | [Section 04 : Algorithme](../rules/algorithme-recommandation.md) | [Entités globales](../../_shared/entities/entities-overview.md) 📖 Voir [Règles métier - Section 03 : Centres d'intérêt](../rules/centres-interet-jauges.md) | [Section 04 : Algorithme](../rules/algorithme-recommandation.md) | [Entités globales](../../_shared/entities/vue-ensemble.md)
## Diagramme ## Diagramme

View File

@@ -1,260 +0,0 @@
# Vue d'ensemble des Features Gherkin - Modération
Ce document récapitule l'organisation complète des features Gherkin pour le système de modération de RoadWave, alignées avec les règles métier définies dans :
- [14-moderation-flows.md](domains/moderation/rules/moderation-flows.md)
- [15-moderation-communautaire.md](domains/moderation/rules/moderation-communautaire.md)
## Structure des Features
### 📱 Features UI (Interface Mobile Flutter)
**Localisation** : `features/ui/moderation/`
| Feature | Description | Règles métier couvertes |
|---------|-------------|------------------------|
| **signalement-ui.feature** | Interface de signalement mobile (formulaire, toast, découverte badges) | 14.1.1, 14.1.2, 14.1.3, 19.1.3 |
| **historique-signalements.feature** | Historique personnel des signalements de l'utilisateur | 14.1.3 |
| **badges-statistiques.feature** | Affichage des badges, statistiques et gamification | 19.1.4, 19.2, 19.3, 19.4 |
| **sanctions-appel.feature** | Interface de consultation des sanctions et processus d'appel | 14.3.1, 14.3.2, 14.3.3, 14.3.4 |
**Couverture** :
- ✅ Formulaire de signalement avec 7 catégories
- ✅ Toast de confirmation et modal de découverte
- ✅ Historique des signalements avec statuts
- ✅ Badges Bronze/Argent/Or et progression visuelle
- ✅ Statistiques personnelles et taux de pertinence
- ✅ Notifications multi-canal des sanctions
- ✅ Formulaire d'appel structuré
- ✅ Dark mode et accessibilité complète
### 🖥️ Features Admin (Dashboard Modérateur Web)
**Localisation** : `features/admin/moderation/`
| Feature | Description | Règles métier couvertes |
|---------|-------------|------------------------|
| **dashboard-moderateur.feature** | Dashboard principal de modération avec files d'attente | 14.2.2, 14.2.3, 14.4 |
| **outils-moderateur.feature** | Outils modérateur (player audio, transcription, historique créateur, actions) | 14.2.1, 14.4 |
**Couverture** :
- ✅ Files d'attente par priorité (CRITIQUE/HAUTE/MOYENNE/BASSE)
- ✅ Statistiques temps réel et SLA
- ✅ Player audio Wavesurfer.js avec waveform
- ✅ Transcription synchronisée avec surlignage
- ✅ Analyse IA (Whisper + NLP) avec scores de confiance
- ✅ Historique créateur 360° (strikes, contenus, patterns)
- ✅ Actions rapides avec raccourcis clavier
- ✅ Logs d'audit conformes DSA
### 🔌 Features API (Backend Go)
**Localisation** : `features/api/moderation/`
| Feature | Description | Règles métier couvertes | Statut |
|---------|-------------|------------------------|--------|
| **signalement.feature** | API de signalement de contenu | 14.1 | ✅ Existant - Complet |
| **traitement-signalements.feature** | Traitement IA et priorisation | 14.2 | ✅ Existant - Complet |
| **sanctions-notifications.feature** | Sanctions et notifications multi-canal | 14.3 | ✅ Existant - Complet |
| **moderation-preventive.feature** | Validation manuelle premiers contenus | 14.5 | ✅ Existant - Complet |
| **moderation-communautaire.feature** | Badges, scores de fiabilité, anti-abus | 19 | ✅ Existant - Complet |
**Couverture** :
- ✅ 7 catégories de signalement + commentaire optionnel
- ✅ IA pré-filtre (Whisper large-v3 + distilbert + roberta)
- ✅ SLA progressif : <2h CRITIQUE, <24h HAUTE, <72h BASSE
- ✅ Priorisation automatique (formule IA + signalements cumulés + fiabilité)
- ✅ Notifications multi-canal (push + in-app + email)
- ✅ Processus d'appel avec délai 7 jours et SLA 72h
- ✅ 3 niveaux de badges (Bronze/Argent/Or)
- ✅ Score de fiabilité et utilisateurs de confiance
- ✅ Réduction Premium -50% pour badge Or
- ✅ Anti-abus : limite 10/24h, audit trimestriel, sanctions
## Mapping Règles Métier → Features
### Section 14.1 - Signalement
| Règle | Feature API | Feature UI |
|-------|------------|-----------|
| 14.1.1 Catégories (7) | signalement.feature | signalement-ui.feature |
| 14.1.2 Commentaire optionnel | signalement.feature | signalement-ui.feature |
| 14.1.3 Confirmation + historique | signalement.feature | signalement-ui.feature, historique-signalements.feature |
### Section 14.2 - Traitement
| Règle | Feature API | Feature Admin |
|-------|------------|--------------|
| 14.2.1 IA pré-filtre (Whisper + NLP) | traitement-signalements.feature | outils-moderateur.feature |
| 14.2.2 Délais SLA | traitement-signalements.feature | dashboard-moderateur.feature |
| 14.2.3 Priorisation automatique | traitement-signalements.feature | dashboard-moderateur.feature |
### Section 14.3 - Sanctions
| Règle | Feature API | Feature UI |
|-------|------------|-----------|
| 14.3.1 Notification multi-canal | sanctions-notifications.feature | sanctions-appel.feature |
| 14.3.2 Détail sanction | sanctions-notifications.feature | sanctions-appel.feature |
| 14.3.3 Processus d'appel | sanctions-notifications.feature | sanctions-appel.feature |
| 14.3.4 Délai réponse appel (72h) | sanctions-notifications.feature | sanctions-appel.feature |
### Section 14.4 - Outils Modérateurs
| Règle | Feature Admin |
|-------|--------------|
| Dashboard modération | dashboard-moderateur.feature |
| Player audio + waveform | outils-moderateur.feature |
| Transcription + annotations | outils-moderateur.feature |
| Historique créateur 360° | outils-moderateur.feature |
| Actions rapides (A/R/E) | outils-moderateur.feature |
| Logs audit (DSA) | outils-moderateur.feature |
### Section 14.5 - Modération Préventive
| Règle | Feature API |
|-------|------------|
| Validation 3 premiers contenus | moderation-preventive.feature |
| Score de confiance dynamique | moderation-preventive.feature |
| Publicités validation manuelle | moderation-preventive.feature |
### Section 19 - Modération Communautaire
| Règle | Feature API | Feature UI |
|-------|------------|-----------|
| 19.1 Badges (Bronze/Argent/Or) | moderation-communautaire.feature | badges-statistiques.feature |
| 19.2 Score de fiabilité | moderation-communautaire.feature | - |
| 19.3 Utilisateur de confiance | moderation-communautaire.feature | badges-statistiques.feature |
| 19.4 Réduction Premium Or | moderation-communautaire.feature | badges-statistiques.feature |
| 19.5 Anti-abus | moderation-communautaire.feature | - |
## Stack Technique Testée
### Backend (Features API)
- **Framework tests** : Godog (Gherkin pour Go)
- **Localisation step definitions** : `backend/tests/bdd/moderation/`
- **Technologies testées** :
- API Go + Fiber (endpoints REST)
- PostgreSQL (stockage signalements, sanctions, badges)
- Redis (cache, files d'attente, priorisation)
- Whisper large-v3 (transcription audio)
- distilbert-base-uncased (analyse sentiment)
- facebook/roberta-hate-speech (détection haine)
- Email (Brevo/Resend)
- Push notifications (APNS/FCM)
### Frontend Mobile (Features UI)
- **Framework tests** : flutter_gherkin + integration_test
- **Localisation step definitions** : `mobile/tests/bdd/moderation/`
- **Technologies testées** :
- Flutter (UI mobile iOS/Android)
- Widgets personnalisés (formulaires, badges, statistiques)
- Animations (confettis, level up, toast)
- Dark mode et accessibilité (lecteur d'écran)
- Navigation et routing
- Gestion d'état (Provider/Riverpod)
### Frontend Admin (Features Admin)
- **Framework tests** : Cucumber.js + Playwright
- **Localisation step definitions** : `admin-dashboard/tests/e2e/moderation/` (à créer)
- **Technologies testées** :
- React + TypeScript
- TanStack Table (tableau signalements)
- Wavesurfer.js (player audio + waveform)
- WebSocket (temps réel)
- Raccourcis clavier
## Statistiques
### Couverture des Règles Métier
| Section | Scénarios | Règles couvertes | Statut |
|---------|-----------|------------------|--------|
| 14.1 Signalement | 25 | 100% | ✅ |
| 14.2 Traitement | 30 | 100% | ✅ |
| 14.3 Sanctions | 35 | 100% | ✅ |
| 14.4 Outils | 40 | 100% | ✅ Nouveau |
| 14.5 Préventive | 20 | 100% | ✅ |
| 19 Communautaire | 40 | 100% | ✅ |
| **Total** | **190** | **100%** | ✅ |
### Répartition Features
| Type | Nombre | Scénarios totaux |
|------|--------|------------------|
| Features API (Backend) | 5 | ~90 |
| Features UI (Mobile) | 4 | ~60 |
| Features Admin (Dashboard) | 2 | ~40 |
| **Total** | **11** | **~190** |
## Conformité
### Digital Services Act (DSA)
- ✅ Transparence : raison détaillée + extrait + transcription
- ✅ Délais : SLA 2h/24h/72h documentés et testés
- ✅ Recours : processus d'appel 7 jours + réponse 72h
- ✅ Traçabilité : logs audit complets avec conservation 3 ans
### RGPD
- ✅ Anonymat signaleur vis-à-vis du créateur
- ✅ Anonymisation des logs après 3 ans
- ✅ Suppression données personnelles à la demande
- ✅ Consentement notifications
### Accessibilité (WCAG AA)
- ✅ Contraste couleurs (dark mode testé)
- ✅ Labels lecteur d'écran
- ✅ Navigation clavier
- ✅ Tailles de police adaptatives
## Coûts
| Composant | Technologie | Coût MVP | Coût Scale |
|-----------|-------------|----------|------------|
| IA transcription | Whisper (self-hosted) | 0€ (CPU) | 50-200€/mois (GPU) |
| IA analyse | distilbert + roberta | 0€ | 0€ |
| Notifications email | Brevo/Resend | ~0.001€/email | ~10-50€/mois |
| Notifications push | APNS/FCM | 0€ | 0€ |
| Dashboard admin | React + TanStack | 0€ | 0€ |
| Badges communautaires | Backend Go | 0€ | 0-200€/mois (réductions Premium) |
| **Total** | - | **0-50€/mois** | **60-450€/mois** |
**ROI** : Positif dès 2-3 utilisateurs Badge Or actifs (économie modération > coût réductions Premium)
## Prochaines Étapes
1.~~Créer features UI modération mobile~~
2.~~Créer features dashboard modérateur~~
3. ⏳ Implémenter step definitions backend (Godog)
4. ⏳ Implémenter step definitions mobile (flutter_gherkin)
5. ⏳ Créer dashboard admin React + implémenter step definitions (Cucumber.js)
6. ⏳ Intégrer dans CI/CD (make test-bdd)
## Commandes de Test
```bash
# Tous les tests BDD
make test-bdd
# Tests modération backend uniquement
cd backend
godog run ../features/api/moderation/
# Tests modération mobile uniquement
cd mobile
flutter test integration_test/moderation/
# Tests dashboard admin (à venir)
cd admin-dashboard
npm run test:e2e
```
## Documentation Liée
- [Règles métier - Modération Flows](domains/moderation/rules/moderation-flows.md)
- [Règles métier - Modération Communautaire](domains/moderation/rules/moderation-communautaire.md)
- [ADR-023 - Architecture Modération](adr/023-architecture-moderation.md)
- [ADR-013 - Stratégie Tests](adr/013-strategie-tests.md)
---
**Dernière mise à jour** : 2026-02-02
**Statut** : ✅ Features complètes - Implémentation en cours

View File

@@ -1,58 +0,0 @@
# Documentation des Interfaces
Cette section documente les interfaces utilisateur de RoadWave (mobile et web).
## Organisation
### Mobile (Flutter)
L'application mobile est l'interface principale pour les utilisateurs finaux (conducteurs, piétons, touristes).
- **[Navigation & Architecture](mobile/navigation.md)** : Structure de navigation, routing
- **Écran d'accueil** : Feed de recommandations géolocalisées
- **Lecteur audio** : Player HLS, contrôles, playlists
- **Carte & découverte** : Vue carte, exploration géographique
- **Profil & réglages** : Jauges d'intérêt, paramètres
### Web (Créateurs)
L'interface web est destinée aux créateurs de contenu et aux annonceurs.
- **Dashboard** : Vue d'ensemble, statistiques
- **Upload de contenu** : Import audio, métadonnées, géolocalisation
- **Statistiques** : Analytics, revenus
## Conventions de documentation
### Captures d'écran
Placez les images dans `docs/interfaces/assets/` et référencez-les ainsi :
```markdown
![Description](assets/mobile/home-screen.png){ width="300" }
```
### Diagrammes de flux
Utilisez Mermaid pour les parcours utilisateur :
```mermaid
graph LR
A[Ouverture app] --> B{GPS actif?}
B -->|Oui| C[Chargement recommandations]
B -->|Non| D[Demande permission]
D --> C
```
### Onglets multi-plateformes
Pour montrer des variations iOS/Android :
=== "iOS"
Comportement spécifique iOS
=== "Android"
Comportement spécifique Android
## Principes de design
- **Mobile-first** : L'app mobile est l'expérience principale
- **Géolocalisation centrale** : L'UI doit toujours contextualiser par rapport à la position
- **Audio en arrière-plan** : Player persistant, mini-player
- **Mode sombre** : Support obligatoire (conduite de nuit)
- **Accessibilité** : WCAG 2.1 AA minimum

View File

@@ -1,208 +0,0 @@
# Navigation & Architecture Mobile
## Architecture de navigation
L'application mobile utilise une navigation par onglets (Bottom Navigation Bar) avec 4 sections principales.
```mermaid
graph TD
A[App Shell] --> B[🏠 Accueil]
A --> C[🗺️ Carte]
A --> D[🎵 Bibliothèque]
A --> E[👤 Profil]
B --> B1[Feed Recommandations]
B --> B2[Lecteur Audio]
C --> C1[Vue Carte]
C --> C2[Détail Point]
D --> D1[Mes Playlists]
D --> D2[Contenus Sauvegardés]
D --> D3[Historique]
E --> E1[Jauges Intérêt]
E --> E2[Paramètres]
E --> E3[Abonnements]
```
## Bottom Navigation Bar
### Onglet 1 : Accueil 🏠
Point d'entrée principal après le lancement de l'app.
**Fonctionnalités** :
- Feed de recommandations basé sur la géolocalisation + intérêts
- Rafraîchissement pull-to-refresh
- Lecture directe depuis le feed
**Navigation vers** :
- Détail d'un contenu (push)
- Lecteur plein écran (modal)
- Profil d'un créateur (push)
### Onglet 2 : Carte 🗺️
Exploration visuelle des contenus par géolocalisation.
**Fonctionnalités** :
- Carte interactive (MapLibre GL)
- Markers pour contenus à proximité
- Clusters pour zones denses
- Recherche par adresse
**Navigation vers** :
- Détail d'un point (bottom sheet)
- Lecteur audio (modal persistant)
### Onglet 3 : Bibliothèque 🎵
Accès aux contenus sauvegardés, historique, playlists.
**Fonctionnalités** :
- Playlists personnelles
- Contenus favoris
- Historique d'écoute
- Téléchargements offline
### Onglet 4 : Profil 👤
Gestion du compte, préférences, jauges d'intérêt.
**Fonctionnalités** :
- Visualisation/édition jauges d'intérêt
- Paramètres de l'app
- Gestion abonnement Premium
- Déconnexion
## Lecteur Audio (Modal persistant)
Le lecteur est un composant modal qui persiste lors de la navigation entre onglets.
```mermaid
stateDiagram-v2
[*] --> Collapsed: Lecture démarre
Collapsed --> Expanded: Tap sur mini-player
Expanded --> Collapsed: Swipe down
Collapsed --> [*]: Stop audio
Expanded --> Queue: Tap "À suivre"
Queue --> Expanded: Retour
```
=== "État Collapsed (Mini-player)"
- Hauteur : 60dp
- Position : Bottom (au-dessus de la Bottom Nav Bar)
- Affiche : Titre, artiste, play/pause, skip
- Interaction : Tap pour expand
=== "État Expanded (Lecteur plein écran)"
- Plein écran modal
- Cover art grande taille
- Contrôles avancés (repeat, shuffle, queue)
- Scrubber timeline
- Boutons : like, share, download, add to playlist
## Routing Flutter
### Configuration
Utilisation de **go_router** (voir [ADR-020](../../adr/020-librairies-flutter.md)).
```dart
// Exemple simplifié
GoRouter(
routes: [
ShellRoute(
builder: (context, state, child) => AppShell(child: child),
routes: [
GoRoute(path: '/home', builder: (context, state) => HomeScreen()),
GoRoute(path: '/map', builder: (context, state) => MapScreen()),
GoRoute(path: '/library', builder: (context, state) => LibraryScreen()),
GoRoute(path: '/profile', builder: (context, state) => ProfileScreen()),
],
),
GoRoute(
path: '/content/:id',
builder: (context, state) => ContentDetailScreen(
contentId: state.pathParameters['id']!,
),
),
],
);
```
### Deep Links
L'app supporte les deep links pour :
- `roadwave://content/{id}` : Ouvrir un contenu spécifique
- `roadwave://map?lat={lat}&lon={lon}` : Ouvrir la carte à une position
- `roadwave://profile` : Ouvrir le profil
## Gestion d'état
- **Provider** pour l'état global (user, player, location)
- **BLoC** pour les features complexes (recommendation, map)
- **Riverpod** pour l'injection de dépendances
Voir [ADR-020](../../adr/020-librairies-flutter.md) pour les détails.
## Permissions système
La navigation gère les demandes de permissions de manière contextuelle :
1. **Géolocalisation** : Demandée au premier lancement, avant d'afficher l'accueil
2. **Notifications** : Demandée après 3 sessions utilisateur (opt-in soft)
3. **Stockage** : Demandée lors du premier téléchargement offline
Voir [mobile/permissions-strategy.md](../../mobile/permissions-strategy.md) pour la stratégie complète.
## Transitions et animations
### Transitions entre onglets
- Aucune animation (changement instantané)
- Préservation du scroll state sur chaque onglet
### Navigation push/pop
- iOS : Slide transition (standard Cupertino)
- Android : Fade + Slide transition (Material Design)
### Mini-player expand/collapse
- Spring animation (bounce léger)
- Durée : 300ms
- Curve : `Curves.easeInOutCubic`
## Gestion du back button (Android)
```mermaid
graph TD
A[Back pressed] --> B{Lecteur expanded?}
B -->|Oui| C[Collapse lecteur]
B -->|Non| D{Sur onglet Accueil?}
D -->|Non| E[Retour à Accueil]
D -->|Oui| F{Audio en cours?}
F -->|Oui| G[Dialog: Quitter?]
F -->|Non| H[Quitter app]
G -->|Confirme| H
G -->|Annule| I[Rester]
```
## Accessibilité
- **Screen readers** : Labels sémantiques sur tous les boutons
- **Navigation clavier** : Support complet (pour tablettes avec clavier)
- **Contraste** : WCAG 2.1 AA minimum (4.5:1 pour texte)
- **Taille des touch targets** : 48dp minimum
## Mode sombre
Support obligatoire du mode sombre (conduite de nuit).
=== "Mode Clair"
- Fond : White / Light Gray (#F5F5F5)
- Texte : Dark Gray (#212121)
- Accent : Indigo (#3F51B5)
=== "Mode Sombre"
- Fond : Dark (#121212)
- Texte : White (#FFFFFF)
- Accent : Indigo clair (#7986CB)
Détection automatique via `MediaQuery.platformBrightness` ou choix manuel dans les paramètres.

View File

@@ -25,7 +25,6 @@ theme:
features: features:
- navigation.tabs - navigation.tabs
- navigation.sections - navigation.sections
- navigation.expand
- navigation.top - navigation.top
- navigation.tracking - navigation.tracking
- search.suggest - search.suggest
@@ -60,40 +59,40 @@ markdown_extensions:
nav: nav:
- Accueil: README.md - Accueil: README.md
- Architecture Technique: TECHNICAL.md - Architecture:
- Architecture Decision Records (ADR): - 'Vue d''ensemble': TECHNICAL.md
- 'Vue d''ensemble': adr/README.md - 'Decision Records (ADR)':
- 'Core Architecture': - 'Core Architecture':
- 'ADR-001: Langage Backend': adr/001-langage-backend.md - 'ADR-001: Langage Backend': adr/001-langage-backend.md
- 'ADR-010: Architecture Backend': adr/010-architecture-backend.md - 'ADR-010: Architecture Backend': adr/010-architecture-backend.md
- 'ADR-011: ORM et Accès Données': adr/011-orm-acces-donnees.md - 'ADR-011: ORM et Accès Données': adr/011-orm-acces-donnees.md
- 'ADR-012: Frontend Mobile': adr/012-frontend-mobile.md - 'ADR-012: Frontend Mobile': adr/012-frontend-mobile.md
- 'ADR-014: Organisation en Monorepo': adr/014-organisation-monorepo.md - 'ADR-014: Organisation en Monorepo': adr/014-organisation-monorepo.md
- 'Data & Infrastructure': - 'Data & Infrastructure':
- 'ADR-005: Base de données': adr/005-base-de-donnees.md - 'ADR-005: Base de données': adr/005-base-de-donnees.md
- 'ADR-021: Solution de Cache': adr/021-solution-cache.md - 'ADR-021: Solution de Cache': adr/021-solution-cache.md
- 'ADR-015: Hébergement': adr/015-hebergement.md - 'ADR-015: Hébergement': adr/015-hebergement.md
- 'ADR-019: Géolocalisation par IP': adr/019-geolocalisation-ip.md - 'ADR-019: Géolocalisation par IP': adr/019-geolocalisation-ip.md
- 'Streaming & Content': - 'Streaming & Content':
- 'ADR-002: Protocole Streaming': adr/002-protocole-streaming.md - 'ADR-002: Protocole Streaming': adr/002-protocole-streaming.md
- 'ADR-003: Codec Audio': adr/003-codec-audio.md - 'ADR-003: Codec Audio': adr/003-codec-audio.md
- 'ADR-004: CDN': adr/004-cdn.md - 'ADR-004: CDN': adr/004-cdn.md
- 'Security & Auth': - 'Security & Auth':
- 'ADR-006: Chiffrement': adr/006-chiffrement.md - 'ADR-006: Chiffrement': adr/006-chiffrement.md
- 'ADR-008: Authentification': adr/008-authentification.md - 'ADR-008: Authentification': adr/008-authentification.md
- 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md - 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md
- 'Testing & Quality': - 'Testing & Quality':
- 'ADR-007: Tests BDD': adr/007-tests-bdd.md - 'ADR-007: Tests BDD': adr/007-tests-bdd.md
- 'ADR-013: Stratégie Tests': adr/013-strategie-tests.md - 'ADR-013: Stratégie Tests': adr/013-strategie-tests.md
- 'ADR-022: CI/CD Monorepo': adr/022-strategie-cicd-monorepo.md - 'ADR-022: CI/CD Monorepo': adr/022-strategie-cicd-monorepo.md
- 'Features & Operations': - 'Features & Operations':
- 'ADR-009: Solution Paiement': adr/009-solution-paiement.md - 'ADR-009: Solution Paiement': adr/009-solution-paiement.md
- 'ADR-016: Service Emailing': adr/016-service-emailing.md - 'ADR-016: Service Emailing': adr/016-service-emailing.md
- 'ADR-017: Notifications Géolocalisées': adr/017-notifications-geolocalisees.md - 'ADR-017: Notifications Géolocalisées': adr/017-notifications-geolocalisees.md
- 'ADR-018: Librairies Go': adr/018-librairies-go.md - 'ADR-018: Librairies Go': adr/018-librairies-go.md
- 'ADR-020: Librairies Flutter': adr/020-librairies-flutter.md - 'ADR-020: Librairies Flutter': adr/020-librairies-flutter.md
- 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md - 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md
- 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md - 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md
- Domaines DDD: - Domaines DDD:
- 'Context Map': domains/README.md - 'Context Map': domains/README.md
- 'Core Domain': - 'Core Domain':
@@ -104,6 +103,32 @@ nav:
- Gestion Erreurs: domains/_shared/rules/gestion-erreurs.md - Gestion Erreurs: domains/_shared/rules/gestion-erreurs.md
- 'Annexe Post-MVP': domains/_shared/rules/ANNEXE-POST-MVP.md - 'Annexe Post-MVP': domains/_shared/rules/ANNEXE-POST-MVP.md
- Features BDD: - Features BDD:
- 'Authentication':
- Appareil de confiance et 2FA: generated/bdd/_shared/features/authentication/appareil-confiance-2fa.md
- Classification par âge: generated/bdd/_shared/features/authentication/classification-age.md
- Connexion: generated/bdd/_shared/features/authentication/connexion.md
- Gestion de compte: generated/bdd/_shared/features/authentication/gestion-compte.md
- Inscription: generated/bdd/_shared/features/authentication/inscription.md
- Limite de tentatives de connexion: generated/bdd/_shared/features/authentication/limite-tentatives-connexion.md
- Sessions multi-devices: generated/bdd/_shared/features/authentication/multi-device-sessions.md
- Récupération de compte: generated/bdd/_shared/features/authentication/recuperation-compte.md
- Récupération de mot de passe avancée: generated/bdd/_shared/features/authentication/recuperation-mot-passe-avancee.md
- Sessions et tokens: generated/bdd/_shared/features/authentication/sessions-tokens.md
- Authentification à deux facteurs: generated/bdd/_shared/features/authentication/two-factor-authentication.md
- Validation mot de passe: generated/bdd/_shared/features/authentication/validation-mot-passe.md
- Vérification email: generated/bdd/_shared/features/authentication/verification-email.md
- 'Profil':
- Badge vérifié: generated/bdd/_shared/features/profil/badge-verifie.md
- Profil créateur: generated/bdd/_shared/features/profil/profil-createur.md
- Statistiques arrondies: generated/bdd/_shared/features/profil/statistiques-arrondies.md
- 'Partage':
- Partage de contenu: generated/bdd/_shared/features/partage/partage-contenu.md
- Partage de contenu Premium: generated/bdd/_shared/features/partage/partage-contenu-premium.md
- 'Error Handling':
- Aucun contenu disponible: generated/bdd/_shared/features/error-handling/aucun-contenu-disponible.md
- Contenu supprimé pendant écoute: generated/bdd/_shared/features/error-handling/contenu-supprime-pendant-ecoute.md
- Géolocalisation désactivée: generated/bdd/_shared/features/error-handling/geolocalisation-desactivee.md
- Perte réseau: generated/bdd/_shared/features/error-handling/perte-reseau.md
- 'RGPD & Conformité': - 'RGPD & Conformité':
- Consentement: generated/bdd/_shared/features/rgpd-compliance/consentement.md - Consentement: generated/bdd/_shared/features/rgpd-compliance/consentement.md
- Anonymisation GPS: generated/bdd/_shared/features/rgpd-compliance/anonymisation-gps.md - Anonymisation GPS: generated/bdd/_shared/features/rgpd-compliance/anonymisation-gps.md
@@ -118,7 +143,7 @@ nav:
- Politique Confidentialité: generated/bdd/_shared/features/rgpd-compliance/privacy-policy.md - Politique Confidentialité: generated/bdd/_shared/features/rgpd-compliance/privacy-policy.md
- Droits Utilisateurs: generated/bdd/_shared/features/rgpd-compliance/user-rights.md - Droits Utilisateurs: generated/bdd/_shared/features/rgpd-compliance/user-rights.md
- Entités: - Entités:
- "Vue d'ensemble": domains/_shared/entities/entities-overview.md - "Vue d'ensemble": domains/_shared/entities/vue-ensemble.md
- 'Auth & Sécurité': - 'Auth & Sécurité':
- Sessions: domains/_shared/entities/sessions.md - Sessions: domains/_shared/entities/sessions.md
- Devices: domains/_shared/entities/devices.md - Devices: domains/_shared/entities/devices.md
@@ -136,23 +161,21 @@ nav:
- Jauges Intérêt: domains/_shared/entities/interest-gauges.md - Jauges Intérêt: domains/_shared/entities/interest-gauges.md
- Signalements: domains/_shared/entities/reports.md - Signalements: domains/_shared/entities/reports.md
- 'États (Lifecycles)': - 'États (Lifecycles)':
- Compte Utilisateur: domains/_shared/states/user-account-lifecycle.md - Compte Utilisateur: domains/_shared/states/compte-utilisateur.md
- Contenu: domains/_shared/states/content-lifecycle.md - Contenu: domains/_shared/states/contenu.md
- Session: domains/_shared/states/session-lifecycle.md - Session: domains/_shared/states/session.md
- Signalement: domains/_shared/states/report-lifecycle.md - Signalement: domains/_shared/states/signalement.md
- Export Données: domains/_shared/states/export-lifecycle.md - Export Données: domains/_shared/states/export-donnees.md
- Consentement Parental: domains/_shared/states/parental-consent-lifecycle.md - Consentement Parental: domains/_shared/states/consentement-parental.md
- Suppression Compte: domains/_shared/states/account-deletion-lifecycle.md - Suppression Compte: domains/_shared/states/suppression-compte.md
- Incident Breach: domains/_shared/states/breach-incident-lifecycle.md - Incident Breach: domains/_shared/states/incident-breach.md
- Séquences: - Séquences:
- Authentification: domains/_shared/sequences/authentication-flow.md - Authentification: domains/_shared/sequences/authentification.md
- Refresh Token: domains/_shared/sequences/token-refresh.md - Refresh Token: domains/_shared/sequences/refresh-token.md
- Modération Contenu: domains/_shared/sequences/content-moderation.md - Modération Contenu: domains/_shared/sequences/moderation-contenu.md
- Signalement: domains/_shared/sequences/content-report.md - Signalement: domains/_shared/sequences/signalement.md
- Export Données: domains/_shared/sequences/data-export.md - Export Données: domains/_shared/sequences/export-donnees.md
- Export Données (RGPD): domains/_shared/sequences/export-donnees.md - Suppression Compte: domains/_shared/sequences/suppression-compte.md
- Suppression Compte: domains/_shared/sequences/account-deletion.md
- Suppression Compte (RGPD): domains/_shared/sequences/suppression-compte.md
- Consentement Parental: domains/_shared/sequences/consentement-parental.md - Consentement Parental: domains/_shared/sequences/consentement-parental.md
- Anonymisation GPS: domains/_shared/sequences/anonymisation-gps.md - Anonymisation GPS: domains/_shared/sequences/anonymisation-gps.md
- Notification Breach: domains/_shared/sequences/notification-breach.md - Notification Breach: domains/_shared/sequences/notification-breach.md
@@ -165,6 +188,28 @@ nav:
- Interactions: domains/recommendation/rules/interactions-navigation.md - Interactions: domains/recommendation/rules/interactions-navigation.md
- Entités: - Entités:
- Modèle Recommandation: domains/recommendation/entities/modele-recommandation.md - Modèle Recommandation: domains/recommendation/entities/modele-recommandation.md
- Tests BDD:
- 'Interest Gauges':
- API - Pas de dégradation temporelle: generated/bdd/recommendation/features/interest-gauges/degradation-temporelle.md
- API - Évolution des jauges d'intérêt: generated/bdd/recommendation/features/interest-gauges/evolution-jauges.md
- API - Jauge initiale et cold start: generated/bdd/recommendation/features/interest-gauges/jauge-initiale.md
- Neutralisation des pénalités de skip pour abonnés: generated/bdd/recommendation/features/interest-gauges/skip-abonnes-neutralisation.md
- 'Recherche':
- Filtres avancés de recherche: generated/bdd/recommendation/features/recherche/filtres-avances.md
- Page de résultats avec carte interactive: generated/bdd/recommendation/features/recherche/page-resultats-carte.md
- Recherche de contenu: generated/bdd/recommendation/features/recherche/recherche.md
- 'Recommendation':
- Classification de géo-pertinence des contenus: generated/bdd/recommendation/features/recommendation/classification-geo.md
- Gestion du contenu politique (MVP simplifié): generated/bdd/recommendation/features/recommendation/contenu-politique.md
- Contenus géolocalisés en mode voiture: generated/bdd/recommendation/features/recommendation/declenchement-geo.md
- Gestion de l'historique et reproposition: generated/bdd/recommendation/features/recommendation/historique-reproposition.md
- Médias traditionnels sur RoadWave: generated/bdd/recommendation/features/recommendation/medias-traditionnels.md
- Mode Kids pour utilisateurs 13-15 ans: generated/bdd/recommendation/features/recommendation/mode-kids.md
- Paramétrabilité admin et A/B testing: generated/bdd/recommendation/features/recommendation/parametrabilite-admin.md
- Paramétrabilité utilisateur et profils: generated/bdd/recommendation/features/recommendation/parametrabilite-utilisateur.md
- Formule de scoring et recommandation: generated/bdd/recommendation/features/recommendation/scoring-recommandation.md
- 'Search':
- Recherche géographique de contenus avec Nominatim: generated/bdd/recommendation/features/search/geolocation-search.md
- '🎙️ Content': - '🎙️ Content':
- Vue d'ensemble: domains/content/README.md - Vue d'ensemble: domains/content/README.md
- Règles: - Règles:
@@ -176,6 +221,72 @@ nav:
- Entités: - Entités:
- Modèle Audio-guides: domains/content/entities/modele-audio-guides.md - Modèle Audio-guides: domains/content/entities/modele-audio-guides.md
- Modèle Radio Live: domains/content/entities/modele-radio-live.md - Modèle Radio Live: domains/content/entities/modele-radio-live.md
- Tests BDD:
- 'Audio Guides':
- Affichage avancé distance, direction et ETA: generated/bdd/content/features/audio-guides/affichage-distance-direction-eta.md
- Création d'audio-guide multi-séquences: generated/bdd/content/features/audio-guides/creation-audio-guide.md
- API - Création et gestion d'audio-guides multi-séquences: generated/bdd/content/features/audio-guides/creation-gestion.md
- Wizard complet de création d'audio-guide multi-séquences: generated/bdd/content/features/audio-guides/creation-wizard-complet.md
- Déclenchement GPS automatique des audio-guides en mode voiture: generated/bdd/content/features/audio-guides/declenchement-gps-voiture-complet.md
- API - Déclenchement GPS et géolocalisation audio-guides: generated/bdd/content/features/audio-guides/declenchement-gps.md
- Détection automatique du mode de déplacement: generated/bdd/content/features/audio-guides/detection-mode-deplacement.md
- Gestion des points d'intérêt manqués: generated/bdd/content/features/audio-guides/gestion-point-manque.md
- Intégration audio-guides avec autres fonctionnalités: generated/bdd/content/features/audio-guides/integration-fonctionnalites.md
- API - Métriques et analytics audio-guides: generated/bdd/content/features/audio-guides/metriques-analytics.md
- Audio-guide mode piéton (navigation manuelle): generated/bdd/content/features/audio-guides/mode-pieton.md
- Audio-guide mode voiture (GPS automatique): generated/bdd/content/features/audio-guides/mode-voiture.md
- Modes vélo et transports en commun complets: generated/bdd/content/features/audio-guides/modes-velo-transport-complet.md
- Audio-guides modes vélo et transport: generated/bdd/content/features/audio-guides/modes-velo-transport.md
- Navigation libre complète en mode piéton: generated/bdd/content/features/audio-guides/navigation-libre-pieton-complet.md
- Auto-play publicités en mode piéton uniquement: generated/bdd/content/features/audio-guides/pieton-pub-autoplay.md
- Audio-guides Premium et monétisation: generated/bdd/content/features/audio-guides/premium-monetisation.md
- Sauvegarde et reprise de progression audio-guide: generated/bdd/content/features/audio-guides/progression-sauvegarde.md
- API - Progression et synchronisation audio-guides: generated/bdd/content/features/audio-guides/progression-sync.md
- Système de publicités complet: generated/bdd/content/features/audio-guides/publicites-complet.md
- API - Publicités dans audio-guides: generated/bdd/content/features/audio-guides/publicites.md
- Rayon de déclenchement configurable par le créateur: generated/bdd/content/features/audio-guides/rayon-configurable-createur.md
- Reprise de progression complète: generated/bdd/content/features/audio-guides/reprise-progression-complet.md
- Sauvegarde et synchronisation de progression: generated/bdd/content/features/audio-guides/sauvegarde-sync-progression.md
- Système double clic et sortie audio-guide mode voiture: generated/bdd/content/features/audio-guides/systeme-double-clic-sortie.md
- 'Content Creation':
- Fair use 30 secondes musique: generated/bdd/content/features/content-creation/fair-use-30s-musique.md
- Génération automatique d'image de couverture: generated/bdd/content/features/content-creation/image-couverture-auto.md
- Métadonnées et publication de contenu: generated/bdd/content/features/content-creation/metadonnees-publication.md
- Modification et suppression de contenu: generated/bdd/content/features/content-creation/modification-suppression.md
- Restrictions de modification de contenu publié: generated/bdd/content/features/content-creation/restrictions-modification.md
- Suppression et marquage de contenu: generated/bdd/content/features/content-creation/suppression-marquage.md
- Upload et encodage de contenu audio: generated/bdd/content/features/content-creation/upload-encodage.md
- Validation et détection automatique de musique: generated/bdd/content/features/content-creation/validation-musique-detection.md
- Validation des 3 premiers contenus: generated/bdd/content/features/content-creation/validation-premiers-contenus.md
- 'Navigation':
- Basculement automatique entre modes voiture et piéton: generated/bdd/content/features/navigation/auto-switching-modes.md
- Décompte 5 secondes pour transitions séquences: generated/bdd/content/features/navigation/decompte-5s-transition.md
- Calcul ETA et notification contenus géolocalisés: generated/bdd/content/features/navigation/eta-calculation.md
- API - File d'attente et pré-calcul des contenus: generated/bdd/content/features/navigation/file-attente.md
- Historique géolocalisé des contenus écoutés: generated/bdd/content/features/navigation/historique-geo-contenu.md
- Mode stationnement et pause automatique: generated/bdd/content/features/navigation/mode-stationnement.md
- Notifications minimalistes en mode voiture: generated/bdd/content/features/navigation/notification-minimaliste-voiture.md
- API - Notifications géolocalisées et quota anti-spam: generated/bdd/content/features/navigation/notifications-geolocalisees.md
- Quota et cooldown pour contenus géolocalisés: generated/bdd/content/features/navigation/quota-cooldown.md
- 'Radio Live':
- Architecture technique radio live: generated/bdd/content/features/radio-live/architecture-technique-live.md
- Arrêt du live: generated/bdd/content/features/radio-live/arret-live.md
- Comportement auditeur pendant un live: generated/bdd/content/features/radio-live/comportement-auditeur-live.md
- Comportement auditeur pendant un live: generated/bdd/content/features/radio-live/comportement-auditeur.md
- Démarrage d'un live: generated/bdd/content/features/radio-live/demarrage-live.md
- Enregistrement et publication de replays radio live: generated/bdd/content/features/radio-live/enregistrement-publication-replay.md
- Interdictions et modération des lives: generated/bdd/content/features/radio-live/interdictions-moderation-live.md
- 'Ui Content Creation':
- Éducation aux droits d'auteur: generated/bdd/content/features/ui-content-creation/education-droits-auteur.md
- 'Ui Navigation':
- Actions complémentaires - Mode piéton: generated/bdd/content/features/ui-navigation/actions-mode-pieton.md
- Commande "Précédent": generated/bdd/content/features/ui-navigation/commande-precedent.md
- Commandes vocales CarPlay et Android Auto: generated/bdd/content/features/ui-navigation/commandes-vocales.md
- Commandes au volant et interactions simplifiées: generated/bdd/content/features/ui-navigation/commandes-volant.md
- UI - Contenus géolocalisés en mode voiture: generated/bdd/content/features/ui-navigation/contenus-geolocalises-voiture.md
- File d'attente et commande "Suivant": generated/bdd/content/features/ui-navigation/file-attente-suivant.md
- Lecture en boucle et enchaînement automatique: generated/bdd/content/features/ui-navigation/lecture-enchainement.md
- Mode piéton - Notifications push et basculement automatique: generated/bdd/content/features/ui-navigation/mode-pieton-notifications-push.md
- '🛡️ Moderation': - '🛡️ Moderation':
- Vue d'ensemble: domains/moderation/README.md - Vue d'ensemble: domains/moderation/README.md
- Règles: - Règles:
@@ -188,6 +299,33 @@ nav:
- 'Flux: Signalement': domains/moderation/flows/moderation-signalement.md - 'Flux: Signalement': domains/moderation/flows/moderation-signalement.md
- 'États: Lifecycle': domains/moderation/states/signalement-lifecycle.md - 'États: Lifecycle': domains/moderation/states/signalement-lifecycle.md
- 'Séquence: Appel': domains/moderation/sequences/processus-appel-moderation.md - 'Séquence: Appel': domains/moderation/sequences/processus-appel-moderation.md
- Tests BDD:
- 'Admin':
- Dashboard modération pour modérateurs: generated/bdd/moderation/features/admin/dashboard-moderateur.md
- Outils modérateur - Player audio et actions: generated/bdd/moderation/features/admin/outils-moderateur.md
- 'API':
- Procédure d'appel pour droits d'auteur: generated/bdd/moderation/features/api/appel-droits-auteur.md
- Audit trimestriel du système de modération: generated/bdd/moderation/features/api/audit-trimestriel.md
- Système de badges de modération: generated/bdd/moderation/features/api/badges-system.md
- Détection de patterns suspects par ML: generated/bdd/moderation/features/api/detection-patterns-suspects.md
- Limites temporelles anti-abus de modération: generated/bdd/moderation/features/api/limite-temporelle-anti-abus.md
- Modération communautaire - Badges et récompenses: generated/bdd/moderation/features/api/moderation-communautaire.md
- Modération préventive: generated/bdd/moderation/features/api/moderation-preventive.md
- Réduction Premium pour badge Or: generated/bdd/moderation/features/api/reduction-premium-badge-or.md
- Sanctions progressives pour abus de signalement: generated/bdd/moderation/features/api/sanctions-abus-progressives.md
- Sanctions progressives pour violations droits d'auteur: generated/bdd/moderation/features/api/sanctions-droits-auteur.md
- Sanctions et notifications de modération: generated/bdd/moderation/features/api/sanctions-notifications.md
- Score de fiabilité et priorisation des signalements: generated/bdd/moderation/features/api/score-fiabilite-priorisation.md
- Signalement musique a posteriori: generated/bdd/moderation/features/api/signalement-musique-posteriori.md
- Signalement de contenu inapproprié: generated/bdd/moderation/features/api/signalement.md
- Traitement des signalements par l'IA et les modérateurs: generated/bdd/moderation/features/api/traitement-signalements.md
- Statut utilisateur de confiance: generated/bdd/moderation/features/api/utilisateur-confiance.md
- 'Ui':
- Badges et statistiques de modération communautaire (Mobile): generated/bdd/moderation/features/ui/badges-statistiques.md
- Historique des signalements utilisateur (Mobile): generated/bdd/moderation/features/ui/historique-signalements.md
- Modal de découverte des badges: generated/bdd/moderation/features/ui/modal-decouverte-badges.md
- Interface sanctions et processus d'appel (Mobile): generated/bdd/moderation/features/ui/sanctions-appel.md
- Interface de signalement de contenu (Mobile): generated/bdd/moderation/features/ui/signalement-ui.md
- 'Generic Subdomains': - 'Generic Subdomains':
- '📢 Advertising': - '📢 Advertising':
- Vue d'ensemble: domains/advertising/README.md - Vue d'ensemble: domains/advertising/README.md
@@ -195,6 +333,15 @@ nav:
- Publicités: domains/advertising/rules/publicites.md - Publicités: domains/advertising/rules/publicites.md
- Entités: - Entités:
- Modèle Publicités: domains/advertising/entities/modele-publicites.md - Modèle Publicités: domains/advertising/entities/modele-publicites.md
- Tests BDD:
- 'Publicites':
- Création de campagnes publicitaires: generated/bdd/advertising/features/publicites/campagnes-publicitaires.md
- Caractéristiques et facturation des publicités: generated/bdd/advertising/features/publicites/caracteristiques-pub.md
- Ciblage horaire publicités et gestion fuseaux horaires: generated/bdd/advertising/features/publicites/ciblage-horaire-fuseaux-horaires.md
- Gestion du budget et alertes publicitaires: generated/bdd/advertising/features/publicites/gestion-budget-pub.md
- Insertion et fréquence des publicités: generated/bdd/advertising/features/publicites/insertion-frequence-pub.md
- Métriques d'engagement et dashboard publicitaire: generated/bdd/advertising/features/publicites/metriques-engagement-pub.md
- Validation et modération des publicités: generated/bdd/advertising/features/publicites/validation-moderation-pub.md
- '💎 Premium': - '💎 Premium':
- Vue d'ensemble: domains/premium/README.md - Vue d'ensemble: domains/premium/README.md
- Règles: - Règles:
@@ -203,12 +350,42 @@ nav:
- Abonnements: domains/premium/rules/abonnements-notifications.md - Abonnements: domains/premium/rules/abonnements-notifications.md
- Entités: - Entités:
- Modèle Premium: domains/premium/entities/modele-premium.md - Modèle Premium: domains/premium/entities/modele-premium.md
- Tests BDD:
- 'Abonnements':
- Audio-guides multi-séquences pour piétons: generated/bdd/premium/features/abonnements/audio-guides-pieton.md
- Impact des abonnements sur l'algorithme: generated/bdd/premium/features/abonnements/impact-algorithme.md
- Limites d'abonnements et désabonnement: generated/bdd/premium/features/abonnements/limites-desabonnement.md
- Notifications contextuelles selon le mode de déplacement: generated/bdd/premium/features/abonnements/notifications-contextuelles.md
- 'Mode Offline':
- Gestion des contenus supprimés pendant offline: generated/bdd/premium/features/mode-offline/contenus-supprimes-pendant-offline.md
- Synchronisation actions offline: generated/bdd/premium/features/mode-offline/synchronisation-actions.md
- Téléchargement de contenus offline: generated/bdd/premium/features/mode-offline/telechargement.md
- Validité et renouvellement contenus offline: generated/bdd/premium/features/mode-offline/validite-renouvellement.md
- 'Premium':
- Avantages Premium: generated/bdd/premium/features/premium/avantages-premium.md
- Gestion abonnement Premium: generated/bdd/premium/features/premium/gestion-abonnement.md
- Multi-devices Premium - Dernier device prend priorité (KISS): generated/bdd/premium/features/premium/multi-devices-dernier-priorite.md
- Multi-devices et détection simultanée: generated/bdd/premium/features/premium/multi-devices-detection.md
- Offre et tarification Premium: generated/bdd/premium/features/premium/offre-tarification.md
- Détection et gestion des conflits de streaming multi-device Premium: generated/bdd/premium/features/premium/stream-conflict-detection.md
- Tarification différenciée multi-canal: generated/bdd/premium/features/premium/tarification-multi-canal.md
- Webhooks et retry automatique des paiements: generated/bdd/premium/features/premium/webhooks-retry-paiement.md
- '💰 Monetization': - '💰 Monetization':
- Vue d'ensemble: domains/monetization/README.md - Vue d'ensemble: domains/monetization/README.md
- Règles: - Règles:
- Monétisation Créateurs: domains/monetization/rules/monetisation-createurs.md - Monétisation Créateurs: domains/monetization/rules/monetisation-createurs.md
- Entités: - Entités:
- Modèle Monétisation: domains/monetization/entities/modele-monetisation.md - Modèle Monétisation: domains/monetization/entities/modele-monetisation.md
- Tests BDD:
- 'Monetisation':
- Conditions d'activation de la monétisation: generated/bdd/monetization/features/monetisation/conditions-activation.md
- Contenus Premium exclusifs: generated/bdd/monetization/features/monetisation/contenus-premium-exclusifs.md
- Désactivation et suspension monétisation: generated/bdd/monetization/features/monetisation/desactivation-suspension.md
- KYC et inscription à la monétisation: generated/bdd/monetization/features/monetisation/kyc-inscription.md
- Obligations fiscales: generated/bdd/monetization/features/monetisation/obligations-fiscales.md
- Paiement des créateurs: generated/bdd/monetization/features/monetisation/paiement-createurs.md
- Gestion des soldes dormants et créateurs inactifs: generated/bdd/monetization/features/monetisation/soldes-dormants-inactifs.md
- Sources de revenus créateurs: generated/bdd/monetization/features/monetisation/sources-revenus.md
- Documentation Légale: - Documentation Légale:
- Introduction: legal/README.md - Introduction: legal/README.md
- "Conditions Générales d'Utilisation": legal/cgu.md - "Conditions Générales d'Utilisation": legal/cgu.md
@@ -217,20 +394,8 @@ nav:
- 'Charte Créateur': legal/charte-createur.md - 'Charte Créateur': legal/charte-createur.md
- 'Mentions Légales': legal/mentions-legales.md - 'Mentions Légales': legal/mentions-legales.md
- 'Politique de Confidentialité': legal/politique-confidentialite.md - 'Politique de Confidentialité': legal/politique-confidentialite.md
- Interfaces:
- Vue d'ensemble: interfaces/README.md
- Mobile:
- Navigation & Architecture: interfaces/mobile/navigation.md
- Mobile:
- 'Stratégie Permissions': mobile/permissions-strategy.md
- 'Validation TestFlight': mobile/testflight-validation-plan.md
- Conformité & Compliance: - Conformité & Compliance:
- 'Soumission aux Stores': compliance/stores-submission.md - 'Soumission aux Stores': compliance/stores-submission.md
- Tests BDD:
- "Vue d'ensemble": generated/bdd/index.md
- Architecture & Techniques:
- Séquences:
- 'Cache Géospatial': architecture/sequences/cache-geospatial.md
extra: extra:
social: social:

View File

@@ -199,7 +199,8 @@ def format_step(step: Step, indent: str = "") -> str:
if step.table: if step.table:
result += "\n\n" result += "\n\n"
result += format_table_markdown(step.table, indent + " ") # Pas d'indentation pour les tableaux (sinon ils deviennent des blocs de code)
result += format_table_markdown(step.table, "")
result += "\n" result += "\n"
return result return result
@@ -368,7 +369,7 @@ def main():
# Chemins # Chemins
project_root = Path(__file__).parent.parent project_root = Path(__file__).parent.parent
features_dir = project_root / 'docs' / 'domains' features_dir = project_root / 'docs' / 'domains'
output_dir = project_root / 'generated' / 'bdd' output_dir = project_root / 'docs' / 'generated' / 'bdd'
# Nettoyer le dossier de sortie # Nettoyer le dossier de sortie
if output_dir.exists(): if output_dir.exists():

View File

@@ -339,7 +339,7 @@ def main():
project_root = Path(__file__).parent.parent project_root = Path(__file__).parent.parent
docs_dir = project_root / 'docs' docs_dir = project_root / 'docs'
mkdocs_path = project_root / 'mkdocs.yml' mkdocs_path = project_root / 'mkdocs.yml'
output_dir = project_root / 'generated' / 'pdf' output_dir = project_root / 'docs' / 'generated' / 'pdf'
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)