diff --git a/.gitignore b/.gitignore index e01d29b..2ec9760 100644 --- a/.gitignore +++ b/.gitignore @@ -66,4 +66,4 @@ site/ .cache/ # Generated documentation -/generated/ +docs/generated/ diff --git a/Makefile b/Makefile index d49d9a6..e45ae39 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ clean: ## docs-clean: Remove generated documentation (BDD docs and PDF) docs-clean: @echo "$(YELLOW)Cleaning generated documentation...$(NC)" - @rm -rf generated/ + @rm -rf docs/generated/ @docker rmi roadwave-pdf-generator 2>/dev/null || true @echo "$(GREEN)✓ Documentation cleaned$(NC)" diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..876fa5d --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -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 diff --git a/docs/architecture/sequences/cache-geospatial.md b/docs/architecture/sequences/cache-geospatial.md deleted file mode 100644 index bd0ae2a..0000000 --- a/docs/architecture/sequences/cache-geospatial.md +++ /dev/null @@ -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
(Paris) - participant Backend as 🔧 Backend Go - participant Redis as 🔴 Redis Geospatial
(Cache) - participant PostgreSQL as 🗄️ PostgreSQL
+ 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
FROM contents WHERE active=true - Note over PostgreSQL: Tous les contenus actifs
de la plateforme (métadonnées) - PostgreSQL-->>Backend: 100K contenus (métadonnées) - - Backend->>Redis: GEOADD geo:catalog
lon1 lat1 "content:1"
lon2 lat2 "content:2"
... (100K entrées) - Note over Redis: Stockage index spatial
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
2.3522 48.8566 50 km - Note over Redis: Filtrage spatial instantané
(index geohash) - Redis-->>Backend: [content:123, content:456, ...]
(~500 IDs dans rayon) - - Backend->>PostgreSQL: SELECT * FROM contents
WHERE id IN (123, 456, ...)
AND geo_level = 'gps_precise' - Note over PostgreSQL: Récupération détails complets
uniquement contenus proches - PostgreSQL-->>Backend: Détails complets (500 contenus GPS) - - Backend->>PostgreSQL: SELECT * FROM contents
WHERE city='Paris' OR dept='75'
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 :
- GPS proche : 70%
- Ville : 20%
- Région : 8%
- National : 2% - - Backend-->>User: JSON: [{id, title, creator, audioUrl, score}, ...]
(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
(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
4.8357 45.7640 50 km - Note over Redis: Filtrage instantané
sur cache existant - Redis-->>Backend: [content:789, content:012, ...]
(~300 IDs différents) - - Backend->>PostgreSQL: SELECT * FROM contents
WHERE id IN (789, 012, ...)
AND geo_level = 'gps_precise' - PostgreSQL-->>Backend: Détails complets - - Backend->>PostgreSQL: SELECT * FROM contents
WHERE city='Lyon' OR dept='69'
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) diff --git a/docs/domains/_shared/README.md b/docs/domains/_shared/README.md index 73f45cd..16f6081 100644 --- a/docs/domains/_shared/README.md +++ b/docs/domains/_shared/README.md @@ -19,7 +19,7 @@ Le domaine **Shared** constitue le **Core Domain** de RoadWave. Il contient les ## 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 diff --git a/docs/domains/_shared/entities/entities-overview.md b/docs/domains/_shared/entities/vue-ensemble.md similarity index 100% rename from docs/domains/_shared/entities/entities-overview.md rename to docs/domains/_shared/entities/vue-ensemble.md diff --git a/docs/domains/_shared/sequences/account-deletion.md b/docs/domains/_shared/sequences/account-deletion.md deleted file mode 100644 index 5f18bfd..0000000 --- a/docs/domains/_shared/sequences/account-deletion.md +++ /dev/null @@ -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) diff --git a/docs/domains/_shared/sequences/authentication-flow.md b/docs/domains/_shared/sequences/authentification.md similarity index 92% rename from docs/domains/_shared/sequences/authentication-flow.md rename to docs/domains/_shared/sequences/authentification.md index 34ca193..218f633 100644 --- a/docs/domains/_shared/sequences/authentication-flow.md +++ b/docs/domains/_shared/sequences/authentification.md @@ -20,9 +20,9 @@ sequenceDiagram Z-->>API: Token valide + user_id API->>DB: SELECT user WHERE id = ? DB-->>API: Données utilisateur + API->>DB: INSERT session (hash tokens, IP, device) + DB-->>API: Session créée API-->>A: Profil utilisateur - - A->>DB: INSERT session (hash tokens, IP, device) A->>U: Connexion réussie ``` diff --git a/docs/domains/_shared/sequences/data-export.md b/docs/domains/_shared/sequences/data-export.md deleted file mode 100644 index a3216b4..0000000 --- a/docs/domains/_shared/sequences/data-export.md +++ /dev/null @@ -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 diff --git a/docs/domains/_shared/sequences/content-moderation.md b/docs/domains/_shared/sequences/moderation-contenu.md similarity index 100% rename from docs/domains/_shared/sequences/content-moderation.md rename to docs/domains/_shared/sequences/moderation-contenu.md diff --git a/docs/domains/_shared/sequences/token-refresh.md b/docs/domains/_shared/sequences/refresh-token.md similarity index 100% rename from docs/domains/_shared/sequences/token-refresh.md rename to docs/domains/_shared/sequences/refresh-token.md diff --git a/docs/domains/_shared/sequences/content-report.md b/docs/domains/_shared/sequences/signalement.md similarity index 100% rename from docs/domains/_shared/sequences/content-report.md rename to docs/domains/_shared/sequences/signalement.md diff --git a/docs/domains/_shared/states/user-account-lifecycle.md b/docs/domains/_shared/states/compte-utilisateur.md similarity index 100% rename from docs/domains/_shared/states/user-account-lifecycle.md rename to docs/domains/_shared/states/compte-utilisateur.md diff --git a/docs/domains/_shared/states/consentement-parental.md b/docs/domains/_shared/states/consentement-parental.md new file mode 100644 index 0000000..bb68e2f --- /dev/null +++ b/docs/domains/_shared/states/consentement-parental.md @@ -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 diff --git a/docs/domains/_shared/states/content-lifecycle.md b/docs/domains/_shared/states/contenu.md similarity index 100% rename from docs/domains/_shared/states/content-lifecycle.md rename to docs/domains/_shared/states/contenu.md diff --git a/docs/domains/_shared/states/export-lifecycle.md b/docs/domains/_shared/states/export-donnees.md similarity index 100% rename from docs/domains/_shared/states/export-lifecycle.md rename to docs/domains/_shared/states/export-donnees.md diff --git a/docs/domains/_shared/states/incident-breach.md b/docs/domains/_shared/states/incident-breach.md new file mode 100644 index 0000000..9164d05 --- /dev/null +++ b/docs/domains/_shared/states/incident-breach.md @@ -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` diff --git a/docs/domains/_shared/states/session-lifecycle.md b/docs/domains/_shared/states/session.md similarity index 100% rename from docs/domains/_shared/states/session-lifecycle.md rename to docs/domains/_shared/states/session.md diff --git a/docs/domains/_shared/states/report-lifecycle.md b/docs/domains/_shared/states/signalement.md similarity index 100% rename from docs/domains/_shared/states/report-lifecycle.md rename to docs/domains/_shared/states/signalement.md diff --git a/docs/domains/_shared/states/suppression-compte.md b/docs/domains/_shared/states/suppression-compte.md new file mode 100644 index 0000000..1e67431 --- /dev/null +++ b/docs/domains/_shared/states/suppression-compte.md @@ -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 diff --git a/docs/domains/advertising/entities/modele-publicites.md b/docs/domains/advertising/entities/modele-publicites.md index bff0e47..e77711c 100644 --- a/docs/domains/advertising/entities/modele-publicites.md +++ b/docs/domains/advertising/entities/modele-publicites.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/content/entities/modele-audio-guides.md b/docs/domains/content/entities/modele-audio-guides.md index 98a30a4..d67799e 100644 --- a/docs/domains/content/entities/modele-audio-guides.md +++ b/docs/domains/content/entities/modele-audio-guides.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/content/entities/modele-radio-live.md b/docs/domains/content/entities/modele-radio-live.md index dfa6a30..8843e7a 100644 --- a/docs/domains/content/entities/modele-radio-live.md +++ b/docs/domains/content/entities/modele-radio-live.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/moderation/entities/modele-moderation.md b/docs/domains/moderation/entities/modele-moderation.md index 875473e..36470c5 100644 --- a/docs/domains/moderation/entities/modele-moderation.md +++ b/docs/domains/moderation/entities/modele-moderation.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/monetization/entities/modele-monetisation.md b/docs/domains/monetization/entities/modele-monetisation.md index f7c8c68..c6cedb2 100644 --- a/docs/domains/monetization/entities/modele-monetisation.md +++ b/docs/domains/monetization/entities/modele-monetisation.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/premium/entities/modele-premium.md b/docs/domains/premium/entities/modele-premium.md index f13a032..0f2668d 100644 --- a/docs/domains/premium/entities/modele-premium.md +++ b/docs/domains/premium/entities/modele-premium.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/recommendation/entities/modele-recommandation.md b/docs/domains/recommendation/entities/modele-recommandation.md index a2cbf10..6feaeb8 100644 --- a/docs/domains/recommendation/entities/modele-recommandation.md +++ b/docs/domains/recommendation/entities/modele-recommandation.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/gherkin-moderation-overview.md b/docs/gherkin-moderation-overview.md deleted file mode 100644 index 744ac3e..0000000 --- a/docs/gherkin-moderation-overview.md +++ /dev/null @@ -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 diff --git a/docs/interfaces/README.md b/docs/interfaces/README.md deleted file mode 100644 index 7e551db..0000000 --- a/docs/interfaces/README.md +++ /dev/null @@ -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 diff --git a/docs/interfaces/assets/mobile/.gitkeep b/docs/interfaces/assets/mobile/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/interfaces/assets/web/.gitkeep b/docs/interfaces/assets/web/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/interfaces/mobile/navigation.md b/docs/interfaces/mobile/navigation.md deleted file mode 100644 index 93561a0..0000000 --- a/docs/interfaces/mobile/navigation.md +++ /dev/null @@ -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. diff --git a/mkdocs.yml b/mkdocs.yml index d593547..d6b384a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -25,7 +25,6 @@ theme: features: - navigation.tabs - navigation.sections - - navigation.expand - navigation.top - navigation.tracking - search.suggest @@ -60,40 +59,40 @@ markdown_extensions: nav: - Accueil: README.md - - Architecture Technique: TECHNICAL.md - - Architecture Decision Records (ADR): - - 'Vue d''ensemble': adr/README.md - - 'Core Architecture': - - 'ADR-001: Langage Backend': adr/001-langage-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-012: Frontend Mobile': adr/012-frontend-mobile.md - - 'ADR-014: Organisation en Monorepo': adr/014-organisation-monorepo.md - - 'Data & Infrastructure': - - 'ADR-005: Base de données': adr/005-base-de-donnees.md - - 'ADR-021: Solution de Cache': adr/021-solution-cache.md - - 'ADR-015: Hébergement': adr/015-hebergement.md - - 'ADR-019: Géolocalisation par IP': adr/019-geolocalisation-ip.md - - 'Streaming & Content': - - 'ADR-002: Protocole Streaming': adr/002-protocole-streaming.md - - 'ADR-003: Codec Audio': adr/003-codec-audio.md - - 'ADR-004: CDN': adr/004-cdn.md - - 'Security & Auth': - - 'ADR-006: Chiffrement': adr/006-chiffrement.md - - 'ADR-008: Authentification': adr/008-authentification.md - - 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md - - 'Testing & Quality': - - 'ADR-007: Tests BDD': adr/007-tests-bdd.md - - 'ADR-013: Stratégie Tests': adr/013-strategie-tests.md - - 'ADR-022: CI/CD Monorepo': adr/022-strategie-cicd-monorepo.md - - 'Features & Operations': - - 'ADR-009: Solution Paiement': adr/009-solution-paiement.md - - 'ADR-016: Service Emailing': adr/016-service-emailing.md - - 'ADR-017: Notifications Géolocalisées': adr/017-notifications-geolocalisees.md - - 'ADR-018: Librairies Go': adr/018-librairies-go.md - - 'ADR-020: Librairies Flutter': adr/020-librairies-flutter.md - - 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md - - 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md + - Architecture: + - 'Vue d''ensemble': TECHNICAL.md + - 'Decision Records (ADR)': + - 'Core Architecture': + - 'ADR-001: Langage Backend': adr/001-langage-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-012: Frontend Mobile': adr/012-frontend-mobile.md + - 'ADR-014: Organisation en Monorepo': adr/014-organisation-monorepo.md + - 'Data & Infrastructure': + - 'ADR-005: Base de données': adr/005-base-de-donnees.md + - 'ADR-021: Solution de Cache': adr/021-solution-cache.md + - 'ADR-015: Hébergement': adr/015-hebergement.md + - 'ADR-019: Géolocalisation par IP': adr/019-geolocalisation-ip.md + - 'Streaming & Content': + - 'ADR-002: Protocole Streaming': adr/002-protocole-streaming.md + - 'ADR-003: Codec Audio': adr/003-codec-audio.md + - 'ADR-004: CDN': adr/004-cdn.md + - 'Security & Auth': + - 'ADR-006: Chiffrement': adr/006-chiffrement.md + - 'ADR-008: Authentification': adr/008-authentification.md + - 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md + - 'Testing & Quality': + - 'ADR-007: Tests BDD': adr/007-tests-bdd.md + - 'ADR-013: Stratégie Tests': adr/013-strategie-tests.md + - 'ADR-022: CI/CD Monorepo': adr/022-strategie-cicd-monorepo.md + - 'Features & Operations': + - 'ADR-009: Solution Paiement': adr/009-solution-paiement.md + - 'ADR-016: Service Emailing': adr/016-service-emailing.md + - 'ADR-017: Notifications Géolocalisées': adr/017-notifications-geolocalisees.md + - 'ADR-018: Librairies Go': adr/018-librairies-go.md + - 'ADR-020: Librairies Flutter': adr/020-librairies-flutter.md + - 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md + - 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md - Domaines DDD: - 'Context Map': domains/README.md - 'Core Domain': @@ -104,6 +103,32 @@ nav: - Gestion Erreurs: domains/_shared/rules/gestion-erreurs.md - 'Annexe Post-MVP': domains/_shared/rules/ANNEXE-POST-MVP.md - 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é': - Consentement: generated/bdd/_shared/features/rgpd-compliance/consentement.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 - Droits Utilisateurs: generated/bdd/_shared/features/rgpd-compliance/user-rights.md - Entités: - - "Vue d'ensemble": domains/_shared/entities/entities-overview.md + - "Vue d'ensemble": domains/_shared/entities/vue-ensemble.md - 'Auth & Sécurité': - Sessions: domains/_shared/entities/sessions.md - Devices: domains/_shared/entities/devices.md @@ -136,23 +161,21 @@ nav: - Jauges Intérêt: domains/_shared/entities/interest-gauges.md - Signalements: domains/_shared/entities/reports.md - 'États (Lifecycles)': - - Compte Utilisateur: domains/_shared/states/user-account-lifecycle.md - - Contenu: domains/_shared/states/content-lifecycle.md - - Session: domains/_shared/states/session-lifecycle.md - - Signalement: domains/_shared/states/report-lifecycle.md - - Export Données: domains/_shared/states/export-lifecycle.md - - Consentement Parental: domains/_shared/states/parental-consent-lifecycle.md - - Suppression Compte: domains/_shared/states/account-deletion-lifecycle.md - - Incident Breach: domains/_shared/states/breach-incident-lifecycle.md + - Compte Utilisateur: domains/_shared/states/compte-utilisateur.md + - Contenu: domains/_shared/states/contenu.md + - Session: domains/_shared/states/session.md + - Signalement: domains/_shared/states/signalement.md + - Export Données: domains/_shared/states/export-donnees.md + - Consentement Parental: domains/_shared/states/consentement-parental.md + - Suppression Compte: domains/_shared/states/suppression-compte.md + - Incident Breach: domains/_shared/states/incident-breach.md - Séquences: - - Authentification: domains/_shared/sequences/authentication-flow.md - - Refresh Token: domains/_shared/sequences/token-refresh.md - - Modération Contenu: domains/_shared/sequences/content-moderation.md - - Signalement: domains/_shared/sequences/content-report.md - - Export Données: domains/_shared/sequences/data-export.md - - Export Données (RGPD): domains/_shared/sequences/export-donnees.md - - Suppression Compte: domains/_shared/sequences/account-deletion.md - - Suppression Compte (RGPD): domains/_shared/sequences/suppression-compte.md + - Authentification: domains/_shared/sequences/authentification.md + - Refresh Token: domains/_shared/sequences/refresh-token.md + - Modération Contenu: domains/_shared/sequences/moderation-contenu.md + - Signalement: domains/_shared/sequences/signalement.md + - Export Données: domains/_shared/sequences/export-donnees.md + - Suppression Compte: domains/_shared/sequences/suppression-compte.md - Consentement Parental: domains/_shared/sequences/consentement-parental.md - Anonymisation GPS: domains/_shared/sequences/anonymisation-gps.md - Notification Breach: domains/_shared/sequences/notification-breach.md @@ -165,6 +188,28 @@ nav: - Interactions: domains/recommendation/rules/interactions-navigation.md - Entités: - 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': - Vue d'ensemble: domains/content/README.md - Règles: @@ -176,6 +221,72 @@ nav: - Entités: - Modèle Audio-guides: domains/content/entities/modele-audio-guides.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': - Vue d'ensemble: domains/moderation/README.md - Règles: @@ -188,6 +299,33 @@ nav: - 'Flux: Signalement': domains/moderation/flows/moderation-signalement.md - 'États: Lifecycle': domains/moderation/states/signalement-lifecycle.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': - '📢 Advertising': - Vue d'ensemble: domains/advertising/README.md @@ -195,6 +333,15 @@ nav: - Publicités: domains/advertising/rules/publicites.md - Entités: - 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': - Vue d'ensemble: domains/premium/README.md - Règles: @@ -203,12 +350,42 @@ nav: - Abonnements: domains/premium/rules/abonnements-notifications.md - Entités: - 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': - Vue d'ensemble: domains/monetization/README.md - Règles: - Monétisation Créateurs: domains/monetization/rules/monetisation-createurs.md - Entités: - 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: - Introduction: legal/README.md - "Conditions Générales d'Utilisation": legal/cgu.md @@ -217,20 +394,8 @@ nav: - 'Charte Créateur': legal/charte-createur.md - 'Mentions Légales': legal/mentions-legales.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: - '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: social: diff --git a/scripts/generate-bdd-docs.py b/scripts/generate-bdd-docs.py index 74c5219..6ed40f0 100644 --- a/scripts/generate-bdd-docs.py +++ b/scripts/generate-bdd-docs.py @@ -199,7 +199,8 @@ def format_step(step: Step, indent: str = "") -> str: if step.table: 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" return result @@ -368,7 +369,7 @@ def main(): # Chemins project_root = Path(__file__).parent.parent features_dir = project_root / 'docs' / 'domains' - output_dir = project_root / 'generated' / 'bdd' + output_dir = project_root / 'docs' / 'generated' / 'bdd' # Nettoyer le dossier de sortie if output_dir.exists(): diff --git a/scripts/generate-pdf-docs.py b/scripts/generate-pdf-docs.py index be6b642..6a678f0 100644 --- a/scripts/generate-pdf-docs.py +++ b/scripts/generate-pdf-docs.py @@ -339,7 +339,7 @@ def main(): project_root = Path(__file__).parent.parent docs_dir = project_root / 'docs' 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)