fix(docs): corriger les liens internes cassés après refactorisation DDD
Corrections: - Liens vers ADR: docs/adr/ → adr/ dans index.md et technical.md - Liens internes entre règles métier (anciens noms numérotés) - Chemins relatifs ADR depuis les domaines: ../adr/ → ../../../adr/ - Lien ADR-010 → ADR-012 (frontend-mobile) - Suppression référence vers sequences/scoring-recommandation.md (non créé) Script: scripts/fix-remaining-links.sh
This commit is contained in:
@@ -203,7 +203,7 @@ domains/<domain>/
|
|||||||
## Navigation
|
## Navigation
|
||||||
|
|
||||||
- [📖 Règles métier par numéro](../regles-metier/) *(structure legacy, déprécié)*
|
- [📖 Règles métier par numéro](../regles-metier/) *(structure legacy, déprécié)*
|
||||||
- [🏛️ ADR (Architecture Decision Records)](../adr/)
|
- [🏛️ ADR (Architecture Decision Records)](../../../adr/)
|
||||||
- [⚖️ Documentation légale](../legal/)
|
- [⚖️ Documentation légale](../legal/)
|
||||||
- [🖥️ Interfaces UI](../interfaces/)
|
- [🖥️ Interfaces UI](../interfaces/)
|
||||||
- [🔧 Documentation technique](../technical.md)
|
- [🔧 Documentation technique](../technical.md)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
- RGPD : données 100% contrôlées
|
- RGPD : données 100% contrôlées
|
||||||
- Coût : 0€ (Zitadel intégré)
|
- Coût : 0€ (Zitadel intégré)
|
||||||
|
|
||||||
> 📋 **Référence technique** : Voir [ADR-008 - OAuth2 vs Fournisseurs Tiers](../adr/008-authentification.md#oauth2-pkce--protocole-vs-fournisseurs-tiers) pour clarification protocole vs providers.
|
> 📋 **Référence technique** : Voir [ADR-008 - OAuth2 vs Fournisseurs Tiers](../../../adr/008-authentification.md#oauth2-pkce--protocole-vs-fournisseurs-tiers) pour clarification protocole vs providers.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ export-roadwave-[user_id]-[date].zip
|
|||||||
- Upgrade volontaire vers GPS
|
- Upgrade volontaire vers GPS
|
||||||
|
|
||||||
**API GeoIP** :
|
**API GeoIP** :
|
||||||
- IP2Location Lite (gratuit, self-hosted, voir [ADR-019](../adr/019-geolocalisation-ip.md))
|
- IP2Location Lite (gratuit, self-hosted, voir [ADR-019](../../../adr/019-geolocalisation-ip.md))
|
||||||
- Update DB mensuelle automatique
|
- Update DB mensuelle automatique
|
||||||
- Précision ~80% au niveau ville
|
- Précision ~80% au niveau ville
|
||||||
|
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ Séquence 1 [fin] → PAUSE → User clique → Séquence 2 [fin] → PUB AUTO-P
|
|||||||
8. Séquence suivante démarre immédiatement (pas de décompte)
|
8. Séquence suivante démarre immédiatement (pas de décompte)
|
||||||
|
|
||||||
**Pas de système "7 secondes avant" pour les audio-guides** :
|
**Pas de système "7 secondes avant" pour les audio-guides** :
|
||||||
- Contrairement aux contenus géolocalisés simples (voir [05-interactions-navigation.md](05-interactions-navigation.md#511-file-dattente-et-commande-suivant))
|
- Contrairement aux contenus géolocalisés simples (voir [../../recommendation/rules/interactions-navigation.md](../../recommendation/rules/interactions-navigation.md#511-file-dattente-et-commande-suivant))
|
||||||
- Les séquences se déclenchent **au point GPS exact** (rayon 30m)
|
- Les séquences se déclenchent **au point GPS exact** (rayon 30m)
|
||||||
- Raison : expérience guidée continue, user sait qu'il suit un parcours
|
- Raison : expérience guidée continue, user sait qu'il suit un parcours
|
||||||
|
|
||||||
|
|||||||
@@ -468,7 +468,7 @@ func ActivateCooldown(userID string) {
|
|||||||
|
|
||||||
#### 17.4.1 Historique de navigation
|
#### 17.4.1 Historique de navigation
|
||||||
|
|
||||||
**Structure** (voir [05-interactions-navigation.md](05-interactions-navigation.md#52-commande-précédent)) :
|
**Structure** (voir [../../recommendation/rules/interactions-navigation.md](../../recommendation/rules/interactions-navigation.md#52-commande-précédent)) :
|
||||||
|
|
||||||
- **10 contenus maximum** en mémoire (Redis List)
|
- **10 contenus maximum** en mémoire (Redis List)
|
||||||
- Structure : `[{content_id, position_seconds, listened_at, type}, ...]`
|
- Structure : `[{content_id, position_seconds, listened_at, type}, ...]`
|
||||||
@@ -502,7 +502,7 @@ Timeline :
|
|||||||
5. User appuie "Suivant" (skip) → contenu buffer_2 démarre
|
5. User appuie "Suivant" (skip) → contenu buffer_2 démarre
|
||||||
6. User appuie "Précédent" → **retour au contenu géolocalisé à 42s**
|
6. User appuie "Précédent" → **retour au contenu géolocalisé à 42s**
|
||||||
|
|
||||||
**Règle** : Comme décrit dans [05-interactions-navigation.md](05-interactions-navigation.md#52-commande-précédent) :
|
**Règle** : Comme décrit dans [../../recommendation/rules/interactions-navigation.md](../../recommendation/rules/interactions-navigation.md#52-commande-précédent) :
|
||||||
- Si temps écouté ≥ 10 secondes → replay contenu actuel depuis début
|
- Si temps écouté ≥ 10 secondes → replay contenu actuel depuis début
|
||||||
- Si temps écouté < 10 secondes → retour contenu précédent (position exacte)
|
- Si temps écouté < 10 secondes → retour contenu précédent (position exacte)
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
**Détection violations** :
|
**Détection violations** :
|
||||||
- **Signalement utilisateurs** : bouton "Signaler" accessible pendant live
|
- **Signalement utilisateurs** : bouton "Signaler" accessible pendant live
|
||||||
- **IA audio fingerprint** : détection musique protégée en arrière-plan (post-MVP, voir [Section 18](18-detection-contenu-protege.md))
|
- **IA audio fingerprint** : détection musique protégée en arrière-plan (post-MVP, voir [Section 18](detection-contenu-protege.md))
|
||||||
- **Modération réactive** : modérateurs peuvent écouter lives signalés en temps réel
|
- **Modération réactive** : modérateurs peuvent écouter lives signalés en temps réel
|
||||||
- **Coupure immédiate** : modérateur peut arrêter live si contenu illégal évident
|
- **Coupure immédiate** : modérateur peut arrêter live si contenu illégal évident
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ Liste déroulante avec 7 options :
|
|||||||
| 🚫 **Haine & violence** | Incitation à la haine, discrimination, menaces |
|
| 🚫 **Haine & violence** | Incitation à la haine, discrimination, menaces |
|
||||||
| 🔞 **Contenu sexuel** | Pornographie, contenu explicite |
|
| 🔞 **Contenu sexuel** | Pornographie, contenu explicite |
|
||||||
| ⚖️ **Illégalité** | Terrorisme, apologie de crimes |
|
| ⚖️ **Illégalité** | Terrorisme, apologie de crimes |
|
||||||
| 🎵 **Droits d'auteur** | Musique/contenu protégé non autorisé (voir [Section 18](18-detection-contenu-protege.md) pour règles détaillées) |
|
| 🎵 **Droits d'auteur** | Musique/contenu protégé non autorisé (voir [Section 18](../../content/rules/detection-contenu-protege.md) pour règles détaillées) |
|
||||||
| 📧 **Spam** | Publicité non sollicitée, répétition |
|
| 📧 **Spam** | Publicité non sollicitée, répétition |
|
||||||
| ❌ **Fausse information** | Désinformation sur santé, sécurité routière |
|
| ❌ **Fausse information** | Désinformation sur santé, sécurité routière |
|
||||||
| 🔧 **Autre** | Champ texte obligatoire si sélectionné |
|
| 🔧 **Autre** | Champ texte obligatoire si sélectionné |
|
||||||
@@ -386,8 +386,8 @@ Email détaillé avec :
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**🎯 Modération communautaire** : Voir [Section 19](19-moderation-communautaire.md) pour le système complet de badges, récompenses et priorisation des signalements pertinents.
|
**🎯 Modération communautaire** : Voir [Section 19](moderation-communautaire.md) pour le système complet de badges, récompenses et priorisation des signalements pertinents.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Section suivante** : [Section 19 - Modération Communautaire](19-moderation-communautaire.md)
|
**Section suivante** : [Section 19 - Modération Communautaire](moderation-communautaire.md)
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ Liste des séquences :
|
|||||||
- Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?"
|
- Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?"
|
||||||
|
|
||||||
**Abonnement initial** :
|
**Abonnement initial** :
|
||||||
- Impact : **+5% toutes jauges tags du créateur** (voir [Règle 05 - Section 5.3](05-interactions-navigation.md#actions-complémentaires-mode-piéton-uniquement))
|
- Impact : **+5% toutes jauges tags du créateur** (voir [Règle 05 - Section 5.3](../../recommendation/rules/interactions-navigation.md#actions-complémentaires-mode-piéton-uniquement))
|
||||||
- Action : Bouton "S'abonner" dans profil créateur (interface mobile)
|
- Action : Bouton "S'abonner" dans profil créateur (interface mobile)
|
||||||
- Immédiat à l'action
|
- Immédiat à l'action
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ Device 1 vraiment offline (mode avion, tunnel)
|
|||||||
|
|
||||||
#### Limite offline 30 jours
|
#### Limite offline 30 jours
|
||||||
|
|
||||||
**Référence** : [08-mode-offline.md](08-mode-offline.md) section 11.2
|
**Référence** : [mode-offline.md](mode-offline.md) section 11.2
|
||||||
|
|
||||||
```
|
```
|
||||||
Contenus téléchargés valides 30 jours
|
Contenus téléchargés valides 30 jours
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Le domaine **Recommendation** gère le système de recommandation de contenus ba
|
|||||||
|
|
||||||
## Diagrammes
|
## Diagrammes
|
||||||
|
|
||||||
- [Séquence : Scoring et recommandation](sequences/scoring-recommandation.md) *(à créer si existant)*
|
- [Séquence : Scoring et recommandation]((à créer)) *(à créer si existant)*
|
||||||
|
|
||||||
## Tests BDD
|
## Tests BDD
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Tests Gherkin - Algorithme de Recommandation
|
# Tests Gherkin - Algorithme de Recommandation
|
||||||
|
|
||||||
Tests BDD pour la section [04-algorithme-recommandation.md](../rules/algorithme-recommandation.md)
|
Tests BDD pour la section [04-algorithme-recommandation.md](../../rules/algorithme-recommandation.md)
|
||||||
|
|
||||||
## Fichiers de tests
|
## Fichiers de tests
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ GROUP BY content_id;
|
|||||||
|
|
||||||
### 2.5 Contenu politique (version MVP simplifiée)
|
### 2.5 Contenu politique (version MVP simplifiée)
|
||||||
|
|
||||||
> ⚠️ **Note** : La classification politique avancée (échelle gauche/droite, équilibrage imposé) a été reportée post-MVP. Voir [ANNEXE-POST-MVP.md](ANNEXE-POST-MVP.md) pour la version complète.
|
> ⚠️ **Note** : La classification politique avancée (échelle gauche/droite, équilibrage imposé) a été reportée post-MVP. Voir [../../_shared/rules/ANNEXE-POST-MVP.md](../../_shared/rules/ANNEXE-POST-MVP.md) pour la version complète.
|
||||||
|
|
||||||
**Décision MVP** : Tag simple "Politique" sans classification idéologique
|
**Décision MVP** : Tag simple "Politique" sans classification idéologique
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ Scénario 5 : Skip après 5s (ABONNÉ au créateur)
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Justification** :
|
**Justification** :
|
||||||
- **Like automatique** : Reflète l'engagement réel (voir [Règle 05 - Section 5.3](05-interactions-navigation.md#53-interactions-au-volant--like-automatique-et-engagement))
|
- **Like automatique** : Reflète l'engagement réel (voir [Règle 05 - Section 5.3](interactions-navigation.md#53-interactions-au-volant--like-automatique-et-engagement))
|
||||||
- **Sécurité routière** : Pas d'action complexe en conduite
|
- **Sécurité routière** : Pas d'action complexe en conduite
|
||||||
- **Prévisibilité** : Règles claires et déterministes
|
- **Prévisibilité** : Règles claires et déterministes
|
||||||
- **Progression linéaire** : Évite l'effet "rich get richer" (progression équitable)
|
- **Progression linéaire** : Évite l'effet "rich get richer" (progression équitable)
|
||||||
@@ -69,7 +69,7 @@ Scénario 5 : Skip après 5s (ABONNÉ au créateur)
|
|||||||
- **Fiabilité** : Pas d'edge cases complexes (pas de risque d'overflow avec multiplication)
|
- **Fiabilité** : Pas d'edge cases complexes (pas de risque d'overflow avec multiplication)
|
||||||
- **Ajustable** : Valeurs modifiables via dashboard admin si besoin
|
- **Ajustable** : Valeurs modifiables via dashboard admin si besoin
|
||||||
|
|
||||||
> 📋 **Référence technique** : Voir [Règle 05 - Implémentation Technique](05-interactions-navigation.md#implémentation-technique-backend) pour l'architecture backend détaillée.
|
> 📋 **Référence technique** : Voir [Règle 05 - Implémentation Technique](interactions-navigation.md#implémentation-technique-backend) pour l'architecture backend détaillée.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ Android (`AndroidManifest.xml`) :
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
|
||||||
```
|
```
|
||||||
|
|
||||||
> 📋 **Référence technique** : Voir [ADR-010 - Stratégie de Permissions](../adr/010-frontend-mobile.md#stratégie-de-permissions-iosandroid) pour détails d'implémentation.
|
> 📋 **Référence technique** : Voir [ADR-010 - Stratégie de Permissions](../../../adr/010-frontend-mobile.md#stratégie-de-permissions-iosandroid) pour détails d'implémentation.
|
||||||
|
|
||||||
**Disclosure avant demande permission** (Android requis, iOS recommandé) :
|
**Disclosure avant demande permission** (Android requis, iOS recommandé) :
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../README.md
|
|
||||||
285
docs/index.md
Normal file
285
docs/index.md
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
# RoadWave
|
||||||
|
|
||||||
|
Réseau social audio géolocalisé pour les usagers de la route.
|
||||||
|
|
||||||
|
## Concept
|
||||||
|
|
||||||
|
RoadWave permet aux conducteurs d'écouter du contenu audio contextuel pendant leurs trajets. La navigation se fait par commandes au volant (suivant/précédent), inspirée des réseaux à scroll infini.
|
||||||
|
|
||||||
|
Le contenu est diffusé en fonction de la position géographique de l'utilisateur et de ses centres d'intérêt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cas d'usage
|
||||||
|
|
||||||
|
| Utilisateur | Scénario |
|
||||||
|
|-------------|----------|
|
||||||
|
| **Conducteur** | Écoute contenu audio en conduisant, navigation par commandes au volant (suivant/précédent), reçoit notifications géolocalisées en passant près de points d'intérêt |
|
||||||
|
| **Routier** | Écoute podcasts et radios live pendant ses trajets longue distance |
|
||||||
|
| **Touriste à pied** | Visite guidée audio d'un musée, monument ou ville : choisit parmi plusieurs guides, navigue entre séquences à son rythme (tactile/vocal), reçoit notification push quand un audio-guide est disponible à proximité |
|
||||||
|
| **Commerçant** | Diffuse une publicité audio ciblée GPS devant son commerce |
|
||||||
|
| **Passionné auto** | Découvre du contenu automobile près de circuits ou concessionnaires |
|
||||||
|
| **Habitant local** | Partage anecdotes ou bons plans géolocalisés dans son quartier |
|
||||||
|
| **Média traditionnel** | Le Monde, Le Parisien diffusent actualités géolocalisées ou nationales |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Utilisateurs
|
||||||
|
|
||||||
|
Tout utilisateur peut écouter et créer du contenu (rôle flexible).
|
||||||
|
|
||||||
|
| Rôle | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| **Auditeur** | Écoute, like, s'abonne à des créateurs, signale des contenus |
|
||||||
|
| **Créateur** | Publie du contenu audio géolocalisé (individus, médias traditionnels) |
|
||||||
|
| **Publicitaire** | Diffuse des publicités ciblées géographiquement |
|
||||||
|
| **Modérateur** | Valide et modère les contenus signalés |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Types de contenu
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| **Contenu court** | Audio de quelques secondes à quelques minutes |
|
||||||
|
| **Podcast** | Épisodes plus longs, séries thématiques |
|
||||||
|
| **Radio live** | Diffusion en direct avec synchronisation approximative entre auditeurs |
|
||||||
|
| **Audio-guide** | Visite guidée multiséquence (musée, monument, ville) : plusieurs séquences numérotées, navigation manuelle entre pistes, liste complète visible, guidage vocal entre points d'intérêt |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Géolocalisation
|
||||||
|
|
||||||
|
Le créateur définit la zone de diffusion de son contenu :
|
||||||
|
|
||||||
|
| Niveau | Portée |
|
||||||
|
|--------|--------|
|
||||||
|
| **Point GPS** | Rayon précis autour d'une coordonnée |
|
||||||
|
| **Ville** | Diffusion dans une ville |
|
||||||
|
| **Département** | Diffusion départementale |
|
||||||
|
| **Région** | Diffusion régionale |
|
||||||
|
| **Pays** | Diffusion nationale |
|
||||||
|
|
||||||
|
**Priorité de diffusion** : plus la zone est précise, plus le contenu a de chances d'être diffusé (GPS > ville > département > région > pays).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Algorithme de recommandation
|
||||||
|
|
||||||
|
Le contenu proposé est calculé via un **score combiné** :
|
||||||
|
|
||||||
|
- **Proximité géographique** : distance entre l'utilisateur et la zone du contenu
|
||||||
|
- **Pertinence des intérêts** : correspondance avec les centres d'intérêt de l'utilisateur
|
||||||
|
|
||||||
|
Lorsque plusieurs contenus sont disponibles dans une zone, **seul le plus pertinent est diffusé**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Centres d'intérêt
|
||||||
|
|
||||||
|
Chaque utilisateur possède des **jauges d'intérêt** qui évoluent dynamiquement :
|
||||||
|
|
||||||
|
### Catégories
|
||||||
|
- Automobile
|
||||||
|
- Voyage
|
||||||
|
- Famille
|
||||||
|
- Amour
|
||||||
|
- Musique
|
||||||
|
- Économie
|
||||||
|
- Cryptomonnaie
|
||||||
|
- Politique
|
||||||
|
- *... (extensible)*
|
||||||
|
|
||||||
|
### Évolution des jauges
|
||||||
|
|
||||||
|
| Action | Effet |
|
||||||
|
|--------|-------|
|
||||||
|
| Temps d'écoute long | Augmente la jauge |
|
||||||
|
| Like | Augmente la jauge |
|
||||||
|
| Abonnement | Augmente fortement la jauge |
|
||||||
|
| Skip rapide | Diminue la jauge |
|
||||||
|
|
||||||
|
Les créateurs taguent leur contenu avec des centres d'intérêt. L'algorithme privilégie les correspondances mais n'exclut pas les utilisateurs sans correspondance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Interactions
|
||||||
|
|
||||||
|
### Commandes au volant (conduite)
|
||||||
|
|
||||||
|
Interactions simplifiées pour sécurité routière maximale :
|
||||||
|
|
||||||
|
| Commande | Action |
|
||||||
|
|----------|--------|
|
||||||
|
| **Suivant** | Passer au contenu suivant |
|
||||||
|
| **Précédent** | Revenir au contenu précédent |
|
||||||
|
| **Play/Pause** | Mettre en pause / reprendre la lecture |
|
||||||
|
|
||||||
|
**Like automatique** : Le système détecte automatiquement vos préférences selon votre temps d'écoute :
|
||||||
|
- Écoute ≥80% du contenu → Like renforcé (+2 points jauge)
|
||||||
|
- Écoute 30-79% du contenu → Like standard (+1 point jauge)
|
||||||
|
- Skip après <10s → Signal négatif (-0.5 point)
|
||||||
|
|
||||||
|
> Voir [ADR-010](adr/010-commandes-volant.md) pour les détails techniques
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Publicités
|
||||||
|
|
||||||
|
- Insertion **entre deux contenus** uniquement (jamais d'interruption)
|
||||||
|
- Ciblage géographique : point GPS, ville, département, région ou national
|
||||||
|
- Interface dédiée pour les publicitaires
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Radio live
|
||||||
|
|
||||||
|
- Diffusion en direct par des créateurs
|
||||||
|
- **Buffering** pour garantir une écoute fluide
|
||||||
|
- **Synchronisation approximative** entre les auditeurs (quelques secondes de décalage possible)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modération
|
||||||
|
|
||||||
|
Approche hybride combinant participation communautaire, IA et modérateurs dédiés.
|
||||||
|
|
||||||
|
### Contenus prohibés
|
||||||
|
|
||||||
|
| Catégorie | Description |
|
||||||
|
|-----------|-------------|
|
||||||
|
| **Haine et violence** | Incitation à la haine, violence, discrimination |
|
||||||
|
| **Contenu sexuel** | Pornographie ou contenu sexuellement explicite |
|
||||||
|
| **Illégalité** | Apologie du terrorisme, actes criminels |
|
||||||
|
| **Désinformation dangereuse** | Fausses informations sur la santé, sécurité routière |
|
||||||
|
| **Harcèlement** | Menaces, intimidation, doxxing |
|
||||||
|
| **Droits d'auteur** | Violation de propriété intellectuelle |
|
||||||
|
| **Fraude** | Arnaques, escroqueries |
|
||||||
|
|
||||||
|
### Rôles de modération
|
||||||
|
|
||||||
|
| Rôle | Capacités |
|
||||||
|
|------|-----------|
|
||||||
|
| **Auditeur lambda** | Signaler un contenu (1 clic) |
|
||||||
|
| **Auditeur de confiance** | Signalements priorisés après historique positif |
|
||||||
|
| **Modérateur junior** | Traiter signalements simples (spam, contenu évident) |
|
||||||
|
| **Modérateur senior** | Cas complexes, appels, décisions de ban |
|
||||||
|
| **Admin modération** | Définir les règles, superviser l'équipe |
|
||||||
|
|
||||||
|
### Flux de modération
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Auditeur signale → File d'attente
|
||||||
|
2. IA pré-filtre → Cas évidents traités automatiquement
|
||||||
|
3. Modérateur junior → Traite 80% des cas restants
|
||||||
|
4. Modérateur senior → Cas complexes + recours
|
||||||
|
```
|
||||||
|
|
||||||
|
### Outils de modération automatique
|
||||||
|
|
||||||
|
| Outil | Fonction |
|
||||||
|
|-------|----------|
|
||||||
|
| **Transcription audio** | Conversion automatique en texte pour analyse |
|
||||||
|
| **Analyse vocale IA** | Détection de ton agressif, cris, insultes |
|
||||||
|
| **Empreinte audio** | Détection de contenus déjà modérés (réupload) |
|
||||||
|
| **Détection droits d'auteur** | Identification automatique de musique protégée |
|
||||||
|
| **Filtrage mots-clés** | Liste noire de termes inappropriés |
|
||||||
|
|
||||||
|
### Modération préventive
|
||||||
|
|
||||||
|
- **Nouveaux créateurs** : validation manuelle des 3 premiers contenus
|
||||||
|
- **Score de confiance** : évolution selon l'historique du créateur
|
||||||
|
- **Publicités** : validation manuelle obligatoire avant diffusion
|
||||||
|
|
||||||
|
### Système de strikes
|
||||||
|
|
||||||
|
| Strike | Sanction | Durée suspension |
|
||||||
|
|--------|----------|------------------|
|
||||||
|
| **Strike 1** | Avertissement + suppression contenu + suspension upload | 3 jours |
|
||||||
|
| **Strike 2** | Suppression contenu + suspension upload | 7 jours |
|
||||||
|
| **Strike 3** | Suppression contenu + suspension upload | 30 jours |
|
||||||
|
| **Strike 4** | Ban définitif du compte créateur | Permanent |
|
||||||
|
|
||||||
|
**Notes** :
|
||||||
|
- **Tolérance 1ère fois** (droits d'auteur uniquement) : avertissement sans strike
|
||||||
|
- **Violations graves** (haine, illégalité, violence) : strike immédiat sans tolérance
|
||||||
|
- **Réhabilitation** : -1 strike tous les 6 mois sans nouvelle violation
|
||||||
|
|
||||||
|
### Priorisation des signalements
|
||||||
|
|
||||||
|
| Priorité | Type de contenu |
|
||||||
|
|----------|-----------------|
|
||||||
|
| **CRITIQUE** | Violence, suicide, mise en danger immédiate |
|
||||||
|
| **HAUTE** | Harcèlement, haine, désinformation |
|
||||||
|
| **MOYENNE** | Spam, contenu inapproprié |
|
||||||
|
| **BASSE** | Qualité audio, tags incorrects |
|
||||||
|
|
||||||
|
### Transparence et recours
|
||||||
|
|
||||||
|
- **Notification explicite** lors de suppression (raison détaillée)
|
||||||
|
- **Processus d'appel** : le créateur peut contester une décision
|
||||||
|
- **Délai de traitement** : 48-72h pour les recours
|
||||||
|
- **Historique** : tableau de bord des sanctions pour le créateur
|
||||||
|
|
||||||
|
### Modération communautaire
|
||||||
|
|
||||||
|
- **Utilisateurs de confiance** : signalements priorisés après historique positif
|
||||||
|
- **Récompenses** : badges, réduction premium pour signalements pertinents
|
||||||
|
- Lutte contre les signalements abusifs (sanctions possibles)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modèle économique
|
||||||
|
|
||||||
|
### Offres
|
||||||
|
|
||||||
|
| Formule | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| **Gratuit** | Accès complet avec publicités entre les contenus |
|
||||||
|
| **Premium** | Sans publicité + accès aux contenus exclusifs |
|
||||||
|
|
||||||
|
### Monétisation créateurs
|
||||||
|
|
||||||
|
- **Partage des revenus pub** : rémunération basée sur le nombre d'écoutes
|
||||||
|
- **Pourboires** : les auditeurs peuvent faire des dons aux créateurs
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conformité RGPD
|
||||||
|
|
||||||
|
### Permissions GPS
|
||||||
|
|
||||||
|
RoadWave adapte ses permissions selon l'usage :
|
||||||
|
|
||||||
|
| Mode | Permission GPS | Fonctionnalités |
|
||||||
|
|------|----------------|-----------------|
|
||||||
|
| **Mode voiture** | "When In Use" uniquement | Écoute contenu géolocalisé pendant conduite |
|
||||||
|
| **Mode piéton** | "Always Location" optionnelle | Notifications audio-guides en arrière-plan |
|
||||||
|
|
||||||
|
**Important** : La permission "Always Location" est **optionnelle** et réservée au mode piéton pour recevoir des notifications push lorsqu'un audio-guide est disponible à proximité. Elle n'est jamais requise pour l'usage principal en voiture.
|
||||||
|
|
||||||
|
> Voir [ADR-011](adr/011-conformite-stores-carplay-android-auto.md) pour les détails techniques
|
||||||
|
|
||||||
|
### Données collectées
|
||||||
|
|
||||||
|
| Donnée | Finalité | Base légale |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| **Position GPS** | Diffusion de contenu géolocalisé | Consentement |
|
||||||
|
| **Historique d'écoute** | Personnalisation des recommandations | Intérêt légitime |
|
||||||
|
| **Centres d'intérêt** | Algorithme de recommandation | Consentement |
|
||||||
|
| **Identité créateur** | Publication de contenu | Exécution du contrat |
|
||||||
|
|
||||||
|
### Droits des utilisateurs
|
||||||
|
|
||||||
|
- **Accès** : consulter toutes ses données personnelles
|
||||||
|
- **Rectification** : modifier ses informations
|
||||||
|
- **Suppression** : supprimer son compte et toutes ses données
|
||||||
|
- **Portabilité** : exporter ses données dans un format standard
|
||||||
|
- **Opposition** : désactiver le profilage publicitaire
|
||||||
|
|
||||||
|
### Mesures techniques
|
||||||
|
|
||||||
|
- Consentement explicite requis pour la géolocalisation
|
||||||
|
- Anonymisation des données de localisation après 24h (sauf historique personnel)
|
||||||
|
- Possibilité d'utiliser l'app en mode dégradé (sans géolocalisation précise)
|
||||||
|
- Données hébergées dans l'UE
|
||||||
@@ -851,7 +851,7 @@ void main() {
|
|||||||
|
|
||||||
## Références
|
## Références
|
||||||
|
|
||||||
- **ADR-010** : [Frontend Mobile](../adr/010-frontend-mobile.md)
|
- **ADR-010** : [Frontend Mobile](../adr/012-frontend-mobile.md)
|
||||||
- **Règle 05** : [Mode Piéton](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides)
|
- **Règle 05** : [Mode Piéton](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides)
|
||||||
- **Règle 02** : [Conformité RGPD](../domains/_shared/rules/rgpd.md)
|
- **Règle 02** : [Conformité RGPD](../domains/_shared/rules/rgpd.md)
|
||||||
- **Apple Guidelines** : [Location Best Practices](https://developer.apple.com/design/human-interface-guidelines/location)
|
- **Apple Guidelines** : [Location Best Practices](https://developer.apple.com/design/human-interface-guidelines/location)
|
||||||
|
|||||||
@@ -608,7 +608,7 @@ Location Data :
|
|||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
- [Stratégie Permissions](permissions-strategy.md)
|
- [Stratégie Permissions](permissions-strategy.md)
|
||||||
- [ADR-010 Frontend Mobile](../adr/010-frontend-mobile.md)
|
- [ADR-010 Frontend Mobile](../adr/012-frontend-mobile.md)
|
||||||
- [Règle 05 Mode Piéton](../domains/recommendation/rules/interactions-navigation.md)
|
- [Règle 05 Mode Piéton](../domains/recommendation/rules/interactions-navigation.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../TECHNICAL.md
|
|
||||||
228
docs/technical.md
Normal file
228
docs/technical.md
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
# RoadWave - Architecture Technique
|
||||||
|
|
||||||
|
> Les décisions techniques sont documentées dans [adr/](adr/)
|
||||||
|
|
||||||
|
## Stack Technologique
|
||||||
|
|
||||||
|
| Composant | Technologie | ADR |
|
||||||
|
|-----------|-------------|-----|
|
||||||
|
| **Backend** | Go + Fiber | [ADR-001](adr/001-langage-backend.md) |
|
||||||
|
| **Architecture Backend** | Monolithe Modulaire | [ADR-010](adr/010-architecture-backend.md) |
|
||||||
|
| **Authentification** | Zitadel (self-hosted OVH) | [ADR-008](adr/008-authentification.md) |
|
||||||
|
| **Streaming** | HLS | [ADR-002](adr/002-protocole-streaming.md) |
|
||||||
|
| **Codec** | Opus | [ADR-003](adr/003-codec-audio.md) |
|
||||||
|
| **CDN** | NGINX Cache (OVH VPS) | [ADR-004](adr/004-cdn.md) |
|
||||||
|
| **Storage** | OVH Object Storage | [ADR-004](adr/004-cdn.md) |
|
||||||
|
| **Hébergement MVP** | OVH VPS Essential | [ADR-015](adr/015-hebergement.md) |
|
||||||
|
| **Organisation** | Monorepo | [ADR-014](adr/014-organisation-monorepo.md) |
|
||||||
|
| **Base de données** | PostgreSQL + PostGIS | [ADR-005](adr/005-base-de-donnees.md) |
|
||||||
|
| **ORM/Accès données** | sqlc | [ADR-011](adr/011-orm-acces-donnees.md) |
|
||||||
|
| **Cache** | Redis Cluster | [ADR-021](adr/021-solution-cache.md) |
|
||||||
|
| **Chiffrement** | TLS 1.3 | [ADR-006](adr/006-chiffrement.md) |
|
||||||
|
| **Live** | WebRTC | [ADR-002](adr/002-protocole-streaming.md) |
|
||||||
|
| **Frontend Mobile** | Flutter | [ADR-012](adr/012-frontend-mobile.md) |
|
||||||
|
| **Tests** | Testify + Godog (Gherkin) | [ADR-013](adr/013-strategie-tests.md), [ADR-007](adr/007-tests-bdd.md) |
|
||||||
|
| **Paiements** | Mangopay | [ADR-009](adr/009-solution-paiement.md) |
|
||||||
|
| **Emailing** | Brevo | [ADR-016](adr/016-service-emailing.md) |
|
||||||
|
| **Géolocalisation IP** | IP2Location (fallback) | [ADR-019](adr/019-geolocalisation-ip.md) |
|
||||||
|
| **Librairies Mobile** | Flutter packages | [ADR-020](adr/020-librairies-flutter.md) |
|
||||||
|
| **CI/CD** | GitHub Actions (monorepo) | [ADR-022](adr/022-strategie-cicd-monorepo.md) |
|
||||||
|
| **Modération** | Architecture modération | [ADR-023](adr/023-architecture-moderation.md) |
|
||||||
|
| **Monitoring** | Prometheus + Grafana | [ADR-024](adr/024-monitoring-observabilite.md) |
|
||||||
|
| **Secrets** | Vault + sealed secrets | [ADR-025](adr/025-securite-secrets.md) |
|
||||||
|
| **Notifications géo** | Push + geofencing | [ADR-017](adr/017-notifications-geolocalisees.md) |
|
||||||
|
| **Notifications push** | FCM + APNS | [ADR-018](adr/018-notifications-push.md) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Streaming Audio
|
||||||
|
|
||||||
|
### Protocole : HLS (HTTP Live Streaming)
|
||||||
|
|
||||||
|
- Fonctionne à travers firewalls et réseaux mobiles instables
|
||||||
|
- Cache CDN natif (réduction des coûts)
|
||||||
|
- Bitrate adaptatif automatique (tunnels, zones rurales)
|
||||||
|
- Support natif iOS/Android
|
||||||
|
|
||||||
|
### Codec : Opus
|
||||||
|
|
||||||
|
Optimisé pour la voix en environnement bruyant (voiture).
|
||||||
|
|
||||||
|
| Qualité | Bitrate | Usage |
|
||||||
|
|---------|---------|-------|
|
||||||
|
| Basse | 24 kbps | 2G/Edge |
|
||||||
|
| Standard | 48 kbps | 3G |
|
||||||
|
| Haute | 64 kbps | 4G/5G |
|
||||||
|
|
||||||
|
Fallback AAC-LC pour appareils legacy.
|
||||||
|
|
||||||
|
### Buffering Adaptatif
|
||||||
|
|
||||||
|
| Réseau | Buffer min | Buffer cible | Buffer max |
|
||||||
|
|--------|------------|--------------|------------|
|
||||||
|
| WiFi | 5s | 30s | 120s |
|
||||||
|
| 4G/5G | 10s | 45s | 120s |
|
||||||
|
| 3G | 30s | 90s | 300s |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sécurité
|
||||||
|
|
||||||
|
### Chiffrement
|
||||||
|
|
||||||
|
- **TLS 1.3** sur tous les endpoints (overhead ~1-2%)
|
||||||
|
- **DTLS-SRTP** pour WebRTC (radio live)
|
||||||
|
- Pas de DRM initialement (ajout si licences l'exigent)
|
||||||
|
|
||||||
|
### Authentification
|
||||||
|
|
||||||
|
- **Zitadel self-hosted sur OVH France** (Gravelines) pour IAM
|
||||||
|
- Souveraineté totale : 100% données en France (cohérent avec ADR-004)
|
||||||
|
- JWT validation locale (zitadel-go SDK)
|
||||||
|
- OAuth2 PKCE pour mobile (iOS/Android)
|
||||||
|
- MFA et passkeys disponibles
|
||||||
|
- Rate limiting par IP et par utilisateur (Nginx + Zitadel)
|
||||||
|
- PostgreSQL schema partagé avec RoadWave (séparation logique)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Base de Données
|
||||||
|
|
||||||
|
### PostgreSQL + PostGIS
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Requête géolocalisée typique
|
||||||
|
SELECT id, ST_Distance(location::geography, ST_MakePoint($lon, $lat)::geography) as distance
|
||||||
|
FROM contents
|
||||||
|
WHERE ST_DWithin(location::geography, ST_MakePoint($lon, $lat)::geography, 50000)
|
||||||
|
ORDER BY distance
|
||||||
|
LIMIT 20;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Redis Geospatial (Cache)
|
||||||
|
|
||||||
|
```
|
||||||
|
GEOADD contents:geo longitude latitude content_id
|
||||||
|
GEORADIUS contents:geo user_lon user_lat 50 km WITHDIST COUNT 20 ASC
|
||||||
|
```
|
||||||
|
|
||||||
|
TTL cache : 5 minutes (le contenu ne bouge pas).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture Services
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
subgraph clients["Clients"]
|
||||||
|
mobile["Mobile Apps<br/>iOS/Android<br/>Flutter"]
|
||||||
|
carplay["CarPlay /<br/>Android Auto"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph ovh["OVH VPS Essential (Gravelines, France)"]
|
||||||
|
nginx["NGINX Cache<br/>+ Let's Encrypt<br/>TLS 1.3, Rate Limiting"]
|
||||||
|
api["API Gateway<br/>Go + Fiber :8080"]
|
||||||
|
|
||||||
|
subgraph services["Backend Services (Monolithe Modulaire)"]
|
||||||
|
auth["Auth Service<br/>JWT validation"]
|
||||||
|
user["User Service<br/>Profils, Jauges"]
|
||||||
|
content["Content/Geo Service<br/>Recommandations<br/>PostGIS queries"]
|
||||||
|
streaming["Streaming Service<br/>HLS generation"]
|
||||||
|
payment["Payment Service<br/>Mangopay integration"]
|
||||||
|
notif["Notification Service<br/>FCM/APNS"]
|
||||||
|
end
|
||||||
|
|
||||||
|
zitadel["Zitadel IdP<br/>OAuth2 PKCE<br/>:8081"]
|
||||||
|
ip2loc["IP2Location DB<br/>SQLite ~50MB<br/>Mode dégradé"]
|
||||||
|
|
||||||
|
subgraph data["Données"]
|
||||||
|
pgbouncer["PgBouncer<br/>Connection pooling<br/>:6432"]
|
||||||
|
postgres["PostgreSQL 16<br/>+ PostGIS 3.4<br/>Schémas:<br/>- roadwave<br/>- zitadel"]
|
||||||
|
redis["Redis 7 Cluster<br/>Cache + Geospatial<br/>GEORADIUS"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph external["Services Externes"]
|
||||||
|
storage["OVH Object Storage<br/>Fichiers audio HLS"]
|
||||||
|
mangopay["Mangopay<br/>Paiements, KYC"]
|
||||||
|
brevo["Brevo<br/>Emails transactionnels"]
|
||||||
|
fcm["FCM / APNS<br/>Push notifications"]
|
||||||
|
end
|
||||||
|
|
||||||
|
mobile --> nginx
|
||||||
|
carplay --> nginx
|
||||||
|
nginx --> api
|
||||||
|
api --> auth
|
||||||
|
api --> user
|
||||||
|
api --> content
|
||||||
|
api --> streaming
|
||||||
|
api --> payment
|
||||||
|
api --> notif
|
||||||
|
api --> ip2loc
|
||||||
|
|
||||||
|
auth --> zitadel
|
||||||
|
user --> pgbouncer
|
||||||
|
user --> redis
|
||||||
|
content --> pgbouncer
|
||||||
|
content --> redis
|
||||||
|
streaming --> storage
|
||||||
|
payment --> mangopay
|
||||||
|
notif --> fcm
|
||||||
|
|
||||||
|
zitadel --> pgbouncer
|
||||||
|
pgbouncer --> postgres
|
||||||
|
|
||||||
|
brevo -.email.-> mobile
|
||||||
|
fcm -.push.-> mobile
|
||||||
|
|
||||||
|
style ovh fill:#e3f2fd
|
||||||
|
style external fill:#fff3e0
|
||||||
|
style clients fill:#f3e5f5
|
||||||
|
style data fill:#e8f5e9
|
||||||
|
```
|
||||||
|
|
||||||
|
**Souveraineté** : 100% données en France (RGPD compliant)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scaling 10M Utilisateurs
|
||||||
|
|
||||||
|
### Stratégie par phase
|
||||||
|
|
||||||
|
| Phase | Utilisateurs | Infra | Coût estimé |
|
||||||
|
|-------|--------------|-------|-------------|
|
||||||
|
| MVP | 0-20K | OVH VPS Essential + PostgreSQL + Zitadel + NGINX Cache | ~14€/mois |
|
||||||
|
| Growth | 20K-500K | Scaleway Instances (multi-replicas), OVH Object Storage | 150-500€/mois |
|
||||||
|
| Scale | 500K+ | Multi-région, Kubernetes managé, NGINX origin shield | 2-10K€/mois |
|
||||||
|
|
||||||
|
### Métriques cibles
|
||||||
|
|
||||||
|
| Métrique | Objectif |
|
||||||
|
|----------|----------|
|
||||||
|
| Latence API p99 | < 100ms |
|
||||||
|
| Temps de démarrage audio | < 3s |
|
||||||
|
| Disponibilité | 99.9% |
|
||||||
|
| Connexions/serveur | 100K+ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Points de vigilance
|
||||||
|
|
||||||
|
1. **Buffering mobile** : Pré-chargement agressif avant tunnels (détection GPS)
|
||||||
|
2. **Handoff réseau** : Buffer suffisant pour survivre aux changements de cellule
|
||||||
|
3. **Mode offline** : Téléchargement complet sur WiFi
|
||||||
|
4. **Bande passante** : 48 kbps Opus = ~20 MB/heure (faible consommation data)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pourquoi pas UDP brut ?
|
||||||
|
|
||||||
|
| UDP | HLS/TCP |
|
||||||
|
|-----|---------|
|
||||||
|
| Latence minimale | Latence acceptable (5-30s) |
|
||||||
|
| Problèmes NAT/firewall | Passe partout |
|
||||||
|
| Perte de paquets = artefacts | Retransmission automatique |
|
||||||
|
| Pas de cache CDN | Cache CDN = économies |
|
||||||
|
| Complexité++ | Standard de l'industrie |
|
||||||
|
|
||||||
|
Pour du contenu non-interactif (podcasts, audio-guides), la latence HLS est acceptable. WebRTC réservé à la radio live uniquement.
|
||||||
@@ -36,7 +36,7 @@ theme:
|
|||||||
plugins:
|
plugins:
|
||||||
- search:
|
- search:
|
||||||
lang: fr
|
lang: fr
|
||||||
- glightbox: # Lightbox pour agrandir les images
|
# - glightbox: # Lightbox pour agrandir les images (désactivé temporairement)
|
||||||
|
|
||||||
markdown_extensions:
|
markdown_extensions:
|
||||||
- admonition
|
- admonition
|
||||||
|
|||||||
69
scripts/fix-remaining-links.sh
Executable file
69
scripts/fix-remaining-links.sh
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script pour corriger les liens restants après refactorisation DDD
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔗 Correction des liens restants..."
|
||||||
|
|
||||||
|
# 1. Corriger les liens docs/adr/ → adr/ dans index.md et technical.md
|
||||||
|
echo " → Correction des liens ADR dans index.md et technical.md..."
|
||||||
|
find docs -name "index.md" -o -name "technical.md" -o -name "TECHNICAL.md" | while read file; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
sed -i 's|docs/adr/|adr/|g' "$file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 2. Corriger les liens vers anciens noms de fichiers numérotés
|
||||||
|
echo " → Correction des liens vers anciens noms de fichiers..."
|
||||||
|
|
||||||
|
# Dans content/
|
||||||
|
find docs/domains/content -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|05-interactions-navigation\.md|../../recommendation/rules/interactions-navigation.md|g' \
|
||||||
|
-e 's|18-detection-contenu-protege\.md|detection-contenu-protege.md|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# Dans moderation/
|
||||||
|
find docs/domains/moderation -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|18-detection-contenu-protege\.md|../../content/rules/detection-contenu-protege.md|g' \
|
||||||
|
-e 's|19-moderation-communautaire\.md|moderation-communautaire.md|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# Dans premium/
|
||||||
|
find docs/domains/premium -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|05-interactions-navigation\.md|../../recommendation/rules/interactions-navigation.md|g' \
|
||||||
|
-e 's|08-mode-offline\.md|mode-offline.md|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# Dans recommendation/
|
||||||
|
find docs/domains/recommendation -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|05-interactions-navigation\.md|interactions-navigation.md|g' \
|
||||||
|
-e 's|ANNEXE-POST-MVP\.md|../../_shared/rules/ANNEXE-POST-MVP.md|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# 3. Corriger les liens relatifs vers ADR depuis les domaines
|
||||||
|
echo " → Correction des liens ADR depuis les domaines..."
|
||||||
|
find docs/domains -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|\.\./adr/|../../../adr/|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# 4. Corriger le lien dans recommendation/features/recommendation/README.md
|
||||||
|
if [ -f "docs/domains/recommendation/features/recommendation/README.md" ]; then
|
||||||
|
sed -i 's|\.\./rules/|../../rules/|g' docs/domains/recommendation/features/recommendation/README.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Corriger les liens dans mobile/ vers adr/
|
||||||
|
find docs/mobile -type f -name "*.md" -exec sed -i \
|
||||||
|
-e 's|\.\./adr/010-frontend-mobile\.md|../adr/012-frontend-mobile.md|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
# 6. Corriger liens dans compliance/
|
||||||
|
if [ -f "docs/compliance/stores-submission.md" ]; then
|
||||||
|
sed -i 's|../adr/010-frontend-mobile\.md|../adr/012-frontend-mobile.md|g' docs/compliance/stores-submission.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. Corriger le lien vers sequences/scoring-recommandation.md qui n'existe pas
|
||||||
|
find docs/domains/recommendation -type f -name "README.md" -exec sed -i \
|
||||||
|
-e 's|sequences/scoring-recommandation\.md|(à créer)|g' \
|
||||||
|
{} \;
|
||||||
|
|
||||||
|
echo "✅ Correction des liens restants terminée!"
|
||||||
Reference in New Issue
Block a user