From be9fc998cc50adee89bebcc22755fe0a55236be6 Mon Sep 17 00:00:00 2001 From: jpgiannetti Date: Sat, 7 Feb 2026 17:25:47 +0100 Subject: [PATCH] =?UTF-8?q?fix(docs):=20corriger=20les=20liens=20internes?= =?UTF-8?q?=20cass=C3=A9s=20apr=C3=A8s=20refactorisation=20DDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/domains/README.md | 2 +- .../domains/_shared/rules/authentification.md | 2 +- docs/domains/_shared/rules/rgpd.md | 2 +- docs/domains/content/rules/audio-guides.md | 2 +- .../content/rules/contenus-geolocalises.md | 4 +- docs/domains/content/rules/radio-live.md | 2 +- .../moderation/rules/moderation-flows.md | 6 +- .../rules/abonnements-notifications.md | 2 +- docs/domains/premium/rules/premium.md | 2 +- docs/domains/recommendation/README.md | 2 +- .../features/recommendation/README.md | 2 +- .../rules/algorithme-recommandation.md | 2 +- .../rules/centres-interet-jauges.md | 4 +- .../rules/interactions-navigation.md | 2 +- docs/index.md | 286 +++++++++++++++++- docs/mobile/permissions-strategy.md | 2 +- docs/mobile/testflight-validation-plan.md | 2 +- docs/technical.md | 229 +++++++++++++- mkdocs.yml | 2 +- scripts/fix-remaining-links.sh | 69 +++++ 20 files changed, 603 insertions(+), 23 deletions(-) mode change 120000 => 100644 docs/index.md mode change 120000 => 100644 docs/technical.md create mode 100755 scripts/fix-remaining-links.sh diff --git a/docs/domains/README.md b/docs/domains/README.md index 9aab158..bf96a37 100644 --- a/docs/domains/README.md +++ b/docs/domains/README.md @@ -203,7 +203,7 @@ domains// ## Navigation - [📖 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/) - [🖥️ Interfaces UI](../interfaces/) - [🔧 Documentation technique](../technical.md) diff --git a/docs/domains/_shared/rules/authentification.md b/docs/domains/_shared/rules/authentification.md index 14654f8..8d2b605 100644 --- a/docs/domains/_shared/rules/authentification.md +++ b/docs/domains/_shared/rules/authentification.md @@ -19,7 +19,7 @@ - RGPD : données 100% contrôlées - 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. --- diff --git a/docs/domains/_shared/rules/rgpd.md b/docs/domains/_shared/rules/rgpd.md index 51b9efe..8cf3e31 100644 --- a/docs/domains/_shared/rules/rgpd.md +++ b/docs/domains/_shared/rules/rgpd.md @@ -144,7 +144,7 @@ export-roadwave-[user_id]-[date].zip - Upgrade volontaire vers GPS **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 - Précision ~80% au niveau ville diff --git a/docs/domains/content/rules/audio-guides.md b/docs/domains/content/rules/audio-guides.md index d7fbf1f..03da311 100644 --- a/docs/domains/content/rules/audio-guides.md +++ b/docs/domains/content/rules/audio-guides.md @@ -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) **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) - Raison : expérience guidée continue, user sait qu'il suit un parcours diff --git a/docs/domains/content/rules/contenus-geolocalises.md b/docs/domains/content/rules/contenus-geolocalises.md index e8fc656..9573ee8 100644 --- a/docs/domains/content/rules/contenus-geolocalises.md +++ b/docs/domains/content/rules/contenus-geolocalises.md @@ -468,7 +468,7 @@ func ActivateCooldown(userID string) { #### 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) - Structure : `[{content_id, position_seconds, listened_at, type}, ...]` @@ -502,7 +502,7 @@ Timeline : 5. User appuie "Suivant" (skip) → contenu buffer_2 démarre 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 → retour contenu précédent (position exacte) diff --git a/docs/domains/content/rules/radio-live.md b/docs/domains/content/rules/radio-live.md index b4653ab..5298aa9 100644 --- a/docs/domains/content/rules/radio-live.md +++ b/docs/domains/content/rules/radio-live.md @@ -57,7 +57,7 @@ **Détection violations** : - **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 - **Coupure immédiate** : modérateur peut arrêter live si contenu illégal évident diff --git a/docs/domains/moderation/rules/moderation-flows.md b/docs/domains/moderation/rules/moderation-flows.md index 77de189..4dfd288 100644 --- a/docs/domains/moderation/rules/moderation-flows.md +++ b/docs/domains/moderation/rules/moderation-flows.md @@ -13,7 +13,7 @@ Liste déroulante avec 7 options : | 🚫 **Haine & violence** | Incitation à la haine, discrimination, menaces | | 🔞 **Contenu sexuel** | Pornographie, contenu explicite | | ⚖️ **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 | | ❌ **Fausse information** | Désinformation sur santé, sécurité routière | | 🔧 **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) diff --git a/docs/domains/premium/rules/abonnements-notifications.md b/docs/domains/premium/rules/abonnements-notifications.md index 3926b76..4aa2268 100644 --- a/docs/domains/premium/rules/abonnements-notifications.md +++ b/docs/domains/premium/rules/abonnements-notifications.md @@ -276,7 +276,7 @@ Liste des séquences : - Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?" **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) - Immédiat à l'action diff --git a/docs/domains/premium/rules/premium.md b/docs/domains/premium/rules/premium.md index 2c23233..690c480 100644 --- a/docs/domains/premium/rules/premium.md +++ b/docs/domains/premium/rules/premium.md @@ -105,7 +105,7 @@ Device 1 vraiment offline (mode avion, tunnel) #### 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 diff --git a/docs/domains/recommendation/README.md b/docs/domains/recommendation/README.md index 61955e4..a6b6887 100644 --- a/docs/domains/recommendation/README.md +++ b/docs/domains/recommendation/README.md @@ -22,7 +22,7 @@ Le domaine **Recommendation** gère le système de recommandation de contenus ba ## 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 diff --git a/docs/domains/recommendation/features/recommendation/README.md b/docs/domains/recommendation/features/recommendation/README.md index 7cd25f2..524a0e3 100644 --- a/docs/domains/recommendation/features/recommendation/README.md +++ b/docs/domains/recommendation/features/recommendation/README.md @@ -1,6 +1,6 @@ # 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 diff --git a/docs/domains/recommendation/rules/algorithme-recommandation.md b/docs/domains/recommendation/rules/algorithme-recommandation.md index 0f89f18..d593de7 100644 --- a/docs/domains/recommendation/rules/algorithme-recommandation.md +++ b/docs/domains/recommendation/rules/algorithme-recommandation.md @@ -190,7 +190,7 @@ GROUP BY content_id; ### 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 diff --git a/docs/domains/recommendation/rules/centres-interet-jauges.md b/docs/domains/recommendation/rules/centres-interet-jauges.md index 2f2e98b..c3305ed 100644 --- a/docs/domains/recommendation/rules/centres-interet-jauges.md +++ b/docs/domains/recommendation/rules/centres-interet-jauges.md @@ -61,7 +61,7 @@ Scénario 5 : Skip après 5s (ABONNÉ au créateur) ``` **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 - **Prévisibilité** : Règles claires et déterministes - **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) - **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. --- diff --git a/docs/domains/recommendation/rules/interactions-navigation.md b/docs/domains/recommendation/rules/interactions-navigation.md index 2c381a5..058e4a0 100644 --- a/docs/domains/recommendation/rules/interactions-navigation.md +++ b/docs/domains/recommendation/rules/interactions-navigation.md @@ -154,7 +154,7 @@ Android (`AndroidManifest.xml`) : ``` -> 📋 **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é) : diff --git a/docs/index.md b/docs/index.md deleted file mode 120000 index 32d46ee..0000000 --- a/docs/index.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..2ac5e2d --- /dev/null +++ b/docs/index.md @@ -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 diff --git a/docs/mobile/permissions-strategy.md b/docs/mobile/permissions-strategy.md index 05060e1..d1db4db 100644 --- a/docs/mobile/permissions-strategy.md +++ b/docs/mobile/permissions-strategy.md @@ -851,7 +851,7 @@ void main() { ## 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 02** : [Conformité RGPD](../domains/_shared/rules/rgpd.md) - **Apple Guidelines** : [Location Best Practices](https://developer.apple.com/design/human-interface-guidelines/location) diff --git a/docs/mobile/testflight-validation-plan.md b/docs/mobile/testflight-validation-plan.md index 01d03b0..50f35f5 100644 --- a/docs/mobile/testflight-validation-plan.md +++ b/docs/mobile/testflight-validation-plan.md @@ -608,7 +608,7 @@ Location Data : ### Documentation - [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) --- diff --git a/docs/technical.md b/docs/technical.md deleted file mode 120000 index e6e8483..0000000 --- a/docs/technical.md +++ /dev/null @@ -1 +0,0 @@ -../TECHNICAL.md \ No newline at end of file diff --git a/docs/technical.md b/docs/technical.md new file mode 100644 index 0000000..a54412c --- /dev/null +++ b/docs/technical.md @@ -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
iOS/Android
Flutter"] + carplay["CarPlay /
Android Auto"] + end + + subgraph ovh["OVH VPS Essential (Gravelines, France)"] + nginx["NGINX Cache
+ Let's Encrypt
TLS 1.3, Rate Limiting"] + api["API Gateway
Go + Fiber :8080"] + + subgraph services["Backend Services (Monolithe Modulaire)"] + auth["Auth Service
JWT validation"] + user["User Service
Profils, Jauges"] + content["Content/Geo Service
Recommandations
PostGIS queries"] + streaming["Streaming Service
HLS generation"] + payment["Payment Service
Mangopay integration"] + notif["Notification Service
FCM/APNS"] + end + + zitadel["Zitadel IdP
OAuth2 PKCE
:8081"] + ip2loc["IP2Location DB
SQLite ~50MB
Mode dégradé"] + + subgraph data["Données"] + pgbouncer["PgBouncer
Connection pooling
:6432"] + postgres["PostgreSQL 16
+ PostGIS 3.4
Schémas:
- roadwave
- zitadel"] + redis["Redis 7 Cluster
Cache + Geospatial
GEORADIUS"] + end + end + + subgraph external["Services Externes"] + storage["OVH Object Storage
Fichiers audio HLS"] + mangopay["Mangopay
Paiements, KYC"] + brevo["Brevo
Emails transactionnels"] + fcm["FCM / APNS
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. diff --git a/mkdocs.yml b/mkdocs.yml index f965076..939e21b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -36,7 +36,7 @@ theme: plugins: - search: lang: fr - - glightbox: # Lightbox pour agrandir les images + # - glightbox: # Lightbox pour agrandir les images (désactivé temporairement) markdown_extensions: - admonition diff --git a/scripts/fix-remaining-links.sh b/scripts/fix-remaining-links.sh new file mode 100755 index 0000000..59ad424 --- /dev/null +++ b/scripts/fix-remaining-links.sh @@ -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!"