From 5e5fcf4714fbe7b7615b380935abb74ab366bc30 Mon Sep 17 00:00:00 2001 From: jpgiannetti Date: Sat, 7 Feb 2026 17:15:02 +0100 Subject: [PATCH] =?UTF-8?q?refactor(docs):=20r=C3=A9organiser=20la=20docum?= =?UTF-8?q?entation=20selon=20principes=20DDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet. --- Makefile | 2 +- docs/REFACTOR-DDD.md | 370 ++++++++++++++++++ docs/adr/008-authentification.md | 4 +- docs/adr/012-frontend-mobile.md | 4 +- docs/adr/019-geolocalisation-ip.md | 2 +- docs/adr/023-architecture-moderation.md | 8 +- docs/adr/025-securite-secrets.md | 4 +- .../sequences/cache-geospatial.md | 3 +- docs/compliance/stores-submission.md | 2 +- docs/domains/README.md | 249 ++++++++++++ docs/domains/_shared/README.md | 37 ++ .../_shared/entities}/modele-global.md | 0 .../appareil-confiance-2fa.feature | 0 .../authentication/classification-age.feature | 0 .../authentication/connexion.feature | 0 .../authentication/gestion-compte.feature | 0 .../authentication/inscription.feature | 0 .../limite-tentatives-connexion.feature | 0 .../multi-device-sessions.feature | 0 .../recuperation-compte.feature | 0 .../recuperation-mot-passe-avancee.feature | 0 .../authentication/sessions-tokens.feature | 0 .../two-factor-authentication.feature | 0 .../validation-mot-passe.feature | 0 .../authentication/verification-email.feature | 0 .../aucun-contenu-disponible.feature | 0 .../contenu-supprime-pendant-ecoute.feature | 0 .../geolocalisation-desactivee.feature | 0 .../error-handling/perte-reseau.feature | 0 .../partage/partage-contenu-premium.feature | 0 .../features}/partage/partage-contenu.feature | 0 .../features}/profil/badge-verifie.feature | 0 .../features}/profil/profil-createur.feature | 0 .../profil/statistiques-arrondies.feature | 0 .../rgpd-compliance/anonymisation-gps.feature | 0 .../compliance-administrative.feature | 0 .../rgpd-compliance/consentement.feature | 0 .../conservation-donnees.feature | 0 .../rgpd-compliance/cookies-analytics.feature | 0 .../mode-degrade-geoip.feature | 0 .../portabilite-donnees.feature | 0 .../suppression-compte.feature | 0 .../_shared/rules}/ANNEXE-POST-MVP.md | 0 .../_shared/rules/authentification.md} | 0 .../_shared/rules/gestion-erreurs.md} | 0 .../_shared/rules/rgpd.md} | 0 docs/domains/advertising/README.md | 36 ++ .../entities}/modele-publicites.md | 2 +- .../campagnes-publicitaires.feature | 0 .../publicites/caracteristiques-pub.feature | 0 .../ciblage-horaire-fuseaux-horaires.feature | 0 .../publicites/gestion-budget-pub.feature | 0 .../insertion-frequence-pub.feature | 0 .../metriques-engagement-pub.feature | 0 .../validation-moderation-pub.feature | 0 .../advertising/rules/publicites.md} | 0 docs/domains/content/README.md | 44 +++ .../content/entities}/modele-audio-guides.md | 2 +- .../content/entities}/modele-radio-live.md | 2 +- .../affichage-distance-direction-eta.feature | 0 .../audio-guides/creation-audio-guide.feature | 0 .../audio-guides/creation-gestion.feature | 0 .../creation-wizard-complet.feature | 0 .../declenchement-gps-voiture-complet.feature | 0 .../audio-guides/declenchement-gps.feature | 0 .../detection-mode-deplacement.feature | 0 .../audio-guides/gestion-point-manque.feature | 0 .../integration-fonctionnalites.feature | 0 .../audio-guides/metriques-analytics.feature | 0 .../audio-guides/mode-pieton.feature | 0 .../audio-guides/mode-voiture.feature | 0 .../modes-velo-transport-complet.feature | 0 .../audio-guides/modes-velo-transport.feature | 0 .../navigation-libre-pieton-complet.feature | 0 .../audio-guides/pieton-pub-autoplay.feature | 0 .../audio-guides/premium-monetisation.feature | 0 .../progression-sauvegarde.feature | 0 .../audio-guides/progression-sync.feature | 0 .../audio-guides/publicites-complet.feature | 0 .../features}/audio-guides/publicites.feature | 0 .../rayon-configurable-createur.feature | 0 .../reprise-progression-complet.feature | 0 .../sauvegarde-sync-progression.feature | 0 .../systeme-double-clic-sortie.feature | 0 .../fair-use-30s-musique.feature | 0 .../image-couverture-auto.feature | 0 .../metadonnees-publication.feature | 0 .../modification-suppression.feature | 0 .../restrictions-modification.feature | 0 .../suppression-marquage.feature | 0 .../content-creation/upload-encodage.feature | 0 .../validation-musique-detection.feature | 0 .../validation-premiers-contenus.feature | 0 .../navigation/auto-switching-modes.feature | 0 .../navigation/decompte-5s-transition.feature | 0 .../navigation/eta-calculation.feature | 0 .../features}/navigation/file-attente.feature | 0 .../navigation/historique-geo-contenu.feature | 0 .../navigation/mode-stationnement.feature | 0 .../notification-minimaliste-voiture.feature | 0 .../notifications-geolocalisees.feature | 0 .../navigation/quota-cooldown.feature | 0 .../architecture-technique-live.feature | 0 .../features}/radio-live/arret-live.feature | 0 .../comportement-auditeur-live.feature | 0 .../radio-live/comportement-auditeur.feature | 0 .../radio-live/demarrage-live.feature | 0 .../enregistrement-publication-replay.feature | 0 .../interdictions-moderation-live.feature | 0 .../education-droits-auteur.feature | 0 .../actions-mode-pieton.feature | 0 .../ui-navigation}/commande-precedent.feature | 0 .../ui-navigation}/commandes-vocales.feature | 0 .../ui-navigation}/commandes-volant.feature | 0 .../contenus-geolocalises-voiture.feature | 0 .../file-attente-suivant.feature | 0 .../lecture-enchainement.feature | 0 .../mode-pieton-notifications-push.feature | 0 .../content/rules/audio-guides.md} | 0 .../content/rules/contenus-geolocalises.md} | 0 .../content/rules/creation-publication.md} | 0 .../rules/detection-contenu-protege.md} | 0 .../content/rules/radio-live.md} | 0 docs/domains/moderation/README.md | 51 +++ .../moderation/entities}/modele-moderation.md | 2 +- .../admin}/dashboard-moderateur.feature | 0 .../features/admin}/outils-moderateur.feature | 0 .../features/api}/appel-droits-auteur.feature | 0 .../features/api}/audit-trimestriel.feature | 0 .../features/api}/badges-system.feature | 0 .../api}/detection-patterns-suspects.feature | 0 .../api}/limite-temporelle-anti-abus.feature | 0 .../api}/moderation-communautaire.feature | 0 .../api}/moderation-preventive.feature | 0 .../api}/reduction-premium-badge-or.feature | 0 .../api}/sanctions-abus-progressives.feature | 0 .../api}/sanctions-droits-auteur.feature | 0 .../api}/sanctions-notifications.feature | 0 .../api}/score-fiabilite-priorisation.feature | 0 .../signalement-musique-posteriori.feature | 0 .../features/api}/signalement.feature | 0 .../api}/traitement-signalements.feature | 0 .../api}/utilisateur-confiance.feature | 0 .../features/ui}/badges-statistiques.feature | 0 .../ui}/historique-signalements.feature | 0 .../ui}/modal-decouverte-badges.feature | 0 .../features/ui}/sanctions-appel.feature | 0 .../features/ui}/signalement-ui.feature | 0 .../flows}/moderation-signalement.md | 2 +- .../moderation/rules/autres-comportements.md} | 0 .../rules/moderation-communautaire.md} | 0 .../moderation/rules/moderation-flows.md} | 0 .../sequences}/processus-appel-moderation.md | 2 +- .../states}/signalement-lifecycle.md | 2 +- docs/domains/monetization/README.md | 38 ++ .../entities}/modele-monetisation.md | 2 +- .../conditions-activation.feature | 0 .../contenus-premium-exclusifs.feature | 0 .../desactivation-suspension.feature | 0 .../monetisation/kyc-inscription.feature | 0 .../monetisation/obligations-fiscales.feature | 0 .../monetisation/paiement-createurs.feature | 0 .../soldes-dormants-inactifs.feature | 0 .../monetisation/sources-revenus.feature | 0 .../rules/monetisation-createurs.md} | 0 docs/domains/premium/README.md | 38 ++ .../premium/entities}/modele-premium.md | 2 +- .../abonnements/audio-guides-pieton.feature | 0 .../abonnements/impact-algorithme.feature | 0 .../abonnements/limites-desabonnement.feature | 0 .../notifications-contextuelles.feature | 0 ...contenus-supprimes-pendant-offline.feature | 0 .../synchronisation-actions.feature | 0 .../mode-offline/telechargement.feature | 0 .../validite-renouvellement.feature | 0 .../premium/avantages-premium.feature | 0 .../premium/gestion-abonnement.feature | 0 .../multi-devices-dernier-priorite.feature | 0 .../premium/multi-devices-detection.feature | 0 .../premium/offre-tarification.feature | 0 .../premium/stream-conflict-detection.feature | 0 .../premium/tarification-multi-canal.feature | 0 .../premium/webhooks-retry-paiement.feature | 0 .../rules/abonnements-notifications.md} | 0 .../premium/rules/mode-offline.md} | 0 .../premium/rules/premium.md} | 0 docs/domains/recommendation/README.md | 45 +++ .../entities}/modele-recommandation.md | 2 +- .../degradation-temporelle.feature | 0 .../interest-gauges/evolution-jauges.feature | 0 .../interest-gauges/jauge-initiale.feature | 0 .../skip-abonnes-neutralisation.feature | 0 .../recherche/filtres-avances.feature | 0 .../recherche/page-resultats-carte.feature | 0 .../features}/recherche/recherche.feature | 0 .../features}/recommendation/README.md | 2 +- .../recommendation/classification-geo.feature | 0 .../recommendation/contenu-politique.feature | 0 .../recommendation/declenchement-geo.feature | 0 .../historique-reproposition.feature | 0 .../medias-traditionnels.feature | 0 .../recommendation/mode-kids.feature | 0 .../parametrabilite-admin.feature | 0 .../parametrabilite-utilisateur.feature | 0 .../scoring-recommandation.feature | 0 .../search/geolocation-search.feature | 0 .../rules/algorithme-recommandation.md} | 0 .../rules/centres-interet-jauges.md} | 0 .../rules/interactions-navigation.md} | 0 docs/gherkin-moderation-overview.md | 8 +- docs/interfaces/README.md | 58 +++ docs/interfaces/assets/mobile/.gitkeep | 0 docs/interfaces/assets/web/.gitkeep | 0 docs/interfaces/mobile/navigation.md | 208 ++++++++++ docs/mobile/permissions-strategy.md | 4 +- docs/mobile/testflight-validation-plan.md | 2 +- docs/regles-metier/README.md | 296 -------------- .../degradation-temporelle.feature | 142 ------- .../interest-gauges/evolution-jauges.feature | 237 ----------- .../ui/interest-gauges/jauge-initiale.feature | 147 ------- .../filtrage-politique-ui.feature | 234 ----------- .../ui/recommendation/mode-kids-ui.feature | 261 ------------ .../recommendation/notifications-geo.feature | 256 ------------ .../parametres-personnalisation.feature | 314 --------------- mkdocs.yml | 111 +++--- scripts/fix-markdown-links.sh | 141 +++++++ scripts/generate-bdd-docs.py | 2 +- 227 files changed, 1413 insertions(+), 1967 deletions(-) create mode 100644 docs/REFACTOR-DDD.md create mode 100644 docs/domains/README.md create mode 100644 docs/domains/_shared/README.md rename docs/{diagrammes/entites => domains/_shared/entities}/modele-global.md (100%) rename {features/api => docs/domains/_shared/features}/authentication/appareil-confiance-2fa.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/classification-age.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/connexion.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/gestion-compte.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/inscription.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/limite-tentatives-connexion.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/multi-device-sessions.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/recuperation-compte.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/recuperation-mot-passe-avancee.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/sessions-tokens.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/two-factor-authentication.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/validation-mot-passe.feature (100%) rename {features/api => docs/domains/_shared/features}/authentication/verification-email.feature (100%) rename {features/e2e => docs/domains/_shared/features}/error-handling/aucun-contenu-disponible.feature (100%) rename {features/e2e => docs/domains/_shared/features}/error-handling/contenu-supprime-pendant-ecoute.feature (100%) rename {features/e2e => docs/domains/_shared/features}/error-handling/geolocalisation-desactivee.feature (100%) rename {features/e2e => docs/domains/_shared/features}/error-handling/perte-reseau.feature (100%) rename {features/ui => docs/domains/_shared/features}/partage/partage-contenu-premium.feature (100%) rename {features/ui => docs/domains/_shared/features}/partage/partage-contenu.feature (100%) rename {features/api => docs/domains/_shared/features}/profil/badge-verifie.feature (100%) rename {features/ui => docs/domains/_shared/features}/profil/profil-createur.feature (100%) rename {features/ui => docs/domains/_shared/features}/profil/statistiques-arrondies.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/anonymisation-gps.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/compliance-administrative.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/consentement.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/conservation-donnees.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/cookies-analytics.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/mode-degrade-geoip.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/portabilite-donnees.feature (100%) rename {features/api => docs/domains/_shared/features}/rgpd-compliance/suppression-compte.feature (100%) rename docs/{regles-metier => domains/_shared/rules}/ANNEXE-POST-MVP.md (100%) rename docs/{regles-metier/01-authentification-inscription.md => domains/_shared/rules/authentification.md} (100%) rename docs/{regles-metier/10-gestion-erreurs.md => domains/_shared/rules/gestion-erreurs.md} (100%) rename docs/{regles-metier/02-conformite-rgpd.md => domains/_shared/rules/rgpd.md} (100%) create mode 100644 docs/domains/advertising/README.md rename docs/{diagrammes/entites => domains/advertising/entities}/modele-publicites.md (94%) rename {features/api => docs/domains/advertising/features}/publicites/campagnes-publicitaires.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/caracteristiques-pub.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/ciblage-horaire-fuseaux-horaires.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/gestion-budget-pub.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/insertion-frequence-pub.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/metriques-engagement-pub.feature (100%) rename {features/api => docs/domains/advertising/features}/publicites/validation-moderation-pub.feature (100%) rename docs/{regles-metier/16-publicites.md => domains/advertising/rules/publicites.md} (100%) create mode 100644 docs/domains/content/README.md rename docs/{diagrammes/entites => domains/content/entities}/modele-audio-guides.md (96%) rename docs/{diagrammes/entites => domains/content/entities}/modele-radio-live.md (94%) rename {features/api => docs/domains/content/features}/audio-guides/affichage-distance-direction-eta.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/creation-audio-guide.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/creation-gestion.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/creation-wizard-complet.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/declenchement-gps-voiture-complet.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/declenchement-gps.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/detection-mode-deplacement.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/gestion-point-manque.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/integration-fonctionnalites.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/metriques-analytics.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/mode-pieton.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/mode-voiture.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/modes-velo-transport-complet.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/modes-velo-transport.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/navigation-libre-pieton-complet.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/pieton-pub-autoplay.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/premium-monetisation.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/progression-sauvegarde.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/progression-sync.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/publicites-complet.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/publicites.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/rayon-configurable-createur.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/reprise-progression-complet.feature (100%) rename {features/api => docs/domains/content/features}/audio-guides/sauvegarde-sync-progression.feature (100%) rename {features/ui => docs/domains/content/features}/audio-guides/systeme-double-clic-sortie.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/fair-use-30s-musique.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/image-couverture-auto.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/metadonnees-publication.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/modification-suppression.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/restrictions-modification.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/suppression-marquage.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/upload-encodage.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/validation-musique-detection.feature (100%) rename {features/api => docs/domains/content/features}/content-creation/validation-premiers-contenus.feature (100%) rename {features/api => docs/domains/content/features}/navigation/auto-switching-modes.feature (100%) rename {features/api => docs/domains/content/features}/navigation/decompte-5s-transition.feature (100%) rename {features/api => docs/domains/content/features}/navigation/eta-calculation.feature (100%) rename {features/api => docs/domains/content/features}/navigation/file-attente.feature (100%) rename {features/api => docs/domains/content/features}/navigation/historique-geo-contenu.feature (100%) rename {features/api => docs/domains/content/features}/navigation/mode-stationnement.feature (100%) rename {features/api => docs/domains/content/features}/navigation/notification-minimaliste-voiture.feature (100%) rename {features/api => docs/domains/content/features}/navigation/notifications-geolocalisees.feature (100%) rename {features/api => docs/domains/content/features}/navigation/quota-cooldown.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/architecture-technique-live.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/arret-live.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/comportement-auditeur-live.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/comportement-auditeur.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/demarrage-live.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/enregistrement-publication-replay.feature (100%) rename {features/api => docs/domains/content/features}/radio-live/interdictions-moderation-live.feature (100%) rename {features/ui/content-creation => docs/domains/content/features/ui-content-creation}/education-droits-auteur.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/actions-mode-pieton.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/commande-precedent.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/commandes-vocales.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/commandes-volant.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/contenus-geolocalises-voiture.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/file-attente-suivant.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/lecture-enchainement.feature (100%) rename {features/ui/navigation => docs/domains/content/features/ui-navigation}/mode-pieton-notifications-push.feature (100%) rename docs/{regles-metier/06-audio-guides-multi-sequences.md => domains/content/rules/audio-guides.md} (100%) rename docs/{regles-metier/07-contenus-geolocalises-voiture.md => domains/content/rules/contenus-geolocalises.md} (100%) rename docs/{regles-metier/11-creation-publication-contenu.md => domains/content/rules/creation-publication.md} (100%) rename docs/{regles-metier/13-detection-contenu-protege.md => domains/content/rules/detection-contenu-protege.md} (100%) rename docs/{regles-metier/12-radio-live.md => domains/content/rules/radio-live.md} (100%) create mode 100644 docs/domains/moderation/README.md rename docs/{diagrammes/entites => domains/moderation/entities}/modele-moderation.md (97%) rename {features/admin/moderation => docs/domains/moderation/features/admin}/dashboard-moderateur.feature (100%) rename {features/admin/moderation => docs/domains/moderation/features/admin}/outils-moderateur.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/appel-droits-auteur.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/audit-trimestriel.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/badges-system.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/detection-patterns-suspects.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/limite-temporelle-anti-abus.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/moderation-communautaire.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/moderation-preventive.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/reduction-premium-badge-or.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/sanctions-abus-progressives.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/sanctions-droits-auteur.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/sanctions-notifications.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/score-fiabilite-priorisation.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/signalement-musique-posteriori.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/signalement.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/traitement-signalements.feature (100%) rename {features/api/moderation => docs/domains/moderation/features/api}/utilisateur-confiance.feature (100%) rename {features/ui/moderation => docs/domains/moderation/features/ui}/badges-statistiques.feature (100%) rename {features/ui/moderation => docs/domains/moderation/features/ui}/historique-signalements.feature (100%) rename {features/ui/moderation => docs/domains/moderation/features/ui}/modal-decouverte-badges.feature (100%) rename {features/ui/moderation => docs/domains/moderation/features/ui}/sanctions-appel.feature (100%) rename {features/ui/moderation => docs/domains/moderation/features/ui}/signalement-ui.feature (100%) rename docs/{diagrammes/flux => domains/moderation/flows}/moderation-signalement.md (98%) rename docs/{regles-metier/19-autres-comportements.md => domains/moderation/rules/autres-comportements.md} (100%) rename docs/{regles-metier/15-moderation-communautaire.md => domains/moderation/rules/moderation-communautaire.md} (100%) rename docs/{regles-metier/14-moderation-flows.md => domains/moderation/rules/moderation-flows.md} (100%) rename docs/{diagrammes/sequence => domains/moderation/sequences}/processus-appel-moderation.md (97%) rename docs/{diagrammes/etats => domains/moderation/states}/signalement-lifecycle.md (98%) create mode 100644 docs/domains/monetization/README.md rename docs/{diagrammes/entites => domains/monetization/entities}/modele-monetisation.md (94%) rename {features/api => docs/domains/monetization/features}/monetisation/conditions-activation.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/contenus-premium-exclusifs.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/desactivation-suspension.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/kyc-inscription.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/obligations-fiscales.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/paiement-createurs.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/soldes-dormants-inactifs.feature (100%) rename {features/api => docs/domains/monetization/features}/monetisation/sources-revenus.feature (100%) rename docs/{regles-metier/18-monetisation-createurs.md => domains/monetization/rules/monetisation-createurs.md} (100%) create mode 100644 docs/domains/premium/README.md rename docs/{diagrammes/entites => domains/premium/entities}/modele-premium.md (94%) rename {features/e2e => docs/domains/premium/features}/abonnements/audio-guides-pieton.feature (100%) rename {features/e2e => docs/domains/premium/features}/abonnements/impact-algorithme.feature (100%) rename {features/e2e => docs/domains/premium/features}/abonnements/limites-desabonnement.feature (100%) rename {features/e2e => docs/domains/premium/features}/abonnements/notifications-contextuelles.feature (100%) rename {features/ui => docs/domains/premium/features}/mode-offline/contenus-supprimes-pendant-offline.feature (100%) rename {features/ui => docs/domains/premium/features}/mode-offline/synchronisation-actions.feature (100%) rename {features/ui => docs/domains/premium/features}/mode-offline/telechargement.feature (100%) rename {features/ui => docs/domains/premium/features}/mode-offline/validite-renouvellement.feature (100%) rename {features/api => docs/domains/premium/features}/premium/avantages-premium.feature (100%) rename {features/api => docs/domains/premium/features}/premium/gestion-abonnement.feature (100%) rename {features/api => docs/domains/premium/features}/premium/multi-devices-dernier-priorite.feature (100%) rename {features/api => docs/domains/premium/features}/premium/multi-devices-detection.feature (100%) rename {features/api => docs/domains/premium/features}/premium/offre-tarification.feature (100%) rename {features/api => docs/domains/premium/features}/premium/stream-conflict-detection.feature (100%) rename {features/api => docs/domains/premium/features}/premium/tarification-multi-canal.feature (100%) rename {features/api => docs/domains/premium/features}/premium/webhooks-retry-paiement.feature (100%) rename docs/{regles-metier/09-abonnements-notifications.md => domains/premium/rules/abonnements-notifications.md} (100%) rename docs/{regles-metier/08-mode-offline.md => domains/premium/rules/mode-offline.md} (100%) rename docs/{regles-metier/17-premium.md => domains/premium/rules/premium.md} (100%) create mode 100644 docs/domains/recommendation/README.md rename docs/{diagrammes/entites => domains/recommendation/entities}/modele-recommandation.md (92%) rename {features/api => docs/domains/recommendation/features}/interest-gauges/degradation-temporelle.feature (100%) rename {features/api => docs/domains/recommendation/features}/interest-gauges/evolution-jauges.feature (100%) rename {features/api => docs/domains/recommendation/features}/interest-gauges/jauge-initiale.feature (100%) rename {features/api => docs/domains/recommendation/features}/interest-gauges/skip-abonnes-neutralisation.feature (100%) rename {features/ui => docs/domains/recommendation/features}/recherche/filtres-avances.feature (100%) rename {features/ui => docs/domains/recommendation/features}/recherche/page-resultats-carte.feature (100%) rename {features/ui => docs/domains/recommendation/features}/recherche/recherche.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/README.md (98%) rename {features/api => docs/domains/recommendation/features}/recommendation/classification-geo.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/contenu-politique.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/declenchement-geo.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/historique-reproposition.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/medias-traditionnels.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/mode-kids.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/parametrabilite-admin.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/parametrabilite-utilisateur.feature (100%) rename {features/api => docs/domains/recommendation/features}/recommendation/scoring-recommandation.feature (100%) rename {features/api => docs/domains/recommendation/features}/search/geolocation-search.feature (100%) rename docs/{regles-metier/04-algorithme-recommandation.md => domains/recommendation/rules/algorithme-recommandation.md} (100%) rename docs/{regles-metier/03-centres-interet-jauges.md => domains/recommendation/rules/centres-interet-jauges.md} (100%) rename docs/{regles-metier/05-interactions-navigation.md => domains/recommendation/rules/interactions-navigation.md} (100%) create mode 100644 docs/interfaces/README.md create mode 100644 docs/interfaces/assets/mobile/.gitkeep create mode 100644 docs/interfaces/assets/web/.gitkeep create mode 100644 docs/interfaces/mobile/navigation.md delete mode 100644 docs/regles-metier/README.md delete mode 100644 features/ui/interest-gauges/degradation-temporelle.feature delete mode 100644 features/ui/interest-gauges/evolution-jauges.feature delete mode 100644 features/ui/interest-gauges/jauge-initiale.feature delete mode 100644 features/ui/recommendation/filtrage-politique-ui.feature delete mode 100644 features/ui/recommendation/mode-kids-ui.feature delete mode 100644 features/ui/recommendation/notifications-geo.feature delete mode 100644 features/ui/recommendation/parametres-personnalisation.feature create mode 100755 scripts/fix-markdown-links.sh diff --git a/Makefile b/Makefile index 498fe8f..13200f7 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ test-integration: ## test-bdd: Run BDD tests (Godog) test-bdd: @echo "$(BLUE)Running BDD tests...$(NC)" - @godog run features/ + @godog run docs/domains/*/features/ ## test-coverage: Run tests with coverage report test-coverage: diff --git a/docs/REFACTOR-DDD.md b/docs/REFACTOR-DDD.md new file mode 100644 index 0000000..9cf176f --- /dev/null +++ b/docs/REFACTOR-DDD.md @@ -0,0 +1,370 @@ +# Plan de refactorisation : Organisation DDD de la documentation + +## 🎯 Objectif + +Réorganiser la documentation du projet selon les principes du **Domain-Driven Design (DDD)** pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. + +## 📊 Situation actuelle + +### Structure actuelle + +``` +docs/ +├── regles-metier/ # 19 fichiers numérotés 01-19 + ANNEXE +├── diagrammes/ # Organisés par type (flux, états, séquences, entités) +│ ├── flux/ +│ ├── etats/ +│ ├── sequence/ +│ └── entites/ +├── adr/ # Architecture Decision Records +├── legal/ # Documentation légale +└── interfaces/ # Interfaces UI +``` + +### Problèmes identifiés + +1. **Organisation séquentielle** : Numérotation 01-19 ne reflète pas les domaines métier +2. **Diagrammes dispersés** : Séparés des règles métier qu'ils illustrent +3. **Navigation complexe** : Difficile de trouver toute la doc d'un domaine +4. **Pas d'alignement code** : Structure docs ≠ structure `backend/internal/` +5. **Onboarding difficile** : Nouveau dev doit parcourir 19 fichiers linéairement +6. **Maintenance** : Règles métier, entités et diagrammes d'un même domaine sont éparpillés + +## 🎨 Architecture cible (DDD) + +### Nouvelle structure + +``` +docs/ +├── domains/ # 🆕 Organisation par domaine +│ ├── README.md # Context Map + Index domaines +│ │ +│ ├── _shared/ # Core Domain +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ ├── authentification.md +│ │ │ ├── rgpd.md +│ │ │ └── gestion-erreurs.md +│ │ ├── entities/ +│ │ │ └── modele-global.md +│ │ └── ubiquitous-language.md +│ │ +│ ├── recommendation/ # Bounded Context +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ ├── centres-interet-jauges.md +│ │ │ ├── algorithme-recommandation.md +│ │ │ └── interactions-navigation.md +│ │ ├── entities/ +│ │ │ └── modele-recommandation.md +│ │ ├── sequences/ +│ │ │ └── scoring-recommandation.md +│ │ └── features/ +│ │ └── *.feature +│ │ +│ ├── content/ # Bounded Context +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ ├── creation-publication.md +│ │ │ ├── audio-guides.md +│ │ │ ├── radio-live.md +│ │ │ ├── contenus-geolocalises.md +│ │ │ └── detection-contenu-protege.md +│ │ ├── entities/ +│ │ │ ├── modele-audio-guides.md +│ │ │ └── modele-radio-live.md +│ │ └── flows/ +│ │ +│ ├── advertising/ # Bounded Context +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ └── publicites.md +│ │ ├── entities/ +│ │ │ └── modele-publicites.md +│ │ ├── sequences/ +│ │ ├── states/ +│ │ └── flows/ +│ │ +│ ├── premium/ # Bounded Context +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ ├── premium.md +│ │ │ ├── mode-offline.md +│ │ │ └── abonnements-notifications.md +│ │ ├── entities/ +│ │ │ └── modele-premium.md +│ │ └── sequences/ +│ │ +│ ├── monetization/ # Bounded Context +│ │ ├── README.md +│ │ ├── rules/ +│ │ │ └── monetisation-createurs.md +│ │ ├── entities/ +│ │ │ └── modele-monetisation.md +│ │ └── flows/ +│ │ +│ └── moderation/ # Bounded Context +│ ├── README.md +│ ├── rules/ +│ │ ├── moderation-flows.md +│ │ ├── moderation-communautaire.md +│ │ └── autres-comportements.md +│ ├── entities/ +│ │ └── modele-moderation.md +│ ├── sequences/ +│ │ └── processus-appel-moderation.md +│ ├── states/ +│ │ └── signalement-lifecycle.md +│ ├── flows/ +│ │ └── moderation-signalement.md +│ └── features/ +│ +├── adr/ # Inchangé +├── legal/ # Inchangé +├── interfaces/ # Inchangé +└── technical.md # Inchangé +``` + +## 📋 Mapping des domaines + +### 7 Bounded Contexts identifiés + +| Domaine | Règles métier | Entités | Diagrammes | Responsabilité | +|---------|--------------|---------|------------|----------------| +| **_shared** | 01, 02, 10 | USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY | - | Authentification, RGPD, Gestion erreurs | +| **recommendation** | 03, 04, 05 | USER_INTERESTS, INTEREST_CATEGORIES | scoring-recommandation.md | Jauges, Algorithme, Navigation | +| **content** | 06, 07, 11, 12, 13 | AUDIO_GUIDES, LIVE_STREAMS, GUIDE_SEQUENCES, LIVE_RECORDINGS | - | Création, Audio-guides, Live, Détection droits | +| **advertising** | 16 | AD_CAMPAIGNS, AD_METRICS, AD_IMPRESSIONS | - | Campagnes, Ciblage, Métriques | +| **premium** | 08, 09, 17 | PREMIUM_SUBSCRIPTIONS, ACTIVE_STREAMS, OFFLINE_DOWNLOADS | - | Abonnements, Offline, Notifications | +| **monetization** | 18 | CREATOR_MONETIZATION, REVENUES, PAYOUTS | - | KYC, Revenus, Versements | +| **moderation** | 14, 15, 19 | REPORTS, SANCTIONS, APPEALS, STRIKES, BADGES | processus-appel-moderation.md, signalement-lifecycle.md, moderation-signalement.md | Signalements, Sanctions, Badges | + +## 🗺️ Plan de migration détaillé + +### Phase 1 : Créer la structure cible + +```bash +# Créer l'arborescence +mkdir -p docs/domains/{_shared,recommendation,content,advertising,premium,monetization,moderation}/{rules,entities,sequences,states,flows,features} +``` + +### Phase 2 : Déplacer les règles métier + +| Fichier actuel | Destination | +|----------------|-------------| +| `01-authentification-inscription.md` | `domains/_shared/rules/authentification.md` | +| `02-conformite-rgpd.md` | `domains/_shared/rules/rgpd.md` | +| `03-centres-interet-jauges.md` | `domains/recommendation/rules/centres-interet-jauges.md` | +| `04-algorithme-recommandation.md` | `domains/recommendation/rules/algorithme-recommandation.md` | +| `05-interactions-navigation.md` | `domains/recommendation/rules/interactions-navigation.md` | +| `06-audio-guides-multi-sequences.md` | `domains/content/rules/audio-guides.md` | +| `07-contenus-geolocalises-voiture.md` | `domains/content/rules/contenus-geolocalises.md` | +| `08-mode-offline.md` | `domains/premium/rules/mode-offline.md` | +| `09-abonnements-notifications.md` | `domains/premium/rules/abonnements-notifications.md` | +| `10-gestion-erreurs.md` | `domains/_shared/rules/gestion-erreurs.md` | +| `11-creation-publication-contenu.md` | `domains/content/rules/creation-publication.md` | +| `12-radio-live.md` | `domains/content/rules/radio-live.md` | +| `13-detection-contenu-protege.md` | `domains/content/rules/detection-contenu-protege.md` | +| `14-moderation-flows.md` | `domains/moderation/rules/moderation-flows.md` | +| `15-moderation-communautaire.md` | `domains/moderation/rules/moderation-communautaire.md` | +| `16-publicites.md` | `domains/advertising/rules/publicites.md` | +| `17-premium.md` | `domains/premium/rules/premium.md` | +| `18-monetisation-createurs.md` | `domains/monetization/rules/monetisation-createurs.md` | +| `19-autres-comportements.md` | `domains/moderation/rules/autres-comportements.md` | +| `ANNEXE-POST-MVP.md` | `domains/_shared/rules/ANNEXE-POST-MVP.md` | + +### Phase 3 : Déplacer les diagrammes d'entités + +| Fichier actuel | Destination | +|----------------|-------------| +| `diagrammes/entites/modele-global.md` | `domains/_shared/entities/modele-global.md` | +| `diagrammes/entites/modele-recommandation.md` | `domains/recommendation/entities/modele-recommandation.md` | +| `diagrammes/entites/modele-audio-guides.md` | `domains/content/entities/modele-audio-guides.md` | +| `diagrammes/entites/modele-radio-live.md` | `domains/content/entities/modele-radio-live.md` | +| `diagrammes/entites/modele-publicites.md` | `domains/advertising/entities/modele-publicites.md` | +| `diagrammes/entites/modele-premium.md` | `domains/premium/entities/modele-premium.md` | +| `diagrammes/entites/modele-monetisation.md` | `domains/monetization/entities/modele-monetisation.md` | +| `diagrammes/entites/modele-moderation.md` | `domains/moderation/entities/modele-moderation.md` | + +### Phase 4 : Déplacer les autres diagrammes + +| Fichier actuel | Destination | +|----------------|-------------| +| `diagrammes/flux/moderation-signalement.md` | `domains/moderation/flows/moderation-signalement.md` | +| `diagrammes/etats/signalement-lifecycle.md` | `domains/moderation/states/signalement-lifecycle.md` | +| `diagrammes/sequence/processus-appel-moderation.md` | `domains/moderation/sequences/processus-appel-moderation.md` | + +### Phase 5 : Créer les README.md de domaine + +Créer un README.md dans chaque domaine avec le template suivant : + +```markdown +# Domaine : [Nom] + +## Vue d'ensemble +[Description du bounded context] + +## Responsabilités +- Responsabilité 1 +- Responsabilité 2 + +## Règles métier +- [Règle 1](rules/xxx.md) + +## Modèle de données +- [Diagramme entités](entities/modele-xxx.md) + +## Diagrammes +- [Flux](flows/xxx.md) +- [États](states/xxx.md) +- [Séquences](sequences/xxx.md) + +## Tests BDD +- [Feature 1](features/xxx.feature) + +## Dépendances +- ✅ Dépend de : `_shared` +- ⚠️ Interactions avec : `moderation` + +## Ubiquitous Language +**Termes métier spécifiques au domaine** +``` + +### Phase 6 : Déplacer les features Gherkin + +```bash +# Les features actuellement dans /features/ root +mv features/api/recommendation/* domains/recommendation/features/ +mv features/moderation/* domains/moderation/features/ +# etc. +``` + +### Phase 7 : Créer le Context Map + +Créer `docs/domains/README.md` avec la cartographie des domaines : + +```markdown +# Context Map RoadWave + +## Vue d'ensemble des domaines + +[Diagramme Mermaid des relations entre bounded contexts] + +## Bounded Contexts + +### Core Domain +- **_shared** : Authentification, RGPD, Gestion erreurs + +### Supporting Subdomains +- **recommendation** : Jauges, Algorithme, Scoring +- **content** : Création, Audio-guides, Live +- **moderation** : Signalements, Sanctions, Badges + +### Generic Subdomains +- **advertising** : Campagnes publicitaires +- **premium** : Abonnements, Offline +- **monetization** : Revenus créateurs +``` + +### Phase 8 : Mettre à jour mkdocs.yml + +Réorganiser la navigation MkDocs pour refléter la nouvelle structure par domaine. + +### Phase 9 : Mettre à jour les liens internes + +Corriger tous les liens relatifs dans les fichiers markdown pour pointer vers les nouvelles locations. + +### Phase 10 : Nettoyer l'ancienne structure + +```bash +# Une fois tout migré et testé +rm -rf docs/regles-metier/ +rm -rf docs/diagrammes/ +``` + +## ✅ Avantages attendus + +1. **Cohésion forte** : Toute la doc d'un domaine au même endroit +2. **Couplage faible** : Domaines indépendants, dépendances explicites +3. **Navigabilité améliorée** : README par domaine = entrée claire +4. **Alignement code/docs** : Miroir de `backend/internal/` +5. **Onboarding facilité** : Nouveau dev explore domaine par domaine +6. **Maintenance simplifiée** : Modifier un domaine sans toucher aux autres +7. **Scalabilité** : Facile d'ajouter un nouveau domaine +8. **Tests BDD intégrés** : Features au plus près des règles métier + +## ⚠️ Risques et précautions + +### Risques identifiés + +1. **Liens cassés** : Nombreux liens internes à corriger +2. **Confusion temporaire** : Équipe doit s'adapter à la nouvelle structure +3. **MkDocs rebuild** : Navigation complète à refaire +4. **Features Gherkin** : Potentiellement beaucoup de fichiers à déplacer + +### Précautions + +1. ✅ **Créer ce plan d'abord** : Validation avant exécution +2. ✅ **Branch dédiée** : `refactor/ddd-documentation` +3. ✅ **Commits atomiques** : Un commit par phase +4. ✅ **Tests continus** : Vérifier MkDocs build après chaque phase +5. ✅ **Backup** : Garder ancienne structure jusqu'à validation complète +6. ✅ **Script automatisé** : Créer script pour les déplacements et corrections de liens + +## 📝 Checklist d'exécution + +- [ ] Valider ce plan avec l'équipe +- [ ] Créer branch `refactor/ddd-documentation` +- [ ] Phase 1 : Créer arborescence +- [ ] Phase 2 : Déplacer règles métier +- [ ] Phase 3 : Déplacer diagrammes entités +- [ ] Phase 4 : Déplacer autres diagrammes +- [ ] Phase 5 : Créer README.md domaines +- [ ] Phase 6 : Déplacer features Gherkin +- [ ] Phase 7 : Créer Context Map +- [ ] Phase 8 : Mettre à jour mkdocs.yml +- [ ] Phase 9 : Corriger liens internes +- [ ] Phase 10 : Nettoyer ancienne structure +- [ ] Tester build MkDocs +- [ ] Valider avec équipe +- [ ] Merger dans main + +## 🚀 Script d'automatisation suggéré + +```bash +#!/bin/bash +# scripts/refactor-ddd.sh + +# Phase 1 : Créer structure +echo "Phase 1: Création structure..." +mkdir -p docs/domains/{_shared,recommendation,content,advertising,premium,monetization,moderation}/{rules,entities,sequences,states,flows,features} + +# Phase 2 : Déplacer règles métier +echo "Phase 2: Migration règles métier..." +git mv docs/regles-metier/01-authentification-inscription.md docs/domains/_shared/rules/authentification.md +# ... etc pour tous les fichiers + +# Phase 3-4 : Déplacer diagrammes +echo "Phase 3-4: Migration diagrammes..." +git mv docs/diagrammes/entites/modele-global.md docs/domains/_shared/entities/modele-global.md +# ... etc + +# Phase 9 : Corriger liens (sed ou script Python) +echo "Phase 9: Correction liens..." +find docs/domains -name "*.md" -exec sed -i 's|../../regles-metier/|../rules/|g' {} \; +# ... etc + +echo "Migration terminée!" +``` + +## 📚 Références DDD + +- [Domain-Driven Design - Eric Evans](https://www.domainlanguage.com/ddd/) +- [Bounded Context - Martin Fowler](https://martinfowler.com/bliki/BoundedContext.html) +- [Context Mapping](https://github.com/ddd-crew/context-mapping) + +--- + +**Date de création** : 2026-02-07 +**Statut** : 🟡 En attente de validation +**Auteur** : Documentation refactoring initiative diff --git a/docs/adr/008-authentification.md b/docs/adr/008-authentification.md index 3d0ce8a..dc7bad6 100644 --- a/docs/adr/008-authentification.md +++ b/docs/adr/008-authentification.md @@ -23,7 +23,7 @@ RoadWave nécessite un système d'authentification sécurisé pour mobile (iOS/A - Base de données PostgreSQL partagée avec RoadWave (séparation logique par schéma) - Aucune donnée d'authentification ne transite par des serveurs tiers -> 📋 **Clarification** : OAuth2 PKCE est le **protocole technique** utilisé entre l'app mobile et Zitadel. Ce n'est **PAS** pour des fournisseurs tiers. L'authentification reste 100% email/password native (voir [Règle 01](../regles-metier/01-authentification-inscription.md#11-méthodes-dinscription)). +> 📋 **Clarification** : OAuth2 PKCE est le **protocole technique** utilisé entre l'app mobile et Zitadel. Ce n'est **PAS** pour des fournisseurs tiers. L'authentification reste 100% email/password native (voir [Règle 01](../domains/_shared/rules/authentification.md#11-méthodes-dinscription)). ## Alternatives considérées @@ -112,7 +112,7 @@ graph TB - Zitadel implémente OAuth2/OIDC comme **protocole**, mais l'auth reste email/password - Alternative serait session cookies (moins adapté mobile) ou JWT custom (réinventer la roue) -> 📋 **Référence** : Voir [Règle 01 - Méthodes d'Inscription](../regles-metier/01-authentification-inscription.md#11-méthodes-dinscription) pour la décision métier. +> 📋 **Référence** : Voir [Règle 01 - Méthodes d'Inscription](../domains/_shared/rules/authentification.md#11-méthodes-dinscription) pour la décision métier. ## Exemple d'intégration diff --git a/docs/adr/012-frontend-mobile.md b/docs/adr/012-frontend-mobile.md index 50289f0..6e32770 100644 --- a/docs/adr/012-frontend-mobile.md +++ b/docs/adr/012-frontend-mobile.md @@ -205,8 +205,8 @@ Le service de gestion des permissions (`lib/core/services/location_permission_se ### Documentation Associée - **Guide détaillé** : [/docs/mobile/permissions-strategy.md](../mobile/permissions-strategy.md) -- **Règles métier** : [Règle 05 - Mode Piéton](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides) -- **RGPD** : [Règle 02 - Conformité RGPD](../regles-metier/02-conformite-rgpd.md) +- **Règles métier** : [Règle 05 - Mode Piéton](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides) +- **RGPD** : [Règle 02 - Conformité RGPD](../domains/_shared/rules/rgpd.md) --- diff --git a/docs/adr/019-geolocalisation-ip.md b/docs/adr/019-geolocalisation-ip.md index e2d546a..f77113a 100644 --- a/docs/adr/019-geolocalisation-ip.md +++ b/docs/adr/019-geolocalisation-ip.md @@ -114,5 +114,5 @@ flowchart TD - [ADR-004 : CDN (Souveraineté)](004-cdn.md) - [ADR-015 : Hébergement](015-hebergement.md) -- [Règle 02 : RGPD (Mode Dégradé)](../regles-metier/02-conformite-rgpd.md#136-géolocalisation-optionnelle) +- [Règle 02 : RGPD (Mode Dégradé)](../domains/_shared/rules/rgpd.md#136-géolocalisation-optionnelle) - IP2Location Lite : https://lite.ip2location.com/ diff --git a/docs/adr/023-architecture-moderation.md b/docs/adr/023-architecture-moderation.md index 9cafc5f..8bcc7bb 100644 --- a/docs/adr/023-architecture-moderation.md +++ b/docs/adr/023-architecture-moderation.md @@ -6,7 +6,7 @@ ## Contexte Le système de modération RoadWave doit traiter des signalements de contenu audio problématique (haine, spam, droits d'auteur, etc.) avec : -- **SLA stricts** : 2h (critique), 24h (haute), 72h (standard) définis dans [Règle 14](../regles-metier/14-moderation-flows.md) +- **SLA stricts** : 2h (critique), 24h (haute), 72h (standard) définis dans [Règle 14](../domains/moderation/rules/moderation-flows.md) - **Scalabilité** : 0-10K+ signalements/mois - **Conformité DSA** : transparence, traçabilité, délais garantis - **Efficacité** : pré-filtrage IA pour priorisation automatique @@ -193,12 +193,12 @@ graph TB 1. Migration Redis Streams si >1000 signalements/jour 2. GPU pour Whisper si latence >15 min P95 3. NLP avancé (distilbert + roberta) -4. Modération communautaire (badges, [Règle 15](../regles-metier/15-moderation-communautaire.md)) +4. Modération communautaire (badges, [Règle 15](../domains/moderation/rules/moderation-communautaire.md)) ## Références -- [Règle 14 : Modération - Flows opérationnels](../regles-metier/14-moderation-flows.md) -- [Règle 15 : Modération Communautaire](../regles-metier/15-moderation-communautaire.md) +- [Règle 14 : Modération - Flows opérationnels](../domains/moderation/rules/moderation-flows.md) +- [Règle 15 : Modération Communautaire](../domains/moderation/rules/moderation-communautaire.md) - [ADR-001 : Langage Backend](001-langage-backend.md) (Go, Fiber) - [ADR-005 : Base de données](005-base-de-donnees.md) (PostgreSQL) - [ADR-010 : Architecture Backend](010-architecture-backend.md) (Modular monolith) diff --git a/docs/adr/025-securite-secrets.md b/docs/adr/025-securite-secrets.md index 0bd995b..56dae06 100644 --- a/docs/adr/025-securite-secrets.md +++ b/docs/adr/025-securite-secrets.md @@ -100,7 +100,7 @@ graph TB ### Encryption PII (Field-level) **Données chiffrées** (AES-256-GCM) : -- **GPS précis** : lat/lon conservés 24h puis réduits à geohash-5 (~5km²) ([Règle 02](../regles-metier/02-conformite-rgpd.md)) +- **GPS précis** : lat/lon conservés 24h puis réduits à geohash-5 (~5km²) ([Règle 02](../domains/_shared/rules/rgpd.md)) - **Email** : chiffré en base, déchiffré uniquement à l'envoi - **Numéro téléphone** : si ajouté (Phase 2) @@ -270,7 +270,7 @@ graph TB - [ADR-011 : Accès données](011-orm-acces-donnees.md) (sqlc, prepared statements) - [ADR-015 : Hébergement](015-hebergement.md) (OVH France, souveraineté) - [ADR-024 : Monitoring](024-monitoring-observabilite.md) (Audit logs) -- [Règle 02 : Conformité RGPD](../regles-metier/02-conformite-rgpd.md) +- [Règle 02 : Conformité RGPD](../domains/_shared/rules/rgpd.md) - [HashiCorp Vault Documentation](https://www.vaultproject.io/docs) - [OWASP Top 10 2021](https://owasp.org/Top10/) - [NIST SP 800-175B (Cryptography)](https://csrc.nist.gov/publications/detail/sp/800-175b/final) diff --git a/docs/architecture/sequences/cache-geospatial.md b/docs/architecture/sequences/cache-geospatial.md index c1abf1a..bd0ae2a 100644 --- a/docs/architecture/sequences/cache-geospatial.md +++ b/docs/architecture/sequences/cache-geospatial.md @@ -316,4 +316,5 @@ Score final = - [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 : Découverte de contenu géolocalisé](../../regles-metier/03-decouverte-contenu.md) +- [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/compliance/stores-submission.md b/docs/compliance/stores-submission.md index 54a1a25..4cc9e17 100644 --- a/docs/compliance/stores-submission.md +++ b/docs/compliance/stores-submission.md @@ -84,7 +84,7 @@ RoadWave est une app audio géolocalisée utilisée en conduite (CarPlay/Android - In-app disclosure obligatoire avant demande "Always" - Flux two-step : When In Use → Always (si user active mode piéton) - Si refusée : app fonctionne en mode voiture uniquement -- **Action** : Voir strings détaillés dans [05-interactions-navigation.md](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides) +- **Action** : Voir strings détaillés dans [05-interactions-navigation.md](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides) ### Revenus créateurs diff --git a/docs/domains/README.md b/docs/domains/README.md new file mode 100644 index 0000000..9aab158 --- /dev/null +++ b/docs/domains/README.md @@ -0,0 +1,249 @@ +# Context Map RoadWave + +## Vue d'ensemble + +RoadWave est organisé selon les principes du **Domain-Driven Design (DDD)** avec **7 bounded contexts** clairs. Cette architecture modulaire permet une meilleure séparation des préoccupations, facilite la maintenance et l'évolution du système. + +## Architecture des domaines + +```mermaid +graph TB + subgraph "Core Domain" + SHARED[_shared
Authentification, RGPD, Erreurs] + end + + subgraph "Supporting Subdomains" + RECO[recommendation
Jauges & Algorithme] + CONTENT[content
Audio-guides & Live] + MODERATION[moderation
Signalements & Sanctions] + end + + subgraph "Generic Subdomains" + ADS[advertising
Publicités] + PREMIUM[premium
Abonnements] + MONETIZATION[monetization
Monétisation créateurs] + end + + %% Dépendances principales + RECO --> SHARED + RECO --> CONTENT + CONTENT --> SHARED + ADS --> SHARED + ADS --> RECO + PREMIUM --> SHARED + PREMIUM --> CONTENT + MONETIZATION --> SHARED + MONETIZATION --> CONTENT + MONETIZATION --> ADS + MONETIZATION --> PREMIUM + MODERATION --> SHARED + MODERATION --> CONTENT + + %% Relations anti-corruption + ADS -.-|bloqué par| PREMIUM + MODERATION -.->|peut démonétiser| MONETIZATION +``` + +## Bounded Contexts + +### Core Domain + +#### 🔐 [_shared](/_shared/) +**Responsabilité** : Fonctionnalités transversales essentielles + +- Authentification et inscription via Zitadel +- Conformité RGPD (consentements, suppression données) +- Gestion cohérente des erreurs +- Entités centrales : `USERS`, `CONTENTS`, `SUBSCRIPTIONS`, `LISTENING_HISTORY` + +**Utilisé par** : Tous les autres domaines + +--- + +### Supporting Subdomains + +#### 🎯 [recommendation](/recommendation/) +**Responsabilité** : Recommandation géolocalisée de contenus + +- Jauges de centres d'intérêt (scores dynamiques 0-100) +- Algorithme de scoring (distance + affinité) +- Adaptation selon interactions utilisateur +- Entités : `USER_INTERESTS`, `INTEREST_CATEGORIES` + +**Dépend de** : `_shared`, `content` + +**Ubiquitous Language** : Interest Gauge, Recommendation Score, Geographic Priority, Interest Decay + +--- + +#### 🎙️ [content](/content/) +**Responsabilité** : Création et diffusion de contenus audio + +- Audio-guides multi-séquences géolocalisés +- Radio live et enregistrements +- Contenus géolocalisés pour voiture/piéton +- Détection de contenu protégé (droits d'auteur) +- Entités : `AUDIO_GUIDES`, `LIVE_STREAMS`, `GUIDE_SEQUENCES`, `LIVE_RECORDINGS` + +**Dépend de** : `_shared` + +**Interagit avec** : `moderation` (modération), `monetization` (revenus) + +**Ubiquitous Language** : Audio Guide, Guide Sequence, Live Stream, Geofence, Content Fingerprint + +--- + +#### 🛡️ [moderation](/moderation/) +**Responsabilité** : Modération et sécurité de la plateforme + +- Workflow de traitement des signalements +- Système de strikes et sanctions +- Processus d'appel +- Badges de confiance créateurs +- Modération communautaire +- Entités : `REPORTS`, `SANCTIONS`, `APPEALS`, `STRIKES`, `BADGES` + +**Dépend de** : `_shared`, `content` + +**Peut affecter** : `monetization` (démonétisation) + +**Ubiquitous Language** : Report, Strike, Sanction, Appeal, Trust Badge, Community Moderation + +--- + +### Generic Subdomains + +#### 📢 [advertising](/advertising/) +**Responsabilité** : Publicités audio géociblées + +- Campagnes publicitaires +- Ciblage géographique et par intérêts +- Métriques (impressions, CPM) +- Insertion dynamique dans flux audio +- Entités : `AD_CAMPAIGNS`, `AD_METRICS`, `AD_IMPRESSIONS` + +**Dépend de** : `_shared`, `recommendation` (ciblage) + +**Bloqué par** : `premium` (pas de pub pour abonnés) + +**Ubiquitous Language** : Ad Campaign, Ad Impression, CPM, Ad Targeting, Skip Rate + +--- + +#### 💎 [premium](/premium/) +**Responsabilité** : Abonnements et fonctionnalités premium + +- Abonnements payants (mensuel/annuel) +- Mode offline (téléchargement, synchro) +- Notifications personnalisées +- Avantages : sans pub, qualité audio supérieure +- Entités : `PREMIUM_SUBSCRIPTIONS`, `ACTIVE_STREAMS`, `OFFLINE_DOWNLOADS` + +**Dépend de** : `_shared`, `content` + +**Bloque** : `advertising` (désactivation pubs) + +**Ubiquitous Language** : Premium Subscription, Offline Download, Sync Queue, Premium Tier, Auto-Renewal + +--- + +#### 💰 [monetization](/monetization/) +**Responsabilité** : Monétisation des créateurs + +- KYC (vérification identité) +- Calcul des revenus (pub + abonnements) +- Versements mensuels via Mangopay +- Tableaux de bord revenus +- Entités : `CREATOR_MONETIZATION`, `REVENUES`, `PAYOUTS` + +**Dépend de** : `_shared`, `content`, `advertising`, `premium` + +**Affecté par** : `moderation` (démonétisation en cas de sanction) + +**Ubiquitous Language** : Revenue Share, KYC Verification, Payout, Minimum Threshold + +--- + +## Relations entre domaines + +### Upstream/Downstream + +| Upstream (Fournisseur) | Downstream (Consommateur) | Type de relation | +|------------------------|---------------------------|------------------| +| `_shared` | Tous | **Kernel partagé** | +| `content` | `recommendation` | **Customer/Supplier** | +| `recommendation` | `advertising` | **Customer/Supplier** | +| `premium` | `advertising` | **Anti-Corruption Layer** | + +### Événements de domaine + +Les domaines communiquent via des événements métier : + +- **UserRegistered** (`_shared` → tous) : Nouvel utilisateur +- **ContentPublished** (`content` → `recommendation`, `moderation`) : Nouveau contenu +- **InterestGaugeUpdated** (`recommendation` → `advertising`) : Mise à jour jauges +- **UserBanned** (`moderation` → `monetization`) : Bannissement utilisateur +- **SubscriptionActivated** (`premium` → `advertising`) : Activation premium + +## Structure de la documentation + +Chaque domaine suit cette organisation : + +``` +domains// +├── README.md # Vue d'ensemble du domaine +├── rules/ # Règles métier (*.md) +├── entities/ # Diagrammes entités (*.md) +├── sequences/ # Diagrammes séquences (*.md) +├── states/ # Diagrammes états (*.md) +├── flows/ # Diagrammes flux (*.md) +└── features/ # Tests BDD Gherkin (*.feature) +``` + +## Navigation + +- [📖 Règles métier par numéro](../regles-metier/) *(structure legacy, déprécié)* +- [🏛️ ADR (Architecture Decision Records)](../adr/) +- [⚖️ Documentation légale](../legal/) +- [🖥️ Interfaces UI](../interfaces/) +- [🔧 Documentation technique](../technical.md) + +## Ubiquitous Language Global + +**Termes transversaux utilisés dans tous les domaines** : + +- **User** : Utilisateur (auditeur, créateur, ou les deux) +- **Content** : Contenu audio diffusé sur la plateforme +- **Creator** : Utilisateur créant du contenu +- **Geolocation** : Position GPS de l'utilisateur +- **Stream** : Flux de lecture audio +- **Subscription** : Abonnement (à un créateur ou à premium) +- **Interest** : Centre d'intérêt (automobile, voyage, musique, etc.) + +## Principes d'architecture + +1. **Bounded Contexts clairs** : Chaque domaine a des limites bien définies +2. **Autonomie des domaines** : Chaque domaine peut évoluer indépendamment +3. **Communication asynchrone** : Préférence pour les événements vs appels directs +4. **Anti-Corruption Layer** : Protection contre les changements externes +5. **Alignment code/docs** : Structure docs ↔ structure `backend/internal/` + +## Alignement avec le code backend + +``` +backend/internal/ docs/domains/ +├── auth/ ←→ _shared/ +├── user/ ←→ _shared/ +├── content/ ←→ content/ +├── geo/ ←→ recommendation/ +├── streaming/ ←→ content/ +├── moderation/ ←→ moderation/ +├── payment/ ←→ monetization/ +└── analytics/ ←→ recommendation/ +``` + +--- + +**Dernière mise à jour** : 2026-02-07 +**Statut** : ✅ Active +**Auteur** : Documentation DDD initiative diff --git a/docs/domains/_shared/README.md b/docs/domains/_shared/README.md new file mode 100644 index 0000000..1ee645e --- /dev/null +++ b/docs/domains/_shared/README.md @@ -0,0 +1,37 @@ +# Domaine : Shared (Core Domain) + +## Vue d'ensemble + +Le domaine **Shared** constitue le **Core Domain** de RoadWave. Il contient les fonctionnalités transversales essentielles utilisées par tous les autres bounded contexts de l'application. + +## Responsabilités + +- **Authentification et inscription** : Gestion des comptes utilisateurs, connexion, inscription +- **Conformité RGPD** : Respect de la vie privée, consentements, suppression des données +- **Gestion des erreurs** : Traitement cohérent des erreurs à travers toute l'application + +## Règles métier + +- [Authentification et inscription](rules/authentification.md) +- [Conformité RGPD](rules/rgpd.md) +- [Gestion des erreurs](rules/gestion-erreurs.md) +- [Annexe Post-MVP](rules/ANNEXE-POST-MVP.md) + +## Modèle de données + +- [Diagramme entités globales](entities/../entities/modele-global.md) - Entités centrales : USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY + +## Ubiquitous Language + +**Termes métier du domaine partagé** : +- **User** : Utilisateur de la plateforme (auditeur, créateur, ou les deux) +- **Content** : Tout contenu audio diffusé sur la plateforme +- **Subscription** : Abonnement d'un utilisateur à un créateur ou une catégorie +- **Listening History** : Historique d'écoute d'un utilisateur +- **Authentication** : Processus de vérification de l'identité via Zitadel +- **RGPD Consent** : Consentement explicite pour le traitement des données personnelles + +## Dépendances + +- ✅ Utilisé par : **tous les autres domaines** +- ⚠️ Dépend de : aucun (Core Domain) diff --git a/docs/diagrammes/entites/modele-global.md b/docs/domains/_shared/entities/modele-global.md similarity index 100% rename from docs/diagrammes/entites/modele-global.md rename to docs/domains/_shared/entities/modele-global.md diff --git a/features/api/authentication/appareil-confiance-2fa.feature b/docs/domains/_shared/features/authentication/appareil-confiance-2fa.feature similarity index 100% rename from features/api/authentication/appareil-confiance-2fa.feature rename to docs/domains/_shared/features/authentication/appareil-confiance-2fa.feature diff --git a/features/api/authentication/classification-age.feature b/docs/domains/_shared/features/authentication/classification-age.feature similarity index 100% rename from features/api/authentication/classification-age.feature rename to docs/domains/_shared/features/authentication/classification-age.feature diff --git a/features/api/authentication/connexion.feature b/docs/domains/_shared/features/authentication/connexion.feature similarity index 100% rename from features/api/authentication/connexion.feature rename to docs/domains/_shared/features/authentication/connexion.feature diff --git a/features/api/authentication/gestion-compte.feature b/docs/domains/_shared/features/authentication/gestion-compte.feature similarity index 100% rename from features/api/authentication/gestion-compte.feature rename to docs/domains/_shared/features/authentication/gestion-compte.feature diff --git a/features/api/authentication/inscription.feature b/docs/domains/_shared/features/authentication/inscription.feature similarity index 100% rename from features/api/authentication/inscription.feature rename to docs/domains/_shared/features/authentication/inscription.feature diff --git a/features/api/authentication/limite-tentatives-connexion.feature b/docs/domains/_shared/features/authentication/limite-tentatives-connexion.feature similarity index 100% rename from features/api/authentication/limite-tentatives-connexion.feature rename to docs/domains/_shared/features/authentication/limite-tentatives-connexion.feature diff --git a/features/api/authentication/multi-device-sessions.feature b/docs/domains/_shared/features/authentication/multi-device-sessions.feature similarity index 100% rename from features/api/authentication/multi-device-sessions.feature rename to docs/domains/_shared/features/authentication/multi-device-sessions.feature diff --git a/features/api/authentication/recuperation-compte.feature b/docs/domains/_shared/features/authentication/recuperation-compte.feature similarity index 100% rename from features/api/authentication/recuperation-compte.feature rename to docs/domains/_shared/features/authentication/recuperation-compte.feature diff --git a/features/api/authentication/recuperation-mot-passe-avancee.feature b/docs/domains/_shared/features/authentication/recuperation-mot-passe-avancee.feature similarity index 100% rename from features/api/authentication/recuperation-mot-passe-avancee.feature rename to docs/domains/_shared/features/authentication/recuperation-mot-passe-avancee.feature diff --git a/features/api/authentication/sessions-tokens.feature b/docs/domains/_shared/features/authentication/sessions-tokens.feature similarity index 100% rename from features/api/authentication/sessions-tokens.feature rename to docs/domains/_shared/features/authentication/sessions-tokens.feature diff --git a/features/api/authentication/two-factor-authentication.feature b/docs/domains/_shared/features/authentication/two-factor-authentication.feature similarity index 100% rename from features/api/authentication/two-factor-authentication.feature rename to docs/domains/_shared/features/authentication/two-factor-authentication.feature diff --git a/features/api/authentication/validation-mot-passe.feature b/docs/domains/_shared/features/authentication/validation-mot-passe.feature similarity index 100% rename from features/api/authentication/validation-mot-passe.feature rename to docs/domains/_shared/features/authentication/validation-mot-passe.feature diff --git a/features/api/authentication/verification-email.feature b/docs/domains/_shared/features/authentication/verification-email.feature similarity index 100% rename from features/api/authentication/verification-email.feature rename to docs/domains/_shared/features/authentication/verification-email.feature diff --git a/features/e2e/error-handling/aucun-contenu-disponible.feature b/docs/domains/_shared/features/error-handling/aucun-contenu-disponible.feature similarity index 100% rename from features/e2e/error-handling/aucun-contenu-disponible.feature rename to docs/domains/_shared/features/error-handling/aucun-contenu-disponible.feature diff --git a/features/e2e/error-handling/contenu-supprime-pendant-ecoute.feature b/docs/domains/_shared/features/error-handling/contenu-supprime-pendant-ecoute.feature similarity index 100% rename from features/e2e/error-handling/contenu-supprime-pendant-ecoute.feature rename to docs/domains/_shared/features/error-handling/contenu-supprime-pendant-ecoute.feature diff --git a/features/e2e/error-handling/geolocalisation-desactivee.feature b/docs/domains/_shared/features/error-handling/geolocalisation-desactivee.feature similarity index 100% rename from features/e2e/error-handling/geolocalisation-desactivee.feature rename to docs/domains/_shared/features/error-handling/geolocalisation-desactivee.feature diff --git a/features/e2e/error-handling/perte-reseau.feature b/docs/domains/_shared/features/error-handling/perte-reseau.feature similarity index 100% rename from features/e2e/error-handling/perte-reseau.feature rename to docs/domains/_shared/features/error-handling/perte-reseau.feature diff --git a/features/ui/partage/partage-contenu-premium.feature b/docs/domains/_shared/features/partage/partage-contenu-premium.feature similarity index 100% rename from features/ui/partage/partage-contenu-premium.feature rename to docs/domains/_shared/features/partage/partage-contenu-premium.feature diff --git a/features/ui/partage/partage-contenu.feature b/docs/domains/_shared/features/partage/partage-contenu.feature similarity index 100% rename from features/ui/partage/partage-contenu.feature rename to docs/domains/_shared/features/partage/partage-contenu.feature diff --git a/features/api/profil/badge-verifie.feature b/docs/domains/_shared/features/profil/badge-verifie.feature similarity index 100% rename from features/api/profil/badge-verifie.feature rename to docs/domains/_shared/features/profil/badge-verifie.feature diff --git a/features/ui/profil/profil-createur.feature b/docs/domains/_shared/features/profil/profil-createur.feature similarity index 100% rename from features/ui/profil/profil-createur.feature rename to docs/domains/_shared/features/profil/profil-createur.feature diff --git a/features/ui/profil/statistiques-arrondies.feature b/docs/domains/_shared/features/profil/statistiques-arrondies.feature similarity index 100% rename from features/ui/profil/statistiques-arrondies.feature rename to docs/domains/_shared/features/profil/statistiques-arrondies.feature diff --git a/features/api/rgpd-compliance/anonymisation-gps.feature b/docs/domains/_shared/features/rgpd-compliance/anonymisation-gps.feature similarity index 100% rename from features/api/rgpd-compliance/anonymisation-gps.feature rename to docs/domains/_shared/features/rgpd-compliance/anonymisation-gps.feature diff --git a/features/api/rgpd-compliance/compliance-administrative.feature b/docs/domains/_shared/features/rgpd-compliance/compliance-administrative.feature similarity index 100% rename from features/api/rgpd-compliance/compliance-administrative.feature rename to docs/domains/_shared/features/rgpd-compliance/compliance-administrative.feature diff --git a/features/api/rgpd-compliance/consentement.feature b/docs/domains/_shared/features/rgpd-compliance/consentement.feature similarity index 100% rename from features/api/rgpd-compliance/consentement.feature rename to docs/domains/_shared/features/rgpd-compliance/consentement.feature diff --git a/features/api/rgpd-compliance/conservation-donnees.feature b/docs/domains/_shared/features/rgpd-compliance/conservation-donnees.feature similarity index 100% rename from features/api/rgpd-compliance/conservation-donnees.feature rename to docs/domains/_shared/features/rgpd-compliance/conservation-donnees.feature diff --git a/features/api/rgpd-compliance/cookies-analytics.feature b/docs/domains/_shared/features/rgpd-compliance/cookies-analytics.feature similarity index 100% rename from features/api/rgpd-compliance/cookies-analytics.feature rename to docs/domains/_shared/features/rgpd-compliance/cookies-analytics.feature diff --git a/features/api/rgpd-compliance/mode-degrade-geoip.feature b/docs/domains/_shared/features/rgpd-compliance/mode-degrade-geoip.feature similarity index 100% rename from features/api/rgpd-compliance/mode-degrade-geoip.feature rename to docs/domains/_shared/features/rgpd-compliance/mode-degrade-geoip.feature diff --git a/features/api/rgpd-compliance/portabilite-donnees.feature b/docs/domains/_shared/features/rgpd-compliance/portabilite-donnees.feature similarity index 100% rename from features/api/rgpd-compliance/portabilite-donnees.feature rename to docs/domains/_shared/features/rgpd-compliance/portabilite-donnees.feature diff --git a/features/api/rgpd-compliance/suppression-compte.feature b/docs/domains/_shared/features/rgpd-compliance/suppression-compte.feature similarity index 100% rename from features/api/rgpd-compliance/suppression-compte.feature rename to docs/domains/_shared/features/rgpd-compliance/suppression-compte.feature diff --git a/docs/regles-metier/ANNEXE-POST-MVP.md b/docs/domains/_shared/rules/ANNEXE-POST-MVP.md similarity index 100% rename from docs/regles-metier/ANNEXE-POST-MVP.md rename to docs/domains/_shared/rules/ANNEXE-POST-MVP.md diff --git a/docs/regles-metier/01-authentification-inscription.md b/docs/domains/_shared/rules/authentification.md similarity index 100% rename from docs/regles-metier/01-authentification-inscription.md rename to docs/domains/_shared/rules/authentification.md diff --git a/docs/regles-metier/10-gestion-erreurs.md b/docs/domains/_shared/rules/gestion-erreurs.md similarity index 100% rename from docs/regles-metier/10-gestion-erreurs.md rename to docs/domains/_shared/rules/gestion-erreurs.md diff --git a/docs/regles-metier/02-conformite-rgpd.md b/docs/domains/_shared/rules/rgpd.md similarity index 100% rename from docs/regles-metier/02-conformite-rgpd.md rename to docs/domains/_shared/rules/rgpd.md diff --git a/docs/domains/advertising/README.md b/docs/domains/advertising/README.md new file mode 100644 index 0000000..f82b462 --- /dev/null +++ b/docs/domains/advertising/README.md @@ -0,0 +1,36 @@ +# Domaine : Advertising + +## Vue d'ensemble + +Le domaine **Advertising** gère la diffusion de publicités audio ciblées. C'est un **Generic Subdomain** qui constitue une source de revenus importante pour la plateforme. + +## Responsabilités + +- **Campagnes publicitaires** : Création et gestion des campagnes +- **Ciblage** : Ciblage géographique et par centres d'intérêt +- **Métriques** : Suivi des impressions, écoutes et performances +- **Insertion dynamique** : Insertion de publicités dans les flux audio + +## Règles métier + +- [Publicités](rules/publicites.md) + +## Modèle de données + +- [Diagramme entités publicités](entities/modele-publicites.md) - Entités : AD_CAMPAIGNS, AD_METRICS, AD_IMPRESSIONS + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Ad Campaign** : Campagne publicitaire avec budget et durée +- **Ad Impression** : Affichage/lecture d'une publicité +- **Ad Targeting** : Critères de ciblage (geo + intérêts) +- **CPM (Cost Per Mille)** : Coût pour 1000 impressions +- **Ad Insertion** : Insertion dynamique dans le flux audio +- **Skip Rate** : Taux de publicités sautées par les utilisateurs + +## Dépendances + +- ✅ Dépend de : `_shared` (users, listening history) +- ✅ Dépend de : `recommendation` (ciblage par intérêts) +- ⚠️ Bloqué par : `premium` (pas de pub pour abonnés premium) diff --git a/docs/diagrammes/entites/modele-publicites.md b/docs/domains/advertising/entities/modele-publicites.md similarity index 94% rename from docs/diagrammes/entites/modele-publicites.md rename to docs/domains/advertising/entities/modele-publicites.md index b007196..dbf30cd 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/16-publicites.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 16 : Publicités](../rules/publicites.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/features/api/publicites/campagnes-publicitaires.feature b/docs/domains/advertising/features/publicites/campagnes-publicitaires.feature similarity index 100% rename from features/api/publicites/campagnes-publicitaires.feature rename to docs/domains/advertising/features/publicites/campagnes-publicitaires.feature diff --git a/features/api/publicites/caracteristiques-pub.feature b/docs/domains/advertising/features/publicites/caracteristiques-pub.feature similarity index 100% rename from features/api/publicites/caracteristiques-pub.feature rename to docs/domains/advertising/features/publicites/caracteristiques-pub.feature diff --git a/features/api/publicites/ciblage-horaire-fuseaux-horaires.feature b/docs/domains/advertising/features/publicites/ciblage-horaire-fuseaux-horaires.feature similarity index 100% rename from features/api/publicites/ciblage-horaire-fuseaux-horaires.feature rename to docs/domains/advertising/features/publicites/ciblage-horaire-fuseaux-horaires.feature diff --git a/features/api/publicites/gestion-budget-pub.feature b/docs/domains/advertising/features/publicites/gestion-budget-pub.feature similarity index 100% rename from features/api/publicites/gestion-budget-pub.feature rename to docs/domains/advertising/features/publicites/gestion-budget-pub.feature diff --git a/features/api/publicites/insertion-frequence-pub.feature b/docs/domains/advertising/features/publicites/insertion-frequence-pub.feature similarity index 100% rename from features/api/publicites/insertion-frequence-pub.feature rename to docs/domains/advertising/features/publicites/insertion-frequence-pub.feature diff --git a/features/api/publicites/metriques-engagement-pub.feature b/docs/domains/advertising/features/publicites/metriques-engagement-pub.feature similarity index 100% rename from features/api/publicites/metriques-engagement-pub.feature rename to docs/domains/advertising/features/publicites/metriques-engagement-pub.feature diff --git a/features/api/publicites/validation-moderation-pub.feature b/docs/domains/advertising/features/publicites/validation-moderation-pub.feature similarity index 100% rename from features/api/publicites/validation-moderation-pub.feature rename to docs/domains/advertising/features/publicites/validation-moderation-pub.feature diff --git a/docs/regles-metier/16-publicites.md b/docs/domains/advertising/rules/publicites.md similarity index 100% rename from docs/regles-metier/16-publicites.md rename to docs/domains/advertising/rules/publicites.md diff --git a/docs/domains/content/README.md b/docs/domains/content/README.md new file mode 100644 index 0000000..dd8f0a5 --- /dev/null +++ b/docs/domains/content/README.md @@ -0,0 +1,44 @@ +# Domaine : Content + +## Vue d'ensemble + +Le domaine **Content** gère toute la création, publication et diffusion des contenus audio sur RoadWave. C'est un **Supporting Subdomain** essentiel qui couvre les audio-guides, les radios live et les contenus géolocalisés. + +## Responsabilités + +- **Création et publication** : Workflow de création de contenu par les créateurs +- **Audio-guides multi-séquences** : Gestion des parcours audio structurés +- **Radio live** : Diffusion en direct et enregistrements +- **Contenus géolocalisés** : Association de contenus à des zones géographiques +- **Détection de contenu protégé** : Prévention des violations de droits d'auteur + +## Règles métier + +- [Création et publication de contenu](rules/creation-publication.md) +- [Audio-guides multi-séquences](rules/audio-guides.md) +- [Radio live](rules/radio-live.md) +- [Contenus géolocalisés en voiture](rules/contenus-geolocalises.md) +- [Détection de contenu protégé](rules/detection-contenu-protege.md) + +## Modèle de données + +- [Diagramme entités audio-guides](entities/modele-audio-guides.md) - Entités : AUDIO_GUIDES, GUIDE_SEQUENCES +- [Diagramme entités radio live](entities/modele-radio-live.md) - Entités : LIVE_STREAMS, LIVE_RECORDINGS + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Audio Guide** : Contenu structuré en séquences géolocalisées +- **Guide Sequence** : Segment d'un audio-guide déclenché à un point GPS précis +- **Live Stream** : Diffusion audio en temps réel +- **Live Recording** : Enregistrement automatique d'un live pour réécoute +- **Geofence** : Zone géographique déclenchant un contenu +- **Content Fingerprint** : Empreinte numérique pour détecter le contenu protégé +- **Creator** : Utilisateur créant et publiant du contenu + +## Dépendances + +- ✅ Dépend de : `_shared` (users, contents base) +- ⚠️ Interactions avec : `moderation` (modération de contenu) +- ⚠️ Interactions avec : `monetization` (revenus créateurs) +- ⚠️ Utilisé par : `recommendation` (métadonnées pour scoring) diff --git a/docs/diagrammes/entites/modele-audio-guides.md b/docs/domains/content/entities/modele-audio-guides.md similarity index 96% rename from docs/diagrammes/entites/modele-audio-guides.md rename to docs/domains/content/entities/modele-audio-guides.md index caf0761..8132eca 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/06-audio-guides-multi-sequences.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 06 : Audio-guides multi-séquences](../rules/audio-guides.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/docs/diagrammes/entites/modele-radio-live.md b/docs/domains/content/entities/modele-radio-live.md similarity index 94% rename from docs/diagrammes/entites/modele-radio-live.md rename to docs/domains/content/entities/modele-radio-live.md index aefeff5..5a0dca1 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/12-radio-live.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 12 : Radio Live](../rules/radio-live.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/features/api/audio-guides/affichage-distance-direction-eta.feature b/docs/domains/content/features/audio-guides/affichage-distance-direction-eta.feature similarity index 100% rename from features/api/audio-guides/affichage-distance-direction-eta.feature rename to docs/domains/content/features/audio-guides/affichage-distance-direction-eta.feature diff --git a/features/ui/audio-guides/creation-audio-guide.feature b/docs/domains/content/features/audio-guides/creation-audio-guide.feature similarity index 100% rename from features/ui/audio-guides/creation-audio-guide.feature rename to docs/domains/content/features/audio-guides/creation-audio-guide.feature diff --git a/features/api/audio-guides/creation-gestion.feature b/docs/domains/content/features/audio-guides/creation-gestion.feature similarity index 100% rename from features/api/audio-guides/creation-gestion.feature rename to docs/domains/content/features/audio-guides/creation-gestion.feature diff --git a/features/api/audio-guides/creation-wizard-complet.feature b/docs/domains/content/features/audio-guides/creation-wizard-complet.feature similarity index 100% rename from features/api/audio-guides/creation-wizard-complet.feature rename to docs/domains/content/features/audio-guides/creation-wizard-complet.feature diff --git a/features/api/audio-guides/declenchement-gps-voiture-complet.feature b/docs/domains/content/features/audio-guides/declenchement-gps-voiture-complet.feature similarity index 100% rename from features/api/audio-guides/declenchement-gps-voiture-complet.feature rename to docs/domains/content/features/audio-guides/declenchement-gps-voiture-complet.feature diff --git a/features/api/audio-guides/declenchement-gps.feature b/docs/domains/content/features/audio-guides/declenchement-gps.feature similarity index 100% rename from features/api/audio-guides/declenchement-gps.feature rename to docs/domains/content/features/audio-guides/declenchement-gps.feature diff --git a/features/api/audio-guides/detection-mode-deplacement.feature b/docs/domains/content/features/audio-guides/detection-mode-deplacement.feature similarity index 100% rename from features/api/audio-guides/detection-mode-deplacement.feature rename to docs/domains/content/features/audio-guides/detection-mode-deplacement.feature diff --git a/features/api/audio-guides/gestion-point-manque.feature b/docs/domains/content/features/audio-guides/gestion-point-manque.feature similarity index 100% rename from features/api/audio-guides/gestion-point-manque.feature rename to docs/domains/content/features/audio-guides/gestion-point-manque.feature diff --git a/features/ui/audio-guides/integration-fonctionnalites.feature b/docs/domains/content/features/audio-guides/integration-fonctionnalites.feature similarity index 100% rename from features/ui/audio-guides/integration-fonctionnalites.feature rename to docs/domains/content/features/audio-guides/integration-fonctionnalites.feature diff --git a/features/api/audio-guides/metriques-analytics.feature b/docs/domains/content/features/audio-guides/metriques-analytics.feature similarity index 100% rename from features/api/audio-guides/metriques-analytics.feature rename to docs/domains/content/features/audio-guides/metriques-analytics.feature diff --git a/features/ui/audio-guides/mode-pieton.feature b/docs/domains/content/features/audio-guides/mode-pieton.feature similarity index 100% rename from features/ui/audio-guides/mode-pieton.feature rename to docs/domains/content/features/audio-guides/mode-pieton.feature diff --git a/features/ui/audio-guides/mode-voiture.feature b/docs/domains/content/features/audio-guides/mode-voiture.feature similarity index 100% rename from features/ui/audio-guides/mode-voiture.feature rename to docs/domains/content/features/audio-guides/mode-voiture.feature diff --git a/features/api/audio-guides/modes-velo-transport-complet.feature b/docs/domains/content/features/audio-guides/modes-velo-transport-complet.feature similarity index 100% rename from features/api/audio-guides/modes-velo-transport-complet.feature rename to docs/domains/content/features/audio-guides/modes-velo-transport-complet.feature diff --git a/features/ui/audio-guides/modes-velo-transport.feature b/docs/domains/content/features/audio-guides/modes-velo-transport.feature similarity index 100% rename from features/ui/audio-guides/modes-velo-transport.feature rename to docs/domains/content/features/audio-guides/modes-velo-transport.feature diff --git a/features/ui/audio-guides/navigation-libre-pieton-complet.feature b/docs/domains/content/features/audio-guides/navigation-libre-pieton-complet.feature similarity index 100% rename from features/ui/audio-guides/navigation-libre-pieton-complet.feature rename to docs/domains/content/features/audio-guides/navigation-libre-pieton-complet.feature diff --git a/features/api/audio-guides/pieton-pub-autoplay.feature b/docs/domains/content/features/audio-guides/pieton-pub-autoplay.feature similarity index 100% rename from features/api/audio-guides/pieton-pub-autoplay.feature rename to docs/domains/content/features/audio-guides/pieton-pub-autoplay.feature diff --git a/features/ui/audio-guides/premium-monetisation.feature b/docs/domains/content/features/audio-guides/premium-monetisation.feature similarity index 100% rename from features/ui/audio-guides/premium-monetisation.feature rename to docs/domains/content/features/audio-guides/premium-monetisation.feature diff --git a/features/ui/audio-guides/progression-sauvegarde.feature b/docs/domains/content/features/audio-guides/progression-sauvegarde.feature similarity index 100% rename from features/ui/audio-guides/progression-sauvegarde.feature rename to docs/domains/content/features/audio-guides/progression-sauvegarde.feature diff --git a/features/api/audio-guides/progression-sync.feature b/docs/domains/content/features/audio-guides/progression-sync.feature similarity index 100% rename from features/api/audio-guides/progression-sync.feature rename to docs/domains/content/features/audio-guides/progression-sync.feature diff --git a/features/api/audio-guides/publicites-complet.feature b/docs/domains/content/features/audio-guides/publicites-complet.feature similarity index 100% rename from features/api/audio-guides/publicites-complet.feature rename to docs/domains/content/features/audio-guides/publicites-complet.feature diff --git a/features/api/audio-guides/publicites.feature b/docs/domains/content/features/audio-guides/publicites.feature similarity index 100% rename from features/api/audio-guides/publicites.feature rename to docs/domains/content/features/audio-guides/publicites.feature diff --git a/features/api/audio-guides/rayon-configurable-createur.feature b/docs/domains/content/features/audio-guides/rayon-configurable-createur.feature similarity index 100% rename from features/api/audio-guides/rayon-configurable-createur.feature rename to docs/domains/content/features/audio-guides/rayon-configurable-createur.feature diff --git a/features/api/audio-guides/reprise-progression-complet.feature b/docs/domains/content/features/audio-guides/reprise-progression-complet.feature similarity index 100% rename from features/api/audio-guides/reprise-progression-complet.feature rename to docs/domains/content/features/audio-guides/reprise-progression-complet.feature diff --git a/features/api/audio-guides/sauvegarde-sync-progression.feature b/docs/domains/content/features/audio-guides/sauvegarde-sync-progression.feature similarity index 100% rename from features/api/audio-guides/sauvegarde-sync-progression.feature rename to docs/domains/content/features/audio-guides/sauvegarde-sync-progression.feature diff --git a/features/ui/audio-guides/systeme-double-clic-sortie.feature b/docs/domains/content/features/audio-guides/systeme-double-clic-sortie.feature similarity index 100% rename from features/ui/audio-guides/systeme-double-clic-sortie.feature rename to docs/domains/content/features/audio-guides/systeme-double-clic-sortie.feature diff --git a/features/api/content-creation/fair-use-30s-musique.feature b/docs/domains/content/features/content-creation/fair-use-30s-musique.feature similarity index 100% rename from features/api/content-creation/fair-use-30s-musique.feature rename to docs/domains/content/features/content-creation/fair-use-30s-musique.feature diff --git a/features/api/content-creation/image-couverture-auto.feature b/docs/domains/content/features/content-creation/image-couverture-auto.feature similarity index 100% rename from features/api/content-creation/image-couverture-auto.feature rename to docs/domains/content/features/content-creation/image-couverture-auto.feature diff --git a/features/api/content-creation/metadonnees-publication.feature b/docs/domains/content/features/content-creation/metadonnees-publication.feature similarity index 100% rename from features/api/content-creation/metadonnees-publication.feature rename to docs/domains/content/features/content-creation/metadonnees-publication.feature diff --git a/features/api/content-creation/modification-suppression.feature b/docs/domains/content/features/content-creation/modification-suppression.feature similarity index 100% rename from features/api/content-creation/modification-suppression.feature rename to docs/domains/content/features/content-creation/modification-suppression.feature diff --git a/features/api/content-creation/restrictions-modification.feature b/docs/domains/content/features/content-creation/restrictions-modification.feature similarity index 100% rename from features/api/content-creation/restrictions-modification.feature rename to docs/domains/content/features/content-creation/restrictions-modification.feature diff --git a/features/api/content-creation/suppression-marquage.feature b/docs/domains/content/features/content-creation/suppression-marquage.feature similarity index 100% rename from features/api/content-creation/suppression-marquage.feature rename to docs/domains/content/features/content-creation/suppression-marquage.feature diff --git a/features/api/content-creation/upload-encodage.feature b/docs/domains/content/features/content-creation/upload-encodage.feature similarity index 100% rename from features/api/content-creation/upload-encodage.feature rename to docs/domains/content/features/content-creation/upload-encodage.feature diff --git a/features/api/content-creation/validation-musique-detection.feature b/docs/domains/content/features/content-creation/validation-musique-detection.feature similarity index 100% rename from features/api/content-creation/validation-musique-detection.feature rename to docs/domains/content/features/content-creation/validation-musique-detection.feature diff --git a/features/api/content-creation/validation-premiers-contenus.feature b/docs/domains/content/features/content-creation/validation-premiers-contenus.feature similarity index 100% rename from features/api/content-creation/validation-premiers-contenus.feature rename to docs/domains/content/features/content-creation/validation-premiers-contenus.feature diff --git a/features/api/navigation/auto-switching-modes.feature b/docs/domains/content/features/navigation/auto-switching-modes.feature similarity index 100% rename from features/api/navigation/auto-switching-modes.feature rename to docs/domains/content/features/navigation/auto-switching-modes.feature diff --git a/features/api/navigation/decompte-5s-transition.feature b/docs/domains/content/features/navigation/decompte-5s-transition.feature similarity index 100% rename from features/api/navigation/decompte-5s-transition.feature rename to docs/domains/content/features/navigation/decompte-5s-transition.feature diff --git a/features/api/navigation/eta-calculation.feature b/docs/domains/content/features/navigation/eta-calculation.feature similarity index 100% rename from features/api/navigation/eta-calculation.feature rename to docs/domains/content/features/navigation/eta-calculation.feature diff --git a/features/api/navigation/file-attente.feature b/docs/domains/content/features/navigation/file-attente.feature similarity index 100% rename from features/api/navigation/file-attente.feature rename to docs/domains/content/features/navigation/file-attente.feature diff --git a/features/api/navigation/historique-geo-contenu.feature b/docs/domains/content/features/navigation/historique-geo-contenu.feature similarity index 100% rename from features/api/navigation/historique-geo-contenu.feature rename to docs/domains/content/features/navigation/historique-geo-contenu.feature diff --git a/features/api/navigation/mode-stationnement.feature b/docs/domains/content/features/navigation/mode-stationnement.feature similarity index 100% rename from features/api/navigation/mode-stationnement.feature rename to docs/domains/content/features/navigation/mode-stationnement.feature diff --git a/features/api/navigation/notification-minimaliste-voiture.feature b/docs/domains/content/features/navigation/notification-minimaliste-voiture.feature similarity index 100% rename from features/api/navigation/notification-minimaliste-voiture.feature rename to docs/domains/content/features/navigation/notification-minimaliste-voiture.feature diff --git a/features/api/navigation/notifications-geolocalisees.feature b/docs/domains/content/features/navigation/notifications-geolocalisees.feature similarity index 100% rename from features/api/navigation/notifications-geolocalisees.feature rename to docs/domains/content/features/navigation/notifications-geolocalisees.feature diff --git a/features/api/navigation/quota-cooldown.feature b/docs/domains/content/features/navigation/quota-cooldown.feature similarity index 100% rename from features/api/navigation/quota-cooldown.feature rename to docs/domains/content/features/navigation/quota-cooldown.feature diff --git a/features/api/radio-live/architecture-technique-live.feature b/docs/domains/content/features/radio-live/architecture-technique-live.feature similarity index 100% rename from features/api/radio-live/architecture-technique-live.feature rename to docs/domains/content/features/radio-live/architecture-technique-live.feature diff --git a/features/api/radio-live/arret-live.feature b/docs/domains/content/features/radio-live/arret-live.feature similarity index 100% rename from features/api/radio-live/arret-live.feature rename to docs/domains/content/features/radio-live/arret-live.feature diff --git a/features/api/radio-live/comportement-auditeur-live.feature b/docs/domains/content/features/radio-live/comportement-auditeur-live.feature similarity index 100% rename from features/api/radio-live/comportement-auditeur-live.feature rename to docs/domains/content/features/radio-live/comportement-auditeur-live.feature diff --git a/features/api/radio-live/comportement-auditeur.feature b/docs/domains/content/features/radio-live/comportement-auditeur.feature similarity index 100% rename from features/api/radio-live/comportement-auditeur.feature rename to docs/domains/content/features/radio-live/comportement-auditeur.feature diff --git a/features/api/radio-live/demarrage-live.feature b/docs/domains/content/features/radio-live/demarrage-live.feature similarity index 100% rename from features/api/radio-live/demarrage-live.feature rename to docs/domains/content/features/radio-live/demarrage-live.feature diff --git a/features/api/radio-live/enregistrement-publication-replay.feature b/docs/domains/content/features/radio-live/enregistrement-publication-replay.feature similarity index 100% rename from features/api/radio-live/enregistrement-publication-replay.feature rename to docs/domains/content/features/radio-live/enregistrement-publication-replay.feature diff --git a/features/api/radio-live/interdictions-moderation-live.feature b/docs/domains/content/features/radio-live/interdictions-moderation-live.feature similarity index 100% rename from features/api/radio-live/interdictions-moderation-live.feature rename to docs/domains/content/features/radio-live/interdictions-moderation-live.feature diff --git a/features/ui/content-creation/education-droits-auteur.feature b/docs/domains/content/features/ui-content-creation/education-droits-auteur.feature similarity index 100% rename from features/ui/content-creation/education-droits-auteur.feature rename to docs/domains/content/features/ui-content-creation/education-droits-auteur.feature diff --git a/features/ui/navigation/actions-mode-pieton.feature b/docs/domains/content/features/ui-navigation/actions-mode-pieton.feature similarity index 100% rename from features/ui/navigation/actions-mode-pieton.feature rename to docs/domains/content/features/ui-navigation/actions-mode-pieton.feature diff --git a/features/ui/navigation/commande-precedent.feature b/docs/domains/content/features/ui-navigation/commande-precedent.feature similarity index 100% rename from features/ui/navigation/commande-precedent.feature rename to docs/domains/content/features/ui-navigation/commande-precedent.feature diff --git a/features/ui/navigation/commandes-vocales.feature b/docs/domains/content/features/ui-navigation/commandes-vocales.feature similarity index 100% rename from features/ui/navigation/commandes-vocales.feature rename to docs/domains/content/features/ui-navigation/commandes-vocales.feature diff --git a/features/ui/navigation/commandes-volant.feature b/docs/domains/content/features/ui-navigation/commandes-volant.feature similarity index 100% rename from features/ui/navigation/commandes-volant.feature rename to docs/domains/content/features/ui-navigation/commandes-volant.feature diff --git a/features/ui/navigation/contenus-geolocalises-voiture.feature b/docs/domains/content/features/ui-navigation/contenus-geolocalises-voiture.feature similarity index 100% rename from features/ui/navigation/contenus-geolocalises-voiture.feature rename to docs/domains/content/features/ui-navigation/contenus-geolocalises-voiture.feature diff --git a/features/ui/navigation/file-attente-suivant.feature b/docs/domains/content/features/ui-navigation/file-attente-suivant.feature similarity index 100% rename from features/ui/navigation/file-attente-suivant.feature rename to docs/domains/content/features/ui-navigation/file-attente-suivant.feature diff --git a/features/ui/navigation/lecture-enchainement.feature b/docs/domains/content/features/ui-navigation/lecture-enchainement.feature similarity index 100% rename from features/ui/navigation/lecture-enchainement.feature rename to docs/domains/content/features/ui-navigation/lecture-enchainement.feature diff --git a/features/ui/navigation/mode-pieton-notifications-push.feature b/docs/domains/content/features/ui-navigation/mode-pieton-notifications-push.feature similarity index 100% rename from features/ui/navigation/mode-pieton-notifications-push.feature rename to docs/domains/content/features/ui-navigation/mode-pieton-notifications-push.feature diff --git a/docs/regles-metier/06-audio-guides-multi-sequences.md b/docs/domains/content/rules/audio-guides.md similarity index 100% rename from docs/regles-metier/06-audio-guides-multi-sequences.md rename to docs/domains/content/rules/audio-guides.md diff --git a/docs/regles-metier/07-contenus-geolocalises-voiture.md b/docs/domains/content/rules/contenus-geolocalises.md similarity index 100% rename from docs/regles-metier/07-contenus-geolocalises-voiture.md rename to docs/domains/content/rules/contenus-geolocalises.md diff --git a/docs/regles-metier/11-creation-publication-contenu.md b/docs/domains/content/rules/creation-publication.md similarity index 100% rename from docs/regles-metier/11-creation-publication-contenu.md rename to docs/domains/content/rules/creation-publication.md diff --git a/docs/regles-metier/13-detection-contenu-protege.md b/docs/domains/content/rules/detection-contenu-protege.md similarity index 100% rename from docs/regles-metier/13-detection-contenu-protege.md rename to docs/domains/content/rules/detection-contenu-protege.md diff --git a/docs/regles-metier/12-radio-live.md b/docs/domains/content/rules/radio-live.md similarity index 100% rename from docs/regles-metier/12-radio-live.md rename to docs/domains/content/rules/radio-live.md diff --git a/docs/domains/moderation/README.md b/docs/domains/moderation/README.md new file mode 100644 index 0000000..dda49a0 --- /dev/null +++ b/docs/domains/moderation/README.md @@ -0,0 +1,51 @@ +# Domaine : Moderation + +## Vue d'ensemble + +Le domaine **Moderation** gère la modération des contenus et des utilisateurs, les signalements, les sanctions et le système de badges de confiance. C'est un **Supporting Subdomain** critique pour la qualité et la sécurité de la plateforme. + +## Responsabilités + +- **Signalements** : Workflow de traitement des signalements utilisateurs +- **Sanctions** : Système de strikes et bannissements +- **Appels** : Processus de contestation des sanctions +- **Badges de confiance** : Attribution de badges aux créateurs fiables +- **Modération communautaire** : Implication des utilisateurs dans la modération + +## Règles métier + +- [Moderation flows](rules/moderation-flows.md) - Workflows de modération +- [Modération communautaire](rules/moderation-communautaire.md) +- [Autres comportements](rules/autres-comportements.md) - Comportements sanctionnables + +## Modèle de données + +- [Diagramme entités modération](entities/modele-moderation.md) - Entités : REPORTS, SANCTIONS, APPEALS, STRIKES, BADGES + +## Diagrammes + +- [Flux : Modération et signalement](flows/moderation-signalement.md) +- [États : Lifecycle d'un signalement](states/signalement-lifecycle.md) +- [Séquence : Processus d'appel](sequences/processus-appel-moderation.md) + +## Tests BDD + +- Features de modération *(voir Phase 6)* + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Report** : Signalement d'un contenu ou utilisateur problématique +- **Strike** : Avertissement comptabilisé (3 strikes = ban) +- **Sanction** : Mesure disciplinaire (warning, suspension, ban) +- **Appeal** : Contestation d'une sanction par l'utilisateur +- **Trust Badge** : Badge de confiance attribué aux créateurs fiables +- **Community Moderation** : Modération participative par les utilisateurs +- **Moderator** : Utilisateur avec droits de modération +- **Auto-Moderation** : Modération automatique (IA, filtres) + +## Dépendances + +- ✅ Dépend de : `_shared` (users, contents) +- ⚠️ Interactions avec : `content` (modération de contenus) +- ⚠️ Interactions avec : `monetization` (démonétisation en cas de sanction) diff --git a/docs/diagrammes/entites/modele-moderation.md b/docs/domains/moderation/entities/modele-moderation.md similarity index 97% rename from docs/diagrammes/entites/modele-moderation.md rename to docs/domains/moderation/entities/modele-moderation.md index bdeeca9..c4bbb90 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/14-moderation-flows.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/features/admin/moderation/dashboard-moderateur.feature b/docs/domains/moderation/features/admin/dashboard-moderateur.feature similarity index 100% rename from features/admin/moderation/dashboard-moderateur.feature rename to docs/domains/moderation/features/admin/dashboard-moderateur.feature diff --git a/features/admin/moderation/outils-moderateur.feature b/docs/domains/moderation/features/admin/outils-moderateur.feature similarity index 100% rename from features/admin/moderation/outils-moderateur.feature rename to docs/domains/moderation/features/admin/outils-moderateur.feature diff --git a/features/api/moderation/appel-droits-auteur.feature b/docs/domains/moderation/features/api/appel-droits-auteur.feature similarity index 100% rename from features/api/moderation/appel-droits-auteur.feature rename to docs/domains/moderation/features/api/appel-droits-auteur.feature diff --git a/features/api/moderation/audit-trimestriel.feature b/docs/domains/moderation/features/api/audit-trimestriel.feature similarity index 100% rename from features/api/moderation/audit-trimestriel.feature rename to docs/domains/moderation/features/api/audit-trimestriel.feature diff --git a/features/api/moderation/badges-system.feature b/docs/domains/moderation/features/api/badges-system.feature similarity index 100% rename from features/api/moderation/badges-system.feature rename to docs/domains/moderation/features/api/badges-system.feature diff --git a/features/api/moderation/detection-patterns-suspects.feature b/docs/domains/moderation/features/api/detection-patterns-suspects.feature similarity index 100% rename from features/api/moderation/detection-patterns-suspects.feature rename to docs/domains/moderation/features/api/detection-patterns-suspects.feature diff --git a/features/api/moderation/limite-temporelle-anti-abus.feature b/docs/domains/moderation/features/api/limite-temporelle-anti-abus.feature similarity index 100% rename from features/api/moderation/limite-temporelle-anti-abus.feature rename to docs/domains/moderation/features/api/limite-temporelle-anti-abus.feature diff --git a/features/api/moderation/moderation-communautaire.feature b/docs/domains/moderation/features/api/moderation-communautaire.feature similarity index 100% rename from features/api/moderation/moderation-communautaire.feature rename to docs/domains/moderation/features/api/moderation-communautaire.feature diff --git a/features/api/moderation/moderation-preventive.feature b/docs/domains/moderation/features/api/moderation-preventive.feature similarity index 100% rename from features/api/moderation/moderation-preventive.feature rename to docs/domains/moderation/features/api/moderation-preventive.feature diff --git a/features/api/moderation/reduction-premium-badge-or.feature b/docs/domains/moderation/features/api/reduction-premium-badge-or.feature similarity index 100% rename from features/api/moderation/reduction-premium-badge-or.feature rename to docs/domains/moderation/features/api/reduction-premium-badge-or.feature diff --git a/features/api/moderation/sanctions-abus-progressives.feature b/docs/domains/moderation/features/api/sanctions-abus-progressives.feature similarity index 100% rename from features/api/moderation/sanctions-abus-progressives.feature rename to docs/domains/moderation/features/api/sanctions-abus-progressives.feature diff --git a/features/api/moderation/sanctions-droits-auteur.feature b/docs/domains/moderation/features/api/sanctions-droits-auteur.feature similarity index 100% rename from features/api/moderation/sanctions-droits-auteur.feature rename to docs/domains/moderation/features/api/sanctions-droits-auteur.feature diff --git a/features/api/moderation/sanctions-notifications.feature b/docs/domains/moderation/features/api/sanctions-notifications.feature similarity index 100% rename from features/api/moderation/sanctions-notifications.feature rename to docs/domains/moderation/features/api/sanctions-notifications.feature diff --git a/features/api/moderation/score-fiabilite-priorisation.feature b/docs/domains/moderation/features/api/score-fiabilite-priorisation.feature similarity index 100% rename from features/api/moderation/score-fiabilite-priorisation.feature rename to docs/domains/moderation/features/api/score-fiabilite-priorisation.feature diff --git a/features/api/moderation/signalement-musique-posteriori.feature b/docs/domains/moderation/features/api/signalement-musique-posteriori.feature similarity index 100% rename from features/api/moderation/signalement-musique-posteriori.feature rename to docs/domains/moderation/features/api/signalement-musique-posteriori.feature diff --git a/features/api/moderation/signalement.feature b/docs/domains/moderation/features/api/signalement.feature similarity index 100% rename from features/api/moderation/signalement.feature rename to docs/domains/moderation/features/api/signalement.feature diff --git a/features/api/moderation/traitement-signalements.feature b/docs/domains/moderation/features/api/traitement-signalements.feature similarity index 100% rename from features/api/moderation/traitement-signalements.feature rename to docs/domains/moderation/features/api/traitement-signalements.feature diff --git a/features/api/moderation/utilisateur-confiance.feature b/docs/domains/moderation/features/api/utilisateur-confiance.feature similarity index 100% rename from features/api/moderation/utilisateur-confiance.feature rename to docs/domains/moderation/features/api/utilisateur-confiance.feature diff --git a/features/ui/moderation/badges-statistiques.feature b/docs/domains/moderation/features/ui/badges-statistiques.feature similarity index 100% rename from features/ui/moderation/badges-statistiques.feature rename to docs/domains/moderation/features/ui/badges-statistiques.feature diff --git a/features/ui/moderation/historique-signalements.feature b/docs/domains/moderation/features/ui/historique-signalements.feature similarity index 100% rename from features/ui/moderation/historique-signalements.feature rename to docs/domains/moderation/features/ui/historique-signalements.feature diff --git a/features/ui/moderation/modal-decouverte-badges.feature b/docs/domains/moderation/features/ui/modal-decouverte-badges.feature similarity index 100% rename from features/ui/moderation/modal-decouverte-badges.feature rename to docs/domains/moderation/features/ui/modal-decouverte-badges.feature diff --git a/features/ui/moderation/sanctions-appel.feature b/docs/domains/moderation/features/ui/sanctions-appel.feature similarity index 100% rename from features/ui/moderation/sanctions-appel.feature rename to docs/domains/moderation/features/ui/sanctions-appel.feature diff --git a/features/ui/moderation/signalement-ui.feature b/docs/domains/moderation/features/ui/signalement-ui.feature similarity index 100% rename from features/ui/moderation/signalement-ui.feature rename to docs/domains/moderation/features/ui/signalement-ui.feature diff --git a/docs/diagrammes/flux/moderation-signalement.md b/docs/domains/moderation/flows/moderation-signalement.md similarity index 98% rename from docs/diagrammes/flux/moderation-signalement.md rename to docs/domains/moderation/flows/moderation-signalement.md index 32f04bc..5a6765a 100644 --- a/docs/diagrammes/flux/moderation-signalement.md +++ b/docs/domains/moderation/flows/moderation-signalement.md @@ -1,6 +1,6 @@ # Flux de modération - Processus de signalement -📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) +📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) ## Diagramme diff --git a/docs/regles-metier/19-autres-comportements.md b/docs/domains/moderation/rules/autres-comportements.md similarity index 100% rename from docs/regles-metier/19-autres-comportements.md rename to docs/domains/moderation/rules/autres-comportements.md diff --git a/docs/regles-metier/15-moderation-communautaire.md b/docs/domains/moderation/rules/moderation-communautaire.md similarity index 100% rename from docs/regles-metier/15-moderation-communautaire.md rename to docs/domains/moderation/rules/moderation-communautaire.md diff --git a/docs/regles-metier/14-moderation-flows.md b/docs/domains/moderation/rules/moderation-flows.md similarity index 100% rename from docs/regles-metier/14-moderation-flows.md rename to docs/domains/moderation/rules/moderation-flows.md diff --git a/docs/diagrammes/sequence/processus-appel-moderation.md b/docs/domains/moderation/sequences/processus-appel-moderation.md similarity index 97% rename from docs/diagrammes/sequence/processus-appel-moderation.md rename to docs/domains/moderation/sequences/processus-appel-moderation.md index 23fc4ef..d9e8144 100644 --- a/docs/diagrammes/sequence/processus-appel-moderation.md +++ b/docs/domains/moderation/sequences/processus-appel-moderation.md @@ -1,6 +1,6 @@ # Processus d'appel de modération -📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) +📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) ## Diagramme diff --git a/docs/diagrammes/etats/signalement-lifecycle.md b/docs/domains/moderation/states/signalement-lifecycle.md similarity index 98% rename from docs/diagrammes/etats/signalement-lifecycle.md rename to docs/domains/moderation/states/signalement-lifecycle.md index c74c943..49711c0 100644 --- a/docs/diagrammes/etats/signalement-lifecycle.md +++ b/docs/domains/moderation/states/signalement-lifecycle.md @@ -1,6 +1,6 @@ # Cycle de vie d'un signalement -📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) +📖 Voir [Règles métier - Section 14 : Modération Flows](../rules/moderation-flows.md) ## Diagramme diff --git a/docs/domains/monetization/README.md b/docs/domains/monetization/README.md new file mode 100644 index 0000000..bfacbf0 --- /dev/null +++ b/docs/domains/monetization/README.md @@ -0,0 +1,38 @@ +# Domaine : Monetization + +## Vue d'ensemble + +Le domaine **Monetization** gère la monétisation des créateurs de contenu via les revenus publicitaires et les abonnements. C'est un **Generic Subdomain** qui implémente le modèle de partage de revenus. + +## Responsabilités + +- **KYC (Know Your Customer)** : Vérification d'identité des créateurs +- **Calcul des revenus** : Agrégation des revenus par source (pub, abonnements) +- **Versements** : Paiements mensuels via Mangopay +- **Tableaux de bord** : Analytics de revenus pour créateurs + +## Règles métier + +- [Monétisation des créateurs](rules/monetisation-createurs.md) + +## Modèle de données + +- [Diagramme entités monétisation](entities/modele-monetisation.md) - Entités : CREATOR_MONETIZATION, REVENUES, PAYOUTS + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Creator Monetization** : Activation de la monétisation pour un créateur +- **KYC Verification** : Vérification d'identité requise pour versements +- **Revenue Share** : Partage de revenus (70% créateur / 30% plateforme) +- **Payout** : Versement mensuel des revenus +- **Minimum Threshold** : Seuil minimum de revenus pour déclencher un versement +- **Revenue Source** : Source de revenu (ads, premium subscriptions) + +## Dépendances + +- ✅ Dépend de : `_shared` (users en tant que créateurs) +- ✅ Dépend de : `content` (contenus monétisés) +- ✅ Dépend de : `advertising` (revenus publicitaires) +- ✅ Dépend de : `premium` (revenus abonnements) +- ⚠️ Interactions avec : système de paiement Mangopay (externe) diff --git a/docs/diagrammes/entites/modele-monetisation.md b/docs/domains/monetization/entities/modele-monetisation.md similarity index 94% rename from docs/diagrammes/entites/modele-monetisation.md rename to docs/domains/monetization/entities/modele-monetisation.md index 4fa30ea..2e66105 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/18-monetisation-createurs.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 18 : Monétisation](../rules/monetisation-createurs.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/features/api/monetisation/conditions-activation.feature b/docs/domains/monetization/features/monetisation/conditions-activation.feature similarity index 100% rename from features/api/monetisation/conditions-activation.feature rename to docs/domains/monetization/features/monetisation/conditions-activation.feature diff --git a/features/api/monetisation/contenus-premium-exclusifs.feature b/docs/domains/monetization/features/monetisation/contenus-premium-exclusifs.feature similarity index 100% rename from features/api/monetisation/contenus-premium-exclusifs.feature rename to docs/domains/monetization/features/monetisation/contenus-premium-exclusifs.feature diff --git a/features/api/monetisation/desactivation-suspension.feature b/docs/domains/monetization/features/monetisation/desactivation-suspension.feature similarity index 100% rename from features/api/monetisation/desactivation-suspension.feature rename to docs/domains/monetization/features/monetisation/desactivation-suspension.feature diff --git a/features/api/monetisation/kyc-inscription.feature b/docs/domains/monetization/features/monetisation/kyc-inscription.feature similarity index 100% rename from features/api/monetisation/kyc-inscription.feature rename to docs/domains/monetization/features/monetisation/kyc-inscription.feature diff --git a/features/api/monetisation/obligations-fiscales.feature b/docs/domains/monetization/features/monetisation/obligations-fiscales.feature similarity index 100% rename from features/api/monetisation/obligations-fiscales.feature rename to docs/domains/monetization/features/monetisation/obligations-fiscales.feature diff --git a/features/api/monetisation/paiement-createurs.feature b/docs/domains/monetization/features/monetisation/paiement-createurs.feature similarity index 100% rename from features/api/monetisation/paiement-createurs.feature rename to docs/domains/monetization/features/monetisation/paiement-createurs.feature diff --git a/features/api/monetisation/soldes-dormants-inactifs.feature b/docs/domains/monetization/features/monetisation/soldes-dormants-inactifs.feature similarity index 100% rename from features/api/monetisation/soldes-dormants-inactifs.feature rename to docs/domains/monetization/features/monetisation/soldes-dormants-inactifs.feature diff --git a/features/api/monetisation/sources-revenus.feature b/docs/domains/monetization/features/monetisation/sources-revenus.feature similarity index 100% rename from features/api/monetisation/sources-revenus.feature rename to docs/domains/monetization/features/monetisation/sources-revenus.feature diff --git a/docs/regles-metier/18-monetisation-createurs.md b/docs/domains/monetization/rules/monetisation-createurs.md similarity index 100% rename from docs/regles-metier/18-monetisation-createurs.md rename to docs/domains/monetization/rules/monetisation-createurs.md diff --git a/docs/domains/premium/README.md b/docs/domains/premium/README.md new file mode 100644 index 0000000..321d074 --- /dev/null +++ b/docs/domains/premium/README.md @@ -0,0 +1,38 @@ +# Domaine : Premium + +## Vue d'ensemble + +Le domaine **Premium** gère les abonnements payants et les fonctionnalités exclusives pour les utilisateurs premium. C'est un **Generic Subdomain** essentiel au modèle économique freemium. + +## Responsabilités + +- **Abonnements** : Gestion des souscriptions et renouvellements +- **Mode offline** : Téléchargement et synchronisation de contenus +- **Notifications** : Alertes personnalisées pour abonnés +- **Avantages premium** : Accès aux fonctionnalités exclusives (sans pub, qualité audio supérieure, etc.) + +## Règles métier + +- [Premium](rules/premium.md) - Fonctionnalités et avantages +- [Mode offline](rules/mode-offline.md) - Téléchargement et synchronisation +- [Abonnements et notifications](rules/abonnements-notifications.md) + +## Modèle de données + +- [Diagramme entités premium](entities/modele-premium.md) - Entités : PREMIUM_SUBSCRIPTIONS, ACTIVE_STREAMS, OFFLINE_DOWNLOADS + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Premium Subscription** : Abonnement payant mensuel ou annuel +- **Offline Download** : Téléchargement pour écoute hors-ligne +- **Sync Queue** : File d'attente de synchronisation offline +- **Premium Tier** : Niveau d'abonnement (Basic, Plus, Family) +- **Auto-Renewal** : Renouvellement automatique de l'abonnement +- **Premium Notification** : Notification personnalisée pour abonnés + +## Dépendances + +- ✅ Dépend de : `_shared` (users, subscriptions) +- ⚠️ Interactions avec : `advertising` (désactivation des pubs) +- ⚠️ Interactions avec : `content` (téléchargement de contenus) diff --git a/docs/diagrammes/entites/modele-premium.md b/docs/domains/premium/entities/modele-premium.md similarity index 94% rename from docs/diagrammes/entites/modele-premium.md rename to docs/domains/premium/entities/modele-premium.md index a72abb6..a212b55 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/17-premium.md) | [Entités globales](modele-global.md) +📖 Voir [Règles métier - Section 17 : Premium](../rules/premium.md) | [Entités globales](../../_shared/entities/modele-global.md) ## Diagramme diff --git a/features/e2e/abonnements/audio-guides-pieton.feature b/docs/domains/premium/features/abonnements/audio-guides-pieton.feature similarity index 100% rename from features/e2e/abonnements/audio-guides-pieton.feature rename to docs/domains/premium/features/abonnements/audio-guides-pieton.feature diff --git a/features/e2e/abonnements/impact-algorithme.feature b/docs/domains/premium/features/abonnements/impact-algorithme.feature similarity index 100% rename from features/e2e/abonnements/impact-algorithme.feature rename to docs/domains/premium/features/abonnements/impact-algorithme.feature diff --git a/features/e2e/abonnements/limites-desabonnement.feature b/docs/domains/premium/features/abonnements/limites-desabonnement.feature similarity index 100% rename from features/e2e/abonnements/limites-desabonnement.feature rename to docs/domains/premium/features/abonnements/limites-desabonnement.feature diff --git a/features/e2e/abonnements/notifications-contextuelles.feature b/docs/domains/premium/features/abonnements/notifications-contextuelles.feature similarity index 100% rename from features/e2e/abonnements/notifications-contextuelles.feature rename to docs/domains/premium/features/abonnements/notifications-contextuelles.feature diff --git a/features/ui/mode-offline/contenus-supprimes-pendant-offline.feature b/docs/domains/premium/features/mode-offline/contenus-supprimes-pendant-offline.feature similarity index 100% rename from features/ui/mode-offline/contenus-supprimes-pendant-offline.feature rename to docs/domains/premium/features/mode-offline/contenus-supprimes-pendant-offline.feature diff --git a/features/ui/mode-offline/synchronisation-actions.feature b/docs/domains/premium/features/mode-offline/synchronisation-actions.feature similarity index 100% rename from features/ui/mode-offline/synchronisation-actions.feature rename to docs/domains/premium/features/mode-offline/synchronisation-actions.feature diff --git a/features/ui/mode-offline/telechargement.feature b/docs/domains/premium/features/mode-offline/telechargement.feature similarity index 100% rename from features/ui/mode-offline/telechargement.feature rename to docs/domains/premium/features/mode-offline/telechargement.feature diff --git a/features/ui/mode-offline/validite-renouvellement.feature b/docs/domains/premium/features/mode-offline/validite-renouvellement.feature similarity index 100% rename from features/ui/mode-offline/validite-renouvellement.feature rename to docs/domains/premium/features/mode-offline/validite-renouvellement.feature diff --git a/features/api/premium/avantages-premium.feature b/docs/domains/premium/features/premium/avantages-premium.feature similarity index 100% rename from features/api/premium/avantages-premium.feature rename to docs/domains/premium/features/premium/avantages-premium.feature diff --git a/features/api/premium/gestion-abonnement.feature b/docs/domains/premium/features/premium/gestion-abonnement.feature similarity index 100% rename from features/api/premium/gestion-abonnement.feature rename to docs/domains/premium/features/premium/gestion-abonnement.feature diff --git a/features/api/premium/multi-devices-dernier-priorite.feature b/docs/domains/premium/features/premium/multi-devices-dernier-priorite.feature similarity index 100% rename from features/api/premium/multi-devices-dernier-priorite.feature rename to docs/domains/premium/features/premium/multi-devices-dernier-priorite.feature diff --git a/features/api/premium/multi-devices-detection.feature b/docs/domains/premium/features/premium/multi-devices-detection.feature similarity index 100% rename from features/api/premium/multi-devices-detection.feature rename to docs/domains/premium/features/premium/multi-devices-detection.feature diff --git a/features/api/premium/offre-tarification.feature b/docs/domains/premium/features/premium/offre-tarification.feature similarity index 100% rename from features/api/premium/offre-tarification.feature rename to docs/domains/premium/features/premium/offre-tarification.feature diff --git a/features/api/premium/stream-conflict-detection.feature b/docs/domains/premium/features/premium/stream-conflict-detection.feature similarity index 100% rename from features/api/premium/stream-conflict-detection.feature rename to docs/domains/premium/features/premium/stream-conflict-detection.feature diff --git a/features/api/premium/tarification-multi-canal.feature b/docs/domains/premium/features/premium/tarification-multi-canal.feature similarity index 100% rename from features/api/premium/tarification-multi-canal.feature rename to docs/domains/premium/features/premium/tarification-multi-canal.feature diff --git a/features/api/premium/webhooks-retry-paiement.feature b/docs/domains/premium/features/premium/webhooks-retry-paiement.feature similarity index 100% rename from features/api/premium/webhooks-retry-paiement.feature rename to docs/domains/premium/features/premium/webhooks-retry-paiement.feature diff --git a/docs/regles-metier/09-abonnements-notifications.md b/docs/domains/premium/rules/abonnements-notifications.md similarity index 100% rename from docs/regles-metier/09-abonnements-notifications.md rename to docs/domains/premium/rules/abonnements-notifications.md diff --git a/docs/regles-metier/08-mode-offline.md b/docs/domains/premium/rules/mode-offline.md similarity index 100% rename from docs/regles-metier/08-mode-offline.md rename to docs/domains/premium/rules/mode-offline.md diff --git a/docs/regles-metier/17-premium.md b/docs/domains/premium/rules/premium.md similarity index 100% rename from docs/regles-metier/17-premium.md rename to docs/domains/premium/rules/premium.md diff --git a/docs/domains/recommendation/README.md b/docs/domains/recommendation/README.md new file mode 100644 index 0000000..61955e4 --- /dev/null +++ b/docs/domains/recommendation/README.md @@ -0,0 +1,45 @@ +# Domaine : Recommendation + +## Vue d'ensemble + +Le domaine **Recommendation** gère le système de recommandation de contenus basé sur la géolocalisation et les centres d'intérêt des utilisateurs. C'est un **Supporting Subdomain** clé qui différencie RoadWave des autres plateformes audio. + +## Responsabilités + +- **Jauges de centres d'intérêt** : Gestion et évolution dynamique des préférences utilisateurs +- **Algorithme de recommandation** : Scoring et classement des contenus pertinents +- **Interactions et navigation** : Adaptation des recommandations selon le comportement utilisateur + +## Règles métier + +- [Centres d'intérêt et jauges](rules/centres-interet-jauges.md) +- [Algorithme de recommandation](rules/algorithme-recommandation.md) +- [Interactions et navigation](rules/interactions-navigation.md) + +## Modèle de données + +- [Diagramme entités recommandation](entities/modele-recommandation.md) - Entités : USER_INTERESTS, INTEREST_CATEGORIES + +## Diagrammes + +- [Séquence : Scoring et recommandation](sequences/scoring-recommandation.md) *(à créer si existant)* + +## Tests BDD + +- Features de recommandation *(voir Phase 6)* + +## Ubiquitous Language + +**Termes métier du domaine** : +- **Interest Gauge** : Jauge de centre d'intérêt (score de 0 à 100) +- **Interest Category** : Catégorie d'intérêt (automobile, voyage, musique, etc.) +- **Recommendation Score** : Score combinant distance géographique et affinité d'intérêt +- **Content Scoring** : Algorithme de calcul du score de pertinence +- **Geographic Priority** : Priorisation GPS > Ville > Département > Région > Pays +- **Interest Decay** : Diminution progressive de la jauge sans interaction + +## Dépendances + +- ✅ Dépend de : `_shared` (users, contents) +- ✅ Dépend de : `content` (métadonnées de contenus) +- ⚠️ Utilisé par : interface mobile, API publique diff --git a/docs/diagrammes/entites/modele-recommandation.md b/docs/domains/recommendation/entities/modele-recommandation.md similarity index 92% rename from docs/diagrammes/entites/modele-recommandation.md rename to docs/domains/recommendation/entities/modele-recommandation.md index 18a1a02..503f4ea 100644 --- a/docs/diagrammes/entites/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](../../regles-metier/03-centres-interet-jauges.md) | [Section 04 : Algorithme](../../regles-metier/04-algorithme-recommandation.md) | [Entités globales](modele-global.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/modele-global.md) ## Diagramme diff --git a/features/api/interest-gauges/degradation-temporelle.feature b/docs/domains/recommendation/features/interest-gauges/degradation-temporelle.feature similarity index 100% rename from features/api/interest-gauges/degradation-temporelle.feature rename to docs/domains/recommendation/features/interest-gauges/degradation-temporelle.feature diff --git a/features/api/interest-gauges/evolution-jauges.feature b/docs/domains/recommendation/features/interest-gauges/evolution-jauges.feature similarity index 100% rename from features/api/interest-gauges/evolution-jauges.feature rename to docs/domains/recommendation/features/interest-gauges/evolution-jauges.feature diff --git a/features/api/interest-gauges/jauge-initiale.feature b/docs/domains/recommendation/features/interest-gauges/jauge-initiale.feature similarity index 100% rename from features/api/interest-gauges/jauge-initiale.feature rename to docs/domains/recommendation/features/interest-gauges/jauge-initiale.feature diff --git a/features/api/interest-gauges/skip-abonnes-neutralisation.feature b/docs/domains/recommendation/features/interest-gauges/skip-abonnes-neutralisation.feature similarity index 100% rename from features/api/interest-gauges/skip-abonnes-neutralisation.feature rename to docs/domains/recommendation/features/interest-gauges/skip-abonnes-neutralisation.feature diff --git a/features/ui/recherche/filtres-avances.feature b/docs/domains/recommendation/features/recherche/filtres-avances.feature similarity index 100% rename from features/ui/recherche/filtres-avances.feature rename to docs/domains/recommendation/features/recherche/filtres-avances.feature diff --git a/features/ui/recherche/page-resultats-carte.feature b/docs/domains/recommendation/features/recherche/page-resultats-carte.feature similarity index 100% rename from features/ui/recherche/page-resultats-carte.feature rename to docs/domains/recommendation/features/recherche/page-resultats-carte.feature diff --git a/features/ui/recherche/recherche.feature b/docs/domains/recommendation/features/recherche/recherche.feature similarity index 100% rename from features/ui/recherche/recherche.feature rename to docs/domains/recommendation/features/recherche/recherche.feature diff --git a/features/api/recommendation/README.md b/docs/domains/recommendation/features/recommendation/README.md similarity index 98% rename from features/api/recommendation/README.md rename to docs/domains/recommendation/features/recommendation/README.md index 296f4e5..7cd25f2 100644 --- a/features/api/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](../../docs/regles-metier/04-algorithme-recommandation.md) +Tests BDD pour la section [04-algorithme-recommandation.md](../rules/algorithme-recommandation.md) ## Fichiers de tests diff --git a/features/api/recommendation/classification-geo.feature b/docs/domains/recommendation/features/recommendation/classification-geo.feature similarity index 100% rename from features/api/recommendation/classification-geo.feature rename to docs/domains/recommendation/features/recommendation/classification-geo.feature diff --git a/features/api/recommendation/contenu-politique.feature b/docs/domains/recommendation/features/recommendation/contenu-politique.feature similarity index 100% rename from features/api/recommendation/contenu-politique.feature rename to docs/domains/recommendation/features/recommendation/contenu-politique.feature diff --git a/features/api/recommendation/declenchement-geo.feature b/docs/domains/recommendation/features/recommendation/declenchement-geo.feature similarity index 100% rename from features/api/recommendation/declenchement-geo.feature rename to docs/domains/recommendation/features/recommendation/declenchement-geo.feature diff --git a/features/api/recommendation/historique-reproposition.feature b/docs/domains/recommendation/features/recommendation/historique-reproposition.feature similarity index 100% rename from features/api/recommendation/historique-reproposition.feature rename to docs/domains/recommendation/features/recommendation/historique-reproposition.feature diff --git a/features/api/recommendation/medias-traditionnels.feature b/docs/domains/recommendation/features/recommendation/medias-traditionnels.feature similarity index 100% rename from features/api/recommendation/medias-traditionnels.feature rename to docs/domains/recommendation/features/recommendation/medias-traditionnels.feature diff --git a/features/api/recommendation/mode-kids.feature b/docs/domains/recommendation/features/recommendation/mode-kids.feature similarity index 100% rename from features/api/recommendation/mode-kids.feature rename to docs/domains/recommendation/features/recommendation/mode-kids.feature diff --git a/features/api/recommendation/parametrabilite-admin.feature b/docs/domains/recommendation/features/recommendation/parametrabilite-admin.feature similarity index 100% rename from features/api/recommendation/parametrabilite-admin.feature rename to docs/domains/recommendation/features/recommendation/parametrabilite-admin.feature diff --git a/features/api/recommendation/parametrabilite-utilisateur.feature b/docs/domains/recommendation/features/recommendation/parametrabilite-utilisateur.feature similarity index 100% rename from features/api/recommendation/parametrabilite-utilisateur.feature rename to docs/domains/recommendation/features/recommendation/parametrabilite-utilisateur.feature diff --git a/features/api/recommendation/scoring-recommandation.feature b/docs/domains/recommendation/features/recommendation/scoring-recommandation.feature similarity index 100% rename from features/api/recommendation/scoring-recommandation.feature rename to docs/domains/recommendation/features/recommendation/scoring-recommandation.feature diff --git a/features/api/search/geolocation-search.feature b/docs/domains/recommendation/features/search/geolocation-search.feature similarity index 100% rename from features/api/search/geolocation-search.feature rename to docs/domains/recommendation/features/search/geolocation-search.feature diff --git a/docs/regles-metier/04-algorithme-recommandation.md b/docs/domains/recommendation/rules/algorithme-recommandation.md similarity index 100% rename from docs/regles-metier/04-algorithme-recommandation.md rename to docs/domains/recommendation/rules/algorithme-recommandation.md diff --git a/docs/regles-metier/03-centres-interet-jauges.md b/docs/domains/recommendation/rules/centres-interet-jauges.md similarity index 100% rename from docs/regles-metier/03-centres-interet-jauges.md rename to docs/domains/recommendation/rules/centres-interet-jauges.md diff --git a/docs/regles-metier/05-interactions-navigation.md b/docs/domains/recommendation/rules/interactions-navigation.md similarity index 100% rename from docs/regles-metier/05-interactions-navigation.md rename to docs/domains/recommendation/rules/interactions-navigation.md diff --git a/docs/gherkin-moderation-overview.md b/docs/gherkin-moderation-overview.md index eee42f2..744ac3e 100644 --- a/docs/gherkin-moderation-overview.md +++ b/docs/gherkin-moderation-overview.md @@ -1,8 +1,8 @@ # 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](regles-metier/14-moderation-flows.md) -- [15-moderation-communautaire.md](regles-metier/15-moderation-communautaire.md) +- [14-moderation-flows.md](domains/moderation/rules/moderation-flows.md) +- [15-moderation-communautaire.md](domains/moderation/rules/moderation-communautaire.md) ## Structure des Features @@ -249,8 +249,8 @@ npm run test:e2e ## Documentation Liée -- [Règles métier - Modération Flows](regles-metier/14-moderation-flows.md) -- [Règles métier - Modération Communautaire](regles-metier/15-moderation-communautaire.md) +- [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) diff --git a/docs/interfaces/README.md b/docs/interfaces/README.md new file mode 100644 index 0000000..7e551db --- /dev/null +++ b/docs/interfaces/README.md @@ -0,0 +1,58 @@ +# 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 new file mode 100644 index 0000000..e69de29 diff --git a/docs/interfaces/assets/web/.gitkeep b/docs/interfaces/assets/web/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docs/interfaces/mobile/navigation.md b/docs/interfaces/mobile/navigation.md new file mode 100644 index 0000000..93561a0 --- /dev/null +++ b/docs/interfaces/mobile/navigation.md @@ -0,0 +1,208 @@ +# 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/docs/mobile/permissions-strategy.md b/docs/mobile/permissions-strategy.md index 60e634b..05060e1 100644 --- a/docs/mobile/permissions-strategy.md +++ b/docs/mobile/permissions-strategy.md @@ -852,8 +852,8 @@ void main() { ## Références - **ADR-010** : [Frontend Mobile](../adr/010-frontend-mobile.md) -- **Règle 05** : [Mode Piéton](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides) -- **Règle 02** : [Conformité RGPD](../regles-metier/02-conformite-rgpd.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) - **Android Guidelines** : [Request Background Location](https://developer.android.com/training/location/permissions#request-background-location) diff --git a/docs/mobile/testflight-validation-plan.md b/docs/mobile/testflight-validation-plan.md index 2c4e743..01d03b0 100644 --- a/docs/mobile/testflight-validation-plan.md +++ b/docs/mobile/testflight-validation-plan.md @@ -609,7 +609,7 @@ Location Data : - [Stratégie Permissions](permissions-strategy.md) - [ADR-010 Frontend Mobile](../adr/010-frontend-mobile.md) -- [Règle 05 Mode Piéton](../regles-metier/05-interactions-navigation.md) +- [Règle 05 Mode Piéton](../domains/recommendation/rules/interactions-navigation.md) --- diff --git a/docs/regles-metier/README.md b/docs/regles-metier/README.md deleted file mode 100644 index af43bf6..0000000 --- a/docs/regles-metier/README.md +++ /dev/null @@ -1,296 +0,0 @@ -# Règles métier RoadWave - -> Documentation complète des règles métier validées pour l'application RoadWave. -> Chaque section détaille les comportements, flux et décisions techniques. - ---- - -## 📋 Table des matières - ---- - -## 🏗️ Fondations & Compte utilisateur - -### [01. Authentification & Inscription](01-authentification-inscription.md) - -**Contenu** : Inscription, connexion, récupération de compte - -- Inscription : email/password uniquement (pas d'OAuth tiers) -- Vérification email : optionnelle auditeurs (limite 5 contenus), obligatoire créateurs (lien expire 7j) -- Connexion : 5 tentatives max, blocage 15 min, refresh token 30j -- Récupération mot de passe : email, lien expire 1h - ---- - -### [02. Conformité RGPD](02-conformite-rgpd.md) - -**Contenu** : Consentements, anonymisation, export, suppression - -- Consentement : Tarteaucitron.js + PostgreSQL versioning -- GPS précis : 24h puis geohash 5 (~5km²) -- Export : JSON + HTML + audio → ZIP, génération asynchrone sous 48h, expire 7j -- Suppression : grace period 30j, contenus créés anonymisés (créateur = "Utilisateur supprimé") -- Analytics : Matomo self-hosted, IP anonymisées, 0 cookie tiers -- DPO : fondateur formé CNIL (non obligatoire <250 employés) - ---- - -## 🎧 Consommation de contenu (Auditeur) - -### [03. Centres d'intérêt et jauges](03-centres-interet-jauges.md) - -**Contenu** : Évolution jauges, valeurs initiales - -- Like automatique : écoute ≥80% → +2%, écoute 30-79% → +1% -- Like explicite (manuel) : +2% (cumulable avec auto) -- Abonnement : +5% -- Skip rapide (<10s) : -0.5% -- Valeur initiale : 50% (neutre) -- Limites : 0-100% stricte, pas de dégradation temporelle - ---- - -### [04. Algorithme de recommandation](04-algorithme-recommandation.md) - -**Contenu** : Scoring, géolocalisation, orientation politique, mode Kids - -- Classification géo : Ancré (70%) / Contextuel (50%) / Neutre (20%) -- Engagement : 20%, Aléatoire : 10% -- Orientation politique : 5 niveaux, équilibre imposé (40/40/20) -- Mode Kids : 4 tranches (3-6 / 6-9 / 9-12 / 13-15 ans), activation auto <13 ans -- Historique : >80% jamais reproposer, <10s ne pas reproposer - ---- - -### [05. Interactions et navigation](05-interactions-navigation.md) - -**Contenu** : Commandes Suivant/Précédent, interactions volant, lecture en boucle - -- Suivant : pré-calcul 5 contenus, recalcul >10km ou 10 min -- Précédent : <10s → contenu avant, ≥10s → replay début -- Commandes volant : Suivant, Précédent, Play/Pause uniquement -- Like automatique : ≥80% écoute → +2 points, 30-79% → +1 point -- Actions manuelles : bouton cœur (arrêt véhicule) ou vocal (CarPlay/Android Auto) -- Passage auto après 2s (1s mode Kids) - ---- - -### [06. Audio-guides multi-séquences](06-audio-guides-multi-sequences.md) - -**Contenu** : Modes déplacement, navigation, déclenchement GPS, publicités - -- **4 modes** : 🚶 Piéton (manuel) / 🚗 Voiture (GPS auto + manuel) / 🚴 Vélo / 🚌 Transport -- **Mode Piéton** : pause auto après chaque séquence, user clique Suivant, navigation libre -- **Mode Voiture** : déclenchement GPS auto (rayon 30m), boutons manuels actifs, warning sécurité >10 km/h -- **Affichage voiture** : distance temps réel + ETA + direction (flèche) + vitesse -- **Rayons** : Voiture 30m, Vélo 50m, Transport 100m (configurable créateur 10-200m) -- **Publicités** : 1/5 séquences tous modes, auto-play, skippable 5s -- **Reprise** : sauvegarde auto (séquence + position exacte), popup si <30j, multi-device (sync cloud) - ---- - -### [07. Contenus géolocalisés voiture](07-contenus-geolocalises-voiture.md) - -**Contenu** : Expérience voiture, UI minimaliste, sécurité - -- Interface voiture : minimaliste, boutons larges (80×80px min), lecture auto-play -- Commandes vocales : OK Google/Siri + CarPlay/Android Auto -- Notifications : in-app uniquement (pas de push), badge discret -- Sécurité : warning si interaction manuelle >10 km/h -- Mode nuit : automatique selon luminosité GPS ou heure (22h-6h) - ---- - -### [08. Mode offline](08-mode-offline.md) - -**Contenu** : Téléchargement, validité, synchronisation - -- Zone géographique : choix manuel (autour de moi / ville / département / région) -- Nombre contenus : gratuit 50 max, Premium illimité -- WiFi par défaut, mobile avec confirmation + estimation volume -- Validité : 30 jours, renouvellement auto si WiFi (contenus >25 jours) -- Sync : likes/abonnements batch auto à reconnexion, queue actions 7j max - ---- - -### [09. Abonnements et notifications](09-abonnements-notifications.md) - -**Contenu** : Impact algorithme, notifications, audio-guides, limites - -- Boost +30% au score final (pas priorité absolue) -- Détection contexte : <5 km/h piéton, >10 km/h voiture -- Voiture : in-app uniquement, Piéton : push actives -- Limite 10 notifications push/jour (5-20), mode silencieux 22h-8h -- Audio-guide piéton : détection <100m lieu, page sélection, navigation manuelle -- Max 200 abonnements, +5% jauges tous tags créateur - ---- - -### [10. Gestion des erreurs](10-gestion-erreurs.md) - -**Contenu** : Aucun contenu, contenu supprimé, perte réseau, GPS désactivé - -- Aucun contenu : élargissement auto 50km → 100km → département → région → national -- Contenu supprimé : laisser terminer, passage auto suivant après 2s -- Perte réseau : buffer adaptatif (WiFi 5-120s, 4G 10-120s, 3G 30-300s), retry 5s max 6× -- GPS désactivé : mode dégradé (contenu national + neutre + téléchargé) - ---- - -## 🎙️ Création de contenu (Créateur) - -### [11. Création et publication de contenu](11-creation-publication-contenu.md) - -**Contenu** : Upload, métadonnées, validation, modification - -- Formats : MP3, AAC (.mp3, .aac, .m4a), max 200 MB, 4h -- Métadonnées obligatoires : titre, type géo, zone, tags (1-3), classification âge -- Validation 3 premiers contenus : 24-48h (modération RoadWave) -- Modification : métadonnées uniquement, pas audio/zone/classification - ---- - -### [12. Radio live](12-radio-live.md) - -**Contenu** : Démarrage, arrêt, comportement auditeur - -- Buffer 15s avant diffusion publique, durée max 8h -- Notification push abonnés dans zone géo uniquement -- Arrêt : compte à rebours 5s (manuel) ou auto si déco ≥60s -- Enregistrement auto MP3 256 kbps → replay sous 5-10 min -- Auditeur : buffer 15s, continuation si sortie zone, AUCUN chat - ---- - -### [13. Détection de contenu protégé](13-detection-contenu-protege.md) - -**Contenu** : Droits d'auteur, détection musique, sanctions, fair use - -- Périmètre MVP : musique uniquement (films/livres exclus) -- Fair use : extraits ≤30s autorisés si usage transformatif (critique/analyse) -- Détection : manuelle lors des 3 premiers contenus (coût 0€) -- Sanctions progressives : Avertissement → Strike 1 (3j) → Strike 2 (7j) → Strike 3 (30j) → Strike 4 (ban) -- Réhabilitation : -1 strike tous les 6 mois sans incident -- Appel : réutilise processus section 14, délai 72h, preuve licence acceptée -- Post-MVP : Chromaprint + MusicBrainz si >50 signalements/mois (50-100€/mois) - ---- - -## 🛡️ Modération & Sécurité - -### [14. Modération - Flows opérationnels](14-moderation-flows.md) - -**Contenu** : Signalement, traitement, sanctions - -- Signalement : 7 catégories (haine, sexuel, illégalité, droits auteur, spam, fake news, autre) -- IA pré-filtre : Whisper large-v3 (transcription) + NLP open source (1-10 min) -- SLA : Critique <2h (24/7), Haute/Moyenne <24h, Basse <72h -- Notification sanction : email + push + in-app (détail complet : catégorie, timestamp, transcription) -- Appel : formulaire in-app, délai 7j max, réponse 72h garanti (standard) - ---- - -### [15. Modération Communautaire - Badges et Récompenses](15-moderation-communautaire.md) - -**Contenu** : Système badges, score fiabilité, récompenses, anti-abus - -- **3 niveaux badges** : 🥉 Bronze (5 validés), 🥈 Argent (20 validés), 🥇 Or (50 validés) -- **Modal découverte** : affichage unique au 1er signalement, message gratifiant -- **Score fiabilité** : calcul auto pour priorisation algorithme (0-100 points) -- **Utilisateurs de confiance** : statut auto Argent/Or, traitement prioritaire <12h -- **Réduction Premium Or** : -50% pendant 3 mois (2.49€ au lieu de 4.99€), Post-MVP -- **Anti-abus** : limite 10 signalements/24h, audit trimestriel, révocation badges -- **ROI** : positif dès 2-3 utilisateurs Or (économie modération > coût réductions) -- **Coût MVP** : 0€ / **Coût Post-MVP** : 0-200€/mois - ---- - -## 💰 Monétisation & Business - -### [16. Publicités](16-publicites.md) - -**Contenu** : Campagnes, fréquence, insertion, facturation - -- Interface self-service, budget min 50€, étalement paramétrable -- Fréquence : 1/5 contenus (gratuits uniquement) -- Durée : 10-60s (recommandé 15-30s), skippable après 5s -- Validation manuelle 24-48h, prépaiement Mangopay -- Facturation : écoute complète 0.05€, skip après 5s : 0.02€, skip immédiat : 0€ - ---- - -### [17. Premium](17-premium.md) - -**Contenu** : Offre, multi-devices, avantages, gestion abonnement - -- Prix : 4.99€/mois OU 49.99€/an (4.16€/mois effectif) -- Pas d'essai gratuit, pas de partage familial (MVP) -- Multi-devices : 1 seul stream actif, détection connexion simultanée -- Avantages : 0 pub, contenus exclusifs 👑, qualité 64 kbps Opus, offline illimité -- Paiement : Mangopay (web) ou IAP iOS/Android 5.99€/mois (+30% commission) - ---- - -### [18. Monétisation créateurs](18-monetisation-createurs.md) - -**Contenu** : Activation, KYC, sources revenus, paiement - -- Conditions : compte ≥3 mois, ≥500 abonnés, ≥10K écoutes, 0 strike, ≥5 contenus/90j -- KYC via Mangopay Connect : SIRET, TVA, RIB pro, pièce ID, Kbis <3 mois -- Revenus pub : 3€ / 1000 écoutes complètes (6% CA pub) -- Revenus Premium : 70% créateur, 30% plateforme (proportionnel temps écoute) -- Paiement : seuil 50€, mensuel (15 du mois suivant), SEPA Mangopay - ---- - -## 🔧 Fonctionnalités transverses - -### [19. Autres comportements](19-autres-comportements.md) - -**Contenu** : Partage, profil créateur, recherche - -- Partage : bouton partout, lien `roadwave.fr/share/c/[id]`, web player + deep link -- Profil créateur : @pseudo, bio (300 car), stats publiques arrondies, badge vérifié ✓ -- Badge vérifié : KYC validé OU célébrité OU >10K abonnés -- Recherche : full-text PostgreSQL (français, stemming), recherche géo (Nominatim OSM) -- Filtres : type, durée, âge, géo, tags, date, premium (combinables) -- Affichage : liste enrichie (20/page, infinite scroll) + vue carte Leaflet - ---- - -## 🗂️ Organisation - -Chaque fichier de règles métier suit la structure : - -1. **Décisions** : choix validés avec justifications -2. **Comportements détaillés** : flux utilisateur, cas limites -3. **Paramètres** : valeurs exactes, seuils, durées -4. **Points d'attention Gherkin** : éléments à tester - ---- - -## 🚀 Utilisation - -Ces documents servent de **référence unique** pour : - -- ✅ Développement backend/frontend -- ✅ Écriture des tests Gherkin (BDD) -- ✅ Validation QA -- ✅ Documentation produit - -**Prochaine étape** : Création des fichiers `.feature` Gherkin dans `features/` basés sur ces règles. - ---- - -## 📊 Statistiques - -- **19 sections** validées -- **~14 500 lignes** de spécifications détaillées -- **Coût infrastructure MVP** : ~50-250€/mois (hors salaires) -- **Coût Post-MVP** : +0-200€/mois (réductions Premium contributeurs Or) -- **Technologies** : 100% open source (sauf Mangopay paiements) - ---- - -**Dernière mise à jour** : Janvier 2026 -**Statut** : ✅ Toutes sections validées + Modération communautaire ajoutée diff --git a/features/ui/interest-gauges/degradation-temporelle.feature b/features/ui/interest-gauges/degradation-temporelle.feature deleted file mode 100644 index e572496..0000000 --- a/features/ui/interest-gauges/degradation-temporelle.feature +++ /dev/null @@ -1,142 +0,0 @@ -# language: fr -Fonctionnalité: Pas de dégradation temporelle des jauges - En tant que système de recommandation - Je veux que les jauges n'évoluent que par les actions utilisateur - Afin d'avoir un comportement prévisible et fiable - - Contexte: - Étant donné que l'API RoadWave est disponible - Et qu'un utilisateur est connecté - - Scénario: Aucune dégradation automatique avec le temps - Étant donné que ma jauge "Économie" est à 80% - Et que je n'écoute aucun contenu pendant 30 jours - Quand je me reconnecte après 30 jours - Alors ma jauge "Économie" est toujours à 80% - Et aucune dégradation temporelle n'a été appliquée - - Scénario: Jauges conservées après 6 mois d'inactivité - Étant donné que mes jauges sont: - | catégorie | niveau | - | Automobile | 75% | - | Voyage | 60% | - | Musique | 45% | - Et que je pars en vacances pendant 6 mois sans utiliser l'app - Quand je me reconnecte après 6 mois - Alors mes jauges sont exactement les mêmes: - | catégorie | niveau | - | Automobile | 75% | - | Voyage | 60% | - | Musique | 45% | - - Scénario: Évolution naturelle par les actions - Étant donné que j'aimais "Économie" il y a 1 an (jauge 80%) - Et que depuis, je skip tous les contenus "Économie" - Et que j'ai skippé 50 contenus "Économie" en 1 an - Alors ma jauge "Économie" descend naturellement via les skips - Et atteint environ 55% (80% - 50 × 0.5% = 55%) - Et la dégradation vient des actions, pas du temps - - Scénario: Pas de cron job de dégradation - Étant donné que le système vérifie les jauges quotidiennement - Quand un utilisateur n'a pas d'activité depuis 90 jours - Alors aucun job de dégradation n'est exécuté - Et les jauges restent inchangées - Et aucune ressource CPU n'est consommée pour la dégradation - - Scénario: Comportement prévisible après absence - Étant donné que ma jauge "Sport" était à 70% - Et que je n'utilise pas l'app pendant 1 an - Quand je reviens et demande des recommandations - Alors mes recommandations reflètent toujours mes goûts d'avant - Et je reçois du contenu "Sport" prioritaire - Et le comportement est cohérent et prévisible - - Scénario: Réinitialiser manuellement mes centres d'intérêt - Étant donné que je veux repartir de zéro - Quand je vais dans les paramètres - Et que je clique sur "Réinitialiser mes centres d'intérêt" - Et que je confirme l'action - Alors toutes mes jauges reviennent à 50% - Et je vois le message "Vos centres d'intérêt ont été réinitialisés" - - Scénario: Confirmation avant réinitialisation - Étant donné que je suis dans les paramètres - Quand je clique sur "Réinitialiser mes centres d'intérêt" - Alors je vois un message de confirmation: - | titre | Êtes-vous sûr ? | - | message | Cette action remettra toutes vos jauges à 50% | - | actions | Confirmer / Annuler | - - Scénario: Annuler la réinitialisation - Étant donné que j'ai cliqué sur "Réinitialiser mes centres d'intérêt" - Et que la confirmation est affichée - Quand je clique sur "Annuler" - Alors mes jauges ne sont pas modifiées - Et je reviens aux paramètres - - Scénario: Raison de réinitialisation - changement de vie - Étant donné que j'utilisais RoadWave pour mes trajets professionnels - Et que mes jauges reflétaient "Économie" (85%) et "Technologie" (75%) - Et que je change de vie et deviens musicien - Quand je réinitialise mes centres d'intérêt - Alors je peux repartir avec toutes les jauges à 50% - Et découvrir du contenu "Musique" et "Culture" sans biais - - Scénario: Pas de suggestion automatique de réinitialisation - Étant donné que je n'ai pas utilisé l'app depuis 1 an - Quand je me reconnecte - Alors aucune suggestion de réinitialisation n'est affichée - Et mes jauges sont conservées telles quelles - Et je garde le contrôle total - - Scénario: Historique conservé après réinitialisation - Étant donné que j'ai écouté 500 contenus - Quand je réinitialise mes centres d'intérêt - Alors mes jauges reviennent à 50% - Mais mon historique d'écoute est conservé - Et je peux toujours consulter mes anciens contenus écoutés - - Scénario: Évolution future basée sur nouvelles actions - Étant donné que j'ai réinitialisé mes jauges à 50% - Quand j'écoute 5 contenus "Voyage" à >80% - Alors ma jauge "Voyage" monte à 60% (50% + 5 × 2%) - Et l'algorithme recommence à apprendre mes nouvelles préférences - - Scénario: Respect de l'historique utilisateur - Étant donné qu'un utilisateur aime "Cryptomonnaie" depuis 2 ans - Et que sa jauge est à 90% - Quand 2 ans s'écoulent sans dégradation temporelle - Alors sa jauge reste à 90% - Car l'historique de ses goûts est respecté - Et le système ne fait pas d'"oubli" artificiel - - Scénario: Coût infrastructure zéro - Étant donné qu'aucune dégradation temporelle n'existe - Quand le système calcule les jauges - Alors aucun calcul de date n'est nécessaire - Et aucun batch nocturne ne tourne - Et aucun bug de fuseau horaire ne peut survenir - Et le coût CPU est minimal - - Scénario: UX prévisible - jauge = actions - Étant donné qu'un utilisateur consulte sa jauge "Sport" à 65% - Quand il se demande pourquoi elle est à 65% - Alors il peut retracer ses actions: - | action | impact | - | 10 likes automatiques | +10% | - | 3 abonnements Sport | +15% | - | 5 skips de contenu non-Sport| 0% | - Et il comprend que c'est le reflet exact de ses actions - Et il n'y a pas de mystère ou automatisme caché - - Scénario: Statistiques affichées sans date - Étant donné que je consulte mes centres d'intérêt - Quand je vois mes jauges - Alors je vois: - | information | affiché | - | Niveau actuel | ✅ 75% | - | Évolution depuis début | ✅ +25% | - | Dernière mise à jour | ❌ | - Et aucune date n'est affichée car non pertinente - Et seules les actions comptent diff --git a/features/ui/interest-gauges/evolution-jauges.feature b/features/ui/interest-gauges/evolution-jauges.feature deleted file mode 100644 index ffc528c..0000000 --- a/features/ui/interest-gauges/evolution-jauges.feature +++ /dev/null @@ -1,237 +0,0 @@ -# language: fr -Fonctionnalité: Évolution des jauges d'intérêt - En tant que système de recommandation - Je veux faire évoluer les jauges d'intérêt selon les actions utilisateur - Afin d'affiner les recommandations personnalisées - - Contexte: - Étant donné que l'API RoadWave est disponible - Et qu'un utilisateur est connecté - - Scénario: Like automatique renforcé après écoute ≥80% - Étant donné qu'un contenu de 5 minutes est tagué "Automobile" - Et que ma jauge "Automobile" est à 45% - Quand j'écoute le contenu pendant 4 minutes 30 secondes (90%) - Alors je reçois un like automatique renforcé - Et ma jauge "Automobile" augmente de 2% - Et ma jauge "Automobile" est maintenant à 47% - - Scénario: Like automatique renforcé exactement à 80% - Étant donné qu'un contenu de 10 minutes est tagué "Voyage" - Et que ma jauge "Voyage" est à 60% - Quand j'écoute le contenu pendant exactement 8 minutes (80%) - Alors je reçois un like automatique renforcé - Et ma jauge "Voyage" augmente de 2% - Et ma jauge "Voyage" est maintenant à 62% - - Scénario: Like automatique standard après écoute 30-79% - Étant donné qu'un contenu de 5 minutes est tagué "Automobile" - Et que ma jauge "Automobile" est à 45% - Quand j'écoute le contenu pendant 2 minutes 30 secondes (50%) - Alors je reçois un like automatique standard - Et ma jauge "Automobile" augmente de 1% - Et ma jauge "Automobile" est maintenant à 46% - - Scénario: Like automatique standard à 30% exactement - Étant donné qu'un contenu de 10 minutes est tagué "Musique" - Et que ma jauge "Musique" est à 40% - Quand j'écoute le contenu pendant exactement 3 minutes (30%) - Alors je reçois un like automatique standard - Et ma jauge "Musique" augmente de 1% - - Scénario: Like automatique standard à 79% - Étant donné qu'un contenu de 10 minutes est tagué "Sport" - Et que ma jauge "Sport" est à 55% - Quand j'écoute le contenu pendant 7 minutes 54 secondes (79%) - Alors je reçois un like automatique standard - Et ma jauge "Sport" augmente de 1% - Et ma jauge "Sport" est maintenant à 56% - - Scénario: Like explicite (manuel) +2% - Étant donné qu'un contenu est tagué "Économie" - Et que ma jauge "Économie" est à 70% - Quand j'écoute le contenu partiellement - Et que je clique manuellement sur le bouton "Like" - Alors ma jauge "Économie" augmente de 2% - Et ma jauge "Économie" est maintenant à 72% - - Scénario: Like manuel cumulable avec like automatique - Étant donné qu'un contenu de 5 minutes est tagué "Automobile" - Et que ma jauge "Automobile" est à 45% - Quand j'écoute le contenu pendant 2 minutes 30 secondes (50%) - Alors je reçois un like automatique standard (+1%) - Quand je clique ensuite sur le bouton "Like" - Alors ma jauge augmente encore de 2% (like manuel) - Et ma jauge "Automobile" a augmenté de 3% au total - Et ma jauge "Automobile" est maintenant à 48% - - Scénario: Abonnement créateur impacte tous ses tags - Étant donné qu'un créateur publie des contenus tagués "Automobile" et "Technologie" - Et que mes jauges sont: - | catégorie | niveau | - | Automobile | 50% | - | Technologie | 45% | - Quand je m'abonne à ce créateur - Alors ma jauge "Automobile" augmente de 5% - Et ma jauge "Technologie" augmente de 5% - Et mes nouvelles jauges sont: - | catégorie | niveau | - | Automobile | 55% | - | Technologie | 50% | - - Scénario: Désabonnement créateur retire les bonus de tous ses tags - Étant donné qu'un créateur publie des contenus tagués "Voyage" et "Culture générale" - Et que mes jauges sont: - | catégorie | niveau | - | Voyage | 65% | - | Culture générale | 58% | - Et que je suis abonné à ce créateur - Quand je me désabonne de ce créateur - Alors ma jauge "Voyage" diminue de 5% - Et ma jauge "Culture générale" diminue de 5% - Et mes nouvelles jauges sont: - | catégorie | niveau | - | Voyage | 60% | - | Culture générale | 53% | - - Scénario: Skip rapide (<10s) diminue la jauge - Étant donné qu'un contenu est tagué "Économie" - Et que ma jauge "Économie" est à 45% - Quand je skip le contenu après 5 secondes - Alors ma jauge "Économie" diminue de 0.5% - Et ma jauge "Économie" est maintenant à 44.5% - - Scénario: Skip à exactement 10s ne diminue pas la jauge - Étant donné qu'un contenu est tagué "Politique" - Et que ma jauge "Politique" est à 50% - Quand je skip le contenu après exactement 10 secondes - Alors ma jauge "Politique" ne change pas - Et reste à 50% - - Scénario: Skip à exactement 30% déclenche like auto puis skip neutre - Étant donné qu'un contenu de 10 minutes est tagué "Musique" - Et que ma jauge "Musique" est à 60% - Quand j'écoute pendant 3 minutes (30%) - Alors je reçois un like automatique standard (+1%) - Quand je skip ensuite - Alors ma jauge "Musique" ne diminue pas (signal neutre) - Et ma jauge "Musique" est maintenant à 61% (like auto déjà appliqué) - - Scénario: Skip tardif entre 30% et 79% ne diminue pas la jauge - Étant donné qu'un contenu de 10 minutes est tagué "Sport" - Et que ma jauge "Sport" est à 55% - Quand j'écoute pendant 5 minutes (50%) - Alors je reçois un like automatique standard (+1%) - Et ma jauge "Sport" est maintenant à 56% - Quand je skip après avoir écouté 50% - Alors ma jauge "Sport" ne diminue pas - Et reste à 56% - - Scénario: Contenu avec plusieurs tags impacte toutes les jauges - Étant donné qu'un contenu est tagué "Automobile" et "Voyage" - Et que mes jauges sont: - | catégorie | niveau | - | Automobile | 45% | - | Voyage | 60% | - Quand j'écoute le contenu à 90% - Alors les deux jauges augmentent de 2% - Et mes nouvelles jauges sont: - | catégorie | niveau | - | Automobile | 47% | - | Voyage | 62% | - - Scénario: Contenu avec 3 tags impacte les 3 jauges - Étant donné qu'un contenu est tagué "Sport", "Santé" et "Technologie" - Et que mes jauges sont à 50% pour chaque catégorie - Quand je skip rapidement après 5 secondes - Alors les 3 jauges diminuent de 0.5% - Et toutes passent à 49.5% - - Scénario: Jauges bornées - ne peut pas dépasser 100% - Étant donné que ma jauge "Cryptomonnaie" est à 99% - Et qu'un contenu tagué "Cryptomonnaie" est disponible - Quand j'écoute le contenu à 95% (like auto renforcé +2%) - Alors ma jauge "Cryptomonnaie" passe à 100% (maximum) - Et ne dépasse pas 100% - - Scénario: Jauges bornées - ne peut pas descendre sous 0% - Étant donné que ma jauge "Politique" est à 0.3% - Et qu'un contenu tagué "Politique" est disponible - Quand je skip rapidement après 3 secondes (-0.5%) - Alors ma jauge "Politique" passe à 0% (minimum) - Et ne devient pas négative - - Scénario: Désabonnement avec jauge proche de 0% respecte la borne - Étant donné qu'un créateur publie des contenus tagués "Économie" - Et que ma jauge "Économie" est à 3% - Et que je suis abonné à ce créateur - Quand je me désabonne de ce créateur - Alors ma jauge "Économie" devrait diminuer de 5% - Mais elle passe à 0% (minimum respecté) - Et ne devient pas négative - - Scénario: Écoute entre 10s et 30% n'impacte pas la jauge - Étant donné qu'un contenu de 10 minutes est tagué "Santé" - Et que ma jauge "Santé" est à 50% - Quand j'écoute pendant 2 minutes (20%) - Et que je skip ensuite - Alors ma jauge "Santé" ne change pas - Et reste à 50% - Car l'écoute est entre 10s (pas de pénalité) et 30% (pas de like auto) - - Scénario: Calcul immédiat à chaque action - Étant donné que ma jauge "Voyage" est à 50% - Quand j'écoute un contenu "Voyage" à 85% - Alors la jauge est mise à jour immédiatement (pas de batch) - Et passe à 52% - Quand je demande mes recommandations dans la seconde suivante - Alors l'algorithme utilise déjà la valeur 52% - - Scénario: Like manuel après écoute <30% (pas de like auto) - Étant donné qu'un contenu de 10 minutes est tagué "Culture" - Et que ma jauge "Culture" est à 60% - Quand j'écoute pendant 2 minutes (20%) - Alors je ne reçois pas de like automatique - Quand je clique sur le bouton "Like" - Alors ma jauge "Culture" augmente de 2% uniquement - Et ma jauge "Culture" est maintenant à 62% - - Scénario: Unlike retire le like manuel - Étant donné que j'ai liké manuellement un contenu "Sport" - Et que ma jauge "Sport" est passée de 55% à 57% (+2%) - Quand je clique sur "Unlike" - Alors ma jauge "Sport" diminue de 2% - Et ma jauge "Sport" revient à 55% - - Scénario: Unlike ne peut pas retirer un like automatique - Étant donné que j'ai écouté un contenu "Musique" à 90% - Et que j'ai reçu un like automatique renforcé (+2%) - Et que ma jauge "Musique" est à 52% - Quand j'essaie de faire "Unlike" - Alors l'action n'est pas disponible - Et ma jauge reste à 52% - Car les likes automatiques ne peuvent pas être retirés - - Scénario: Tags définis par créateur à la publication - Étant donné que je suis un créateur - Quand je publie un contenu - Alors je dois sélectionner 1 à 3 tags - Et ces tags sont fixés après publication - Et impacteront les jauges de tous les auditeurs - - Plan du Scénario: Calculs avec différentes durées d'écoute - Étant donné qu'un contenu de 10 minutes est tagué "Voyage" - Et que ma jauge "Voyage" est à 50% - Quand j'écoute pendant () - Alors ma jauge évolue de - Et ma nouvelle jauge est à - - Exemples: - | duree | pourcentage | impact | nouveau_niveau | - | 1 min | 10% | 0% | 50% | - | 3 min | 30% | +1% | 51% | - | 5 min | 50% | +1% | 51% | - | 7.9 min | 79% | +1% | 51% | - | 8 min | 80% | +2% | 52% | - | 9.5 min | 95% | +2% | 52% | - | 5 sec | <1% | -0.5% | 49.5% | diff --git a/features/ui/interest-gauges/jauge-initiale.feature b/features/ui/interest-gauges/jauge-initiale.feature deleted file mode 100644 index 11a69d6..0000000 --- a/features/ui/interest-gauges/jauge-initiale.feature +++ /dev/null @@ -1,147 +0,0 @@ -# language: fr -Fonctionnalité: Jauge initiale et cold start - En tant que nouvel utilisateur - Je veux que mes jauges d'intérêt démarrent de manière neutre - Afin de découvrir du contenu sans biais initial - - Contexte: - Étant donné que l'API RoadWave est disponible - - Scénario: Inscription - toutes les jauges à 50% - Quand je m'inscris sur RoadWave - Alors toutes mes jauges d'intérêt sont initialisées à 50% - Et je ne dois pas remplir de questionnaire - Et l'inscription est ultra-rapide - - Scénario: Liste des catégories disponibles - Étant donné que je suis un nouvel utilisateur - Quand je consulte mes centres d'intérêt - Alors je vois les catégories suivantes à 50%: - | catégorie | - | Automobile | - | Voyage | - | Famille | - | Amour | - | Musique | - | Économie | - | Cryptomonnaie | - | Politique | - | Culture générale | - | Sport | - | Technologie | - | Santé | - - Scénario: Cold start - premier contenu écouté - Étant donné que je viens de m'inscrire - Et que toutes mes jauges sont à 50% - Quand j'écoute mon premier podcast "Automobile" à 90% - Alors ma jauge "Automobile" monte à 52% (+2%) - Et toutes les autres jauges restent à 50% - - Scénario: Cold start - premier skip - Étant donné que je viens de m'inscrire - Et que toutes mes jauges sont à 50% - Quand je skip rapidement un contenu "Économie" - Alors ma jauge "Économie" descend à 49.5% (-0.5%) - Et toutes les autres jauges restent à 50% - - Scénario: Après 10 écoutes, profil commence à se dessiner - Étant donné que je suis un nouvel utilisateur - Et que j'ai écouté: - | contenu | tags | completion | - | Contenu 1 | Automobile | 90% | - | Contenu 2 | Automobile, Sport | 85% | - | Contenu 3 | Voyage | 75% | - | Contenu 4 | Économie | skip 5s | - | Contenu 5 | Automobile | 95% | - | Contenu 6 | Sport | 80% | - | Contenu 7 | Politique | skip 8s | - | Contenu 8 | Voyage | 88% | - | Contenu 9 | Automobile | 92% | - | Contenu 10 | Technologie | 40% | - Alors mes jauges reflètent mes préférences: - | catégorie | tendance | - | Automobile | Forte hausse (>55%) | - | Voyage | Hausse modérée (~53%) | - | Sport | Hausse modérée (~53%) | - | Économie | Baisse légère (~49.5%) | - | Politique | Baisse légère (~49.5%) | - | Technologie | Neutre (~51%) | - - Scénario: Pas de questionnaire onboarding par défaut - Quand je termine l'inscription - Alors aucun questionnaire de centres d'intérêt n'est affiché - Et je peux commencer à écouter immédiatement - Et l'algorithme apprend naturellement - - Scénario: Algorithme avec jauges à 50% - chances égales - Étant donné que toutes mes jauges sont à 50% - Quand l'algorithme calcule les recommandations - Alors tous les types de contenus ont une chance égale - Et aucun biais initial n'est appliqué - Et la géolocalisation prime sur les intérêts - - Scénario: Questionnaire optionnel après 3 écoutes (post-MVP) - Étant donné que j'ai écouté 3 contenus - Quand je termine ma 3ème écoute - Alors je vois une notification in-app optionnelle: - | titre | Améliorez vos recommandations | - | message | Sélectionnez vos centres d'intérêt | - | actions | Configurer maintenant / Plus tard | - - Scénario: Remplir le questionnaire optionnel (post-MVP) - Étant donné que le questionnaire optionnel est affiché - Quand je sélectionne les centres d'intérêt suivants: - | catégorie | - | Automobile | - | Voyage | - | Sport | - Alors les jauges sélectionnées passent à 70% - Et les jauges non sélectionnées passent à 30% - Et je vois le message "Vos préférences ont été enregistrées" - - Scénario: Skipper le questionnaire optionnel (post-MVP) - Étant donné que le questionnaire optionnel est affiché - Quand je clique sur "Plus tard" - Alors toutes mes jauges conservent 50% - Et l'algorithme continue d'apprendre naturellement - Et je ne suis plus sollicité - - Scénario: Comportement déterministe et testable - Étant donné deux nouveaux utilisateurs A et B - Quand les deux s'inscrivent au même moment - Alors leurs jauges sont identiques (toutes à 50%) - Et leurs recommandations initiales sont identiques (basées sur géo uniquement) - - Scénario: Équité entre créateurs au cold start - Étant donné qu'un nouvel utilisateur s'inscrit - Et qu'il existe 1000 contenus de catégories variées dans sa zone - Quand l'algorithme génère les premières recommandations - Alors tous les contenus ont une pondération intérêts identique (50%) - Et seuls la géolocalisation et l'engagement différencient les contenus - Et aucun créateur n'a d'avantage initial - - Scénario: Catégories extensibles - Étant donné que RoadWave ajoute une nouvelle catégorie "Gastronomie" - Quand je consulte mes centres d'intérêt - Alors je vois la nouvelle catégorie "Gastronomie" à 50% - Et je peux commencer à l'explorer normalement - - Scénario: Voir l'évolution de mes jauges - Étant donné que je suis un utilisateur avec historique - Quand je consulte mes centres d'intérêt dans les paramètres - Alors je vois mes jauges actuelles: - | catégorie | niveau | evolution | - | Automobile | 67% | +17% | - | Voyage | 82% | +32% | - | Économie | 34% | -16% | - | Sport | 50% | 0% | - Et je comprends mes préférences actuelles - - Scénario: Friction zéro à l'inscription - Étant donné que je veux m'inscrire rapidement - Quand je remplis les 4 champs obligatoires - Et que je clique sur "S'inscrire" - Alors mon compte est créé immédiatement - Et je peux commencer à écouter dans les 30 secondes - Et aucune configuration supplémentaire n'est requise diff --git a/features/ui/recommendation/filtrage-politique-ui.feature b/features/ui/recommendation/filtrage-politique-ui.feature deleted file mode 100644 index f394805..0000000 --- a/features/ui/recommendation/filtrage-politique-ui.feature +++ /dev/null @@ -1,234 +0,0 @@ -# language: fr -Fonctionnalité: UI - Filtrage contenu politique - En tant qu'utilisateur - Je veux contrôler mon exposition au contenu politique - Afin d'adapter mon expérience selon mes préférences - - Contexte: - Étant donné que l'application RoadWave est ouverte - Et que je suis connecté - - Scénario: Accéder aux paramètres de contenu politique - Quand j'ouvre les paramètres - Et que je clique sur "Contenu politique" - Alors je vois l'écran "Gestion du contenu politique" - Et je vois trois options: - | option | icône | description | - | Masquer | 🚫 | 0% de contenus politiques | - | Équilibré | ⚖️ | Selon vos intérêts (défaut) | - | Mes préférences | ❤️ | Basé sur votre jauge "Politique" | - - Scénario: Option "Équilibré" par défaut - Étant donné que je suis un nouvel utilisateur - Quand je consulte les paramètres de contenu politique - Alors l'option "Équilibré" est sélectionnée par défaut - Et je vois "(Recommandé)" à côté - Et je vois la description: - """ - Les contenus politiques sont recommandés selon - l'algorithme standard (intérêts, géo, engagement) - - Votre jauge "Politique" actuelle: 50% - """ - - Scénario: Sélectionner l'option "Masquer" - Étant donné que l'option "Équilibré" est active - Quand je clique sur le bouton radio "Masquer" - Alors l'option "Masquer" est sélectionnée - Et je vois l'icône 🚫 "Aucun contenu politique" - Et je vois un message de confirmation: - """ - Tous les contenus tagués "Politique" seront - exclus de vos recommandations. - - Vous ne verrez aucun contenu politique. - """ - Et je vois "Sauvegarder" en bas de l'écran - - Scénario: Sauvegarder l'option "Masquer" - Étant donné que j'ai sélectionné "Masquer" - Quand je clique sur "Sauvegarder" - Alors je vois une animation de confirmation - Et je vois "Contenu politique masqué ✓" - Et je retourne à l'écran précédent - Et un badge "🚫 Politique" apparaît sur l'écran principal (optionnel) - - Scénario: Badge indicateur sur l'écran principal - Étant donné que j'ai activé "Masquer contenu politique" - Quand je retourne à l'écran principal - Alors je vois un petit badge "🚫" en haut - Et en tapant dessus, je vois "Contenu politique masqué" - Et je peux accéder rapidement aux paramètres - - Scénario: Recommandations sans contenu politique - Étant donné que j'ai activé "Masquer contenu politique" - Quand je consulte mes recommandations - Alors je ne vois aucun contenu tagué "Politique" - Et je vois "Filtré: Politique masqué" en bas de l'écran - Et tous les contenus affichés n'ont pas le tag "Politique" - - Scénario: Sélectionner l'option "Mes préférences" - Quand je clique sur le bouton radio "Mes préférences" - Alors l'option "Mes préférences" est sélectionnée - Et je vois l'icône ❤️ "Selon votre jauge" - Et je vois: - """ - Les contenus politiques seront recommandés - selon votre jauge "Politique" - - Votre jauge actuelle: 45% - Plus vous écoutez de contenu politique, plus - vous en recevrez de recommandations. - """ - - Scénario: Recherche avec filtrage politique actif - Étant donné que j'ai activé "Masquer contenu politique" - Quand je recherche "actualités France" - Alors les résultats excluent les contenus tagués "Politique" - Et je vois "Résultats filtrés (Politique masqué)" - - Scénario: Recherche explicite contenu politique malgré filtre - Étant donné que j'ai activé "Masquer contenu politique" - Quand je recherche en filtrant par tag "Politique" - Alors les contenus politiques sont affichés - Et je vois un avertissement: - """ - ⚠️ Recherche explicite de contenu politique - - Vos paramètres masquent ce type de contenu, - mais vous avez fait une recherche explicite. - """ - - Scénario: Partage de contenu politique avec filtre actif - Étant donné que j'ai activé "Masquer contenu politique" - Et qu'un ami me partage un lien vers un contenu politique - Quand j'ouvre le lien - Alors je vois un avertissement: - """ - 🚫 Contenu politique - - Ce contenu est tagué "Politique" et est - normalement masqué par vos paramètres. - - Voulez-vous l'écouter quand même? - """ - Et je peux choisir "Écouter" ou "Retour" - - Scénario: Confirmer l'écoute de contenu politique partagé - Étant donné que je vois l'avertissement de contenu politique partagé - Quand je clique sur "Écouter" - Alors le contenu se lance normalement - Et je vois le tag "Politique" bien visible - Et le contenu ne réactive pas le filtrage politique - - Scénario: Désactiver le filtrage politique - Étant donné que j'ai activé "Masquer contenu politique" - Quand je retourne aux paramètres de contenu politique - Et que je sélectionne "Équilibré" - Et que je sauvegarde - Alors le filtrage est levé - Et je vois "Contenu politique à nouveau visible" - Et le badge "🚫" disparaît de l'écran principal - - Scénario: Statistiques sur contenu politique masqué - Étant donné que j'ai activé "Masquer contenu politique" depuis 30 jours - Quand je consulte mes statistiques - Alors je vois: - | métrique | valeur | - | Contenus politiques masqués | 142 | - | Depuis | 30 j | - | Contenus écoutés sans politique| 85 | - - Scénario: Notification de contenu politique disponible - Étant donné que j'ai activé "Masquer contenu politique" - Et qu'un événement politique majeur se produit dans ma région - Quand RoadWave a des contenus pertinents tagués "Politique" - Alors je reçois une notification optionnelle: - """ - 📰 Actualités locales importantes - - Des contenus politiques pertinents sont disponibles - dans votre zone. - - Vos paramètres masquent ce type de contenu. - Modifier les paramètres? - """ - Et je peux ignorer ou modifier mes paramètres - - Scénario: Mode Kids force le masquage politique - Étant donné que le Mode Kids est activé - Quand je consulte les paramètres de contenu politique - Alors l'option "Masquer" est sélectionnée et verrouillée - Et je vois "(Forcé par Mode Kids)" - Et je ne peux pas modifier ce paramètre - Et les autres options sont grisées - - Scénario: Désactiver Mode Kids déverrouille filtrage politique - Étant donné que le Mode Kids est activé - Et que le filtrage politique est forcé - Quand je désactive le Mode Kids - Alors les options de filtrage politique sont déverrouillées - Et je peux sélectionner "Équilibré" ou "Mes préférences" - - Scénario: Jauge "Politique" visible dans les paramètres - Étant donné que je suis sur l'écran de contenu politique - Et que l'option "Mes préférences" est sélectionnée - Quand je consulte ma jauge "Politique" - Alors je vois une barre de progression: ▓▓▓▓▓▒▒▒▒▒ 45% - Et je vois "Plus vous écoutez, plus votre jauge augmente" - - Scénario: Impact du filtrage sur les recommandations - Étant donné que j'ai activé "Masquer contenu politique" - Quand je consulte mes recommandations - Alors je vois "12 contenus disponibles (Politique masqué)" - Et je sais combien de contenus sont exclus - - Scénario: Créer profil avec filtrage politique personnalisé - Étant donné que je crée un profil "🚗 Trajet quotidien" - Quand je configure le paramètre "Politique" sur "Masquer" - Alors ce profil masque automatiquement le contenu politique - Quand je crée un profil "🛣️ Road trip" - Et que je configure "Politique" sur "Équilibré" - Alors ce profil affiche le contenu politique selon l'algorithme - - Scénario: Switch entre profils avec paramètres politiques différents - Étant donné que le profil "Trajet quotidien" masque le contenu politique - Et que le profil "Road trip" affiche le contenu politique - Quand je passe de "Trajet quotidien" à "Road trip" - Alors le contenu politique réapparaît dans les recommandations - Et je vois "Contenu politique visible (profil Road trip)" - - Scénario: Tooltip explicatif sur les options - Quand je tape sur l'icône ℹ️ à côté de "Équilibré" - Alors je vois un tooltip: - """ - Équilibré (Recommandé) - - Les contenus politiques sont recommandés comme - tout autre contenu, selon l'algorithme standard. - - Votre jauge "Politique" évolue naturellement - selon vos écoutes. - """ - - Scénario: Message MVP - pas de classification gauche/droite - Quand je consulte l'écran de contenu politique - Alors je vois en bas: - """ - ℹ️ Version MVP - - Actuellement, les contenus sont simplement tagués - "Politique" sans classification gauche/droite. - - Des options avancées seront disponibles dans - une future version. - """ - - Scénario: Export RGPD inclut historique filtrage politique - Étant donné que j'ai modifié mes paramètres politiques 3 fois - Quand je demande l'export RGPD - Alors l'export inclut: - | information | inclus | - | Historique paramètre politique| ✅ | - | Dates de modification | ✅ | - | Contenus politiques masqués | ✅ | diff --git a/features/ui/recommendation/mode-kids-ui.feature b/features/ui/recommendation/mode-kids-ui.feature deleted file mode 100644 index 1bcb064..0000000 --- a/features/ui/recommendation/mode-kids-ui.feature +++ /dev/null @@ -1,261 +0,0 @@ -# language: fr -Fonctionnalité: UI - Mode Kids pour utilisateurs 13-15 ans - En tant que parent ou adolescent - Je veux activer et utiliser le Mode Kids facilement - Afin de protéger les mineurs des contenus inappropriés - - Contexte: - Étant donné que l'application RoadWave est ouverte - Et que je suis connecté - - Scénario: Activer le Mode Kids depuis les paramètres - Étant donné que je suis un utilisateur de 14 ans - Et que le Mode Kids n'est pas activé - Quand j'ouvre les paramètres - Et que je clique sur "Mode Kids" - Alors je vois l'écran "Mode Kids" - Et je vois un toggle désactivé - Et je vois une description: - """ - Mode Kids (13-15 ans) - - Filtrage automatique: - ✓ Uniquement contenus "Tous publics" - ✓ Exclusion contenus 16+ et 18+ - ✓ Pas de contenu politique - ✓ Aucune publicité - - Interface standard, filtrage intelligent. - """ - - Scénario: Activer le toggle Mode Kids - Étant donné que je suis sur l'écran Mode Kids - Quand je bascule le toggle sur "Activé" - Alors je vois une animation de confirmation - Et le toggle devient vert - Et je vois le message "Mode Kids activé - Contenus filtrés pour 13-15 ans ✓" - Et un badge "🛡️ Mode Kids" apparaît sur l'écran principal - - Scénario: Badge Mode Kids visible sur l'écran principal - Étant donné que le Mode Kids est activé - Quand je retourne à l'écran principal - Alors je vois un badge "🛡️ Mode Kids" en haut à droite - Et ce badge est bien visible - Et je peux taper dessus pour accéder rapidement aux paramètres - - Scénario: Notification après activation Mode Kids - Quand j'active le Mode Kids - Alors je vois une notification détaillée: - """ - Mode Kids activé 🛡️ - - ✓ Contenus "Tous publics" uniquement - ✓ Contenus politiques masqués - ✓ Aucune publicité - - Vous pouvez désactiver ce mode à tout moment - dans les paramètres. - """ - Et je peux cliquer sur "Compris" - - Scénario: Filtrage visuel des contenus en Mode Kids - Étant donné que le Mode Kids est activé - Quand je consulte les recommandations - Alors je ne vois que des contenus avec le badge "Tous publics ✓" - Et aucun contenu 13+, 16+, ou 18+ n'est affiché - Et je vois "Filtré par Mode Kids" en bas de l'écran - - Scénario: Tentative d'accès à un contenu 16+ via lien partagé - Étant donné que le Mode Kids est activé - Et qu'un ami me partage un lien vers un contenu 16+ - Quand j'ouvre le lien - Alors je vois un écran de blocage: - """ - 🛡️ Contenu non accessible - - Ce contenu est classé 16+ et n'est pas - accessible en Mode Kids. - - Désactivez le Mode Kids dans les paramètres - pour accéder à ce contenu. - """ - Et je vois un bouton "Retour" - Et je ne peux pas accéder au contenu - - Scénario: Recherche filtrée en Mode Kids - Étant donné que le Mode Kids est activé - Quand je recherche "débat politique" - Alors seuls les contenus "Tous publics" apparaissent - Et je vois "Résultats filtrés (Mode Kids actif)" - Et les contenus politiques ou 16+ sont exclus - - Scénario: Aucune publicité en Mode Kids - Étant donné que le Mode Kids est activé - Et que je suis un utilisateur gratuit - Quand j'écoute plusieurs contenus - Alors aucune publicité n'est diffusée - Et je ne vois aucune interruption publicitaire - Et je vois "Écoute sans publicité (Mode Kids)" dans les paramètres - - Scénario: Désactiver le Mode Kids - Étant donné que le Mode Kids est activé - Quand j'ouvre les paramètres Mode Kids - Et que je bascule le toggle sur "Désactivé" - Alors je vois une confirmation "Désactiver le Mode Kids?" - Et je vois "Tous les contenus seront à nouveau accessibles" - Quand je confirme - Alors le Mode Kids est désactivé - Et le badge "🛡️ Mode Kids" disparaît - Et je vois "Mode Kids désactivé" - - Scénario: Parent active Mode Kids pour son enfant - Étant donné que je suis le parent d'un utilisateur de 13 ans - Et que j'ai accès au compte de mon enfant via contrôle parental - Quand j'active le Mode Kids - Et que je définis un code PIN parental - Alors le Mode Kids est activé sur le compte enfant - Et seul le code PIN peut le désactiver - - Scénario: Enfant essaie de désactiver Mode Kids avec PIN parental - Étant donné que le Mode Kids est activé avec PIN parental - Quand mon enfant essaie de désactiver le Mode Kids - Alors il voit un écran "Code PIN parental requis" - Et il doit saisir le code PIN à 4 chiffres - Si le code est incorrect - Alors je vois "Code incorrect" et le Mode Kids reste actif - - Scénario: Code PIN correct désactive le Mode Kids - Étant donné que le Mode Kids est activé avec PIN parental - Quand je saisis le code PIN correct - Alors le Mode Kids peut être désactivé - Et je vois "Mode Kids désactivé (autorisé par parent)" - - Scénario: Profil "Enfants" avec Mode Kids automatique - Étant donné que je crée un profil "👶 Enfants" - Quand j'active le Mode Kids dans ce profil - Alors le profil active automatiquement le Mode Kids - Et tous les autres paramètres sont forcés: - | paramètre | valeur | - | Politique | Masquer (verrouillé) | - | Publicité | Aucune (verrouillé) | - - Scénario: Switch entre profil normal et profil Kids - Étant donné que j'ai un profil "Road trip" (normal) - Et un profil "Enfants" (Mode Kids) - Quand je passe du profil "Road trip" à "Enfants" - Alors le Mode Kids s'active automatiquement - Et je vois "Mode Kids activé 🛡️" - Quand je repasse à "Road trip" - Alors le Mode Kids se désactive - Et je vois "Mode Kids désactivé" - - Scénario: Audio-guide accessible en Mode Kids - Étant donné que le Mode Kids est activé - Et qu'un audio-guide "Tous publics" existe au Louvre - Quand je suis à proximité du Louvre - Alors l'audio-guide est proposé normalement - Et toutes les séquences "Tous publics" sont accessibles - Et je vois le badge "Tous publics ✓" - - Scénario: Statistiques d'écoute en Mode Kids - Étant donné que le Mode Kids est activé - Quand je consulte mes statistiques - Alors je vois: - | métrique | valeur | - | Contenus écoutés (Mode Kids) | 45 | - | Heures d'écoute | 23h | - | Catégories favorites | Culture | - Et je vois "Mode Kids actif depuis le 15/01/2026" - - Scénario: Notification pour contenu inapproprié détecté - Étant donné que le Mode Kids est activé - Et qu'un contenu classé "Tous publics" contient du langage inapproprié signalé - Quand je commence l'écoute - Alors je vois un avertissement "Contenu signalé par la communauté" - Et je peux choisir "Continuer" ou "Passer" - - Scénario: Interface visuelle identique en Mode Kids - Étant donné que le Mode Kids est activé - Quand je navigue dans l'app - Alors l'interface est identique au mode normal - Et il n'y a pas d'interface "enfant" spéciale - Et seul le filtrage de contenu est actif - Et le badge "🛡️ Mode Kids" indique le mode actif - - Scénario: Badge "Tous publics" sur les contenus - Étant donné que le Mode Kids est activé - Quand je consulte les détails d'un contenu - Alors je vois clairement le badge "Tous publics ✓" - Et la classification d'âge est bien visible - Et je sais que le contenu est adapté - - Scénario: Onglet "Mode Kids" dans paramètres - Quand j'ouvre les paramètres - Alors je vois un onglet dédié "Mode Kids" - Et il est bien visible - Et je peux y accéder rapidement - - Scénario: Activer Mode Kids depuis un profil - Étant donné que je crée un nouveau profil - Quand je vois l'option "Activer Mode Kids pour ce profil" - Et que je l'active - Alors le Mode Kids est lié à ce profil uniquement - Et se désactive automatiquement quand je change de profil - - Scénario: Compteur de contenus disponibles en Mode Kids - Étant donné que le Mode Kids est activé - Quand je consulte l'écran Mode Kids dans les paramètres - Alors je vois "~2,450 contenus 'Tous publics' disponibles dans votre zone" - Et je sais qu'il y a suffisamment de contenu - - Scénario: Message explicatif pour utilisateurs 16+ - Étant donné que je suis un utilisateur de 18 ans - Quand j'active le Mode Kids - Alors je vois un message: - """ - Mode Kids activé - - Même si vous avez plus de 15 ans, ce mode - filtre les contenus 16+ et 18+. - - Seuls les contenus "Tous publics" seront accessibles. - """ - - Scénario: Désactivation automatique à 16 ans (optionnel) - Étant donné que je suis un utilisateur de 15 ans - Et que le Mode Kids est activé - Quand j'atteins 16 ans (anniversaire) - Alors je reçois une notification: - """ - 🎂 Joyeux anniversaire! - - Vous avez maintenant 16 ans. - Le Mode Kids peut être désactivé si vous le souhaitez. - - Accédez à tous les contenus adaptés à votre âge. - """ - Et je peux choisir de garder ou désactiver le Mode Kids - - Scénario: Export données RGPD inclut historique Mode Kids - Étant donné que le Mode Kids a été activé pendant 6 mois - Quand je demande l'export RGPD - Alors l'export inclut: - | information | inclus | - | Historique Mode Kids | ✅ | - | Dates activation/désactiv.| ✅ | - | Contenus écoutés filtrés | ✅ | - - Scénario: Onboarding Mode Kids pour nouveaux utilisateurs 13-15 ans - Étant donné que je m'inscris à RoadWave - Et que j'ai 14 ans - Quand je termine l'inscription - Alors je vois un écran de bienvenue: - """ - Bienvenue sur RoadWave! 👋 - - Nous avons détecté que vous avez 14 ans. - - Souhaitez-vous activer le Mode Kids? - Filtrage automatique pour contenus adaptés. - """ - Et je peux choisir "Activer" ou "Plus tard" diff --git a/features/ui/recommendation/notifications-geo.feature b/features/ui/recommendation/notifications-geo.feature deleted file mode 100644 index 98d25a1..0000000 --- a/features/ui/recommendation/notifications-geo.feature +++ /dev/null @@ -1,256 +0,0 @@ -# language: fr -Fonctionnalité: UI - Notifications géographiques - En tant qu'utilisateur - Je veux recevoir des notifications lors du passage près d'un point d'intérêt - Afin de découvrir du contenu géolocalisé pertinent - - Contexte: - Étant donné que l'application RoadWave est ouverte - Et que je suis connecté - Et que la géolocalisation est activée - - Scénario: Notification au passage <500m d'un point GPS - Étant donné qu'un contenu "géo-ancré" existe au Louvre - Et que j'écoute un podcast en cours - Quand je passe à 400m du point GPS du Louvre - Alors j'entends un bip court (notification sonore) - Et je vois une notification visuelle apparaître - Et la notification affiche: - | élément | valeur | - | Logo | 🏛️ (Culturel) | - | Titre | "Histoire du Louvre" | - | Distance | "À 400m" | - | Durée | "12 min" | - Et je dispose de 5 secondes pour réagir - - Scénario: Types de logos selon le contenu - Plan du Scénario: Logo selon le type de contenu - Étant donné qu'un contenu de type "" existe à proximité - Quand je reçois la notification - Alors je vois le logo "" - - Exemples: - | type | logo | - | Info | 📍 | - | Culturel | 🏛️ | - | Commercial | 🍴 | - | Événement | 🎭 | - - Scénario: Accepter la notification - lecture immédiate - Étant donné que je reçois une notification géo - Quand je clique sur "Écouter" dans les 5 secondes - Alors le contenu en cours s'arrête - Et le nouveau contenu se lance immédiatement - Et je vois "Lecture: Histoire du Louvre" - - Scénario: Accepter via bouton au volant - Étant donné que je reçois une notification géo - Et que je conduis - Quand j'appuie sur le bouton "Suivant" de mon volant - Alors le contenu géolocalisé se lance - Et je n'ai pas besoin de toucher l'écran - - Scénario: Accepter via commande vocale - Étant donné que je reçois une notification géo - Quand je dis "Écouter" - Alors le contenu géolocalisé se lance immédiatement - Et je garde les mains sur le volant - - Scénario: Ignorer la notification - délai 5 secondes - Étant donné que je reçois une notification géo - Quand je ne fais rien pendant 5 secondes - Alors la notification disparaît automatiquement - Et le contenu en cours continue normalement - Et le contenu géo est ajouté à la file d'attente - - Scénario: Notification ajoutée à la file si ignorée - Étant donné que j'ignore une notification géo - Quand je consulte ma file d'attente - Alors je vois le contenu "Histoire du Louvre" dans la liste - Et je peux l'écouter plus tard - - Scénario: Notification publicitaire - son différent - Étant donné qu'une publicité géolocalisée existe à proximité - Quand je passe à <500m - Alors j'entends un son différent (optionnel selon paramètres) - Et je vois le logo 🍴 "Restaurant local" - Et je vois "(Publicité)" bien visible - Et je peux accepter ou ignorer comme un contenu normal - - Scénario: Publicité ne coupe jamais le contenu en cours - Étant donné que j'écoute un podcast - Et qu'une pub géolocalisée existe à proximité - Quand je reçois la notification pub - Alors le podcast en cours continue sans interruption - Et la pub s'intercalera uniquement entre deux séquences si acceptée - - Scénario: Gestion du demi-tour - pas de re-notification - Étant donné que j'ai reçu une notification pour le Louvre - Et que j'ai ignoré la notification - Quand je fais demi-tour et repasse à <500m du Louvre - Alors je ne reçois pas de nouvelle notification - Et le contenu reste dans la file d'attente - - Scénario: Réinitialisation après 24h - Étant donné que j'ai ignoré une notification pour le Louvre - Et que 24 heures se sont écoulées - Quand je repasse à <500m du Louvre - Alors je reçois à nouveau la notification - Et je peux choisir de l'écouter - - Scénario: Notification visuelle discrète en mode conduite - Étant donné que je conduis à 50 km/h - Quand je reçois une notification géo - Alors la notification apparaît en bas de l'écran - Et elle est discrète pour ne pas distraire - Et le texte est lisible rapidement - Et l'animation est fluide - - Scénario: Compteur de temps restant pour accepter - Étant donné que je reçois une notification géo - Quand la notification s'affiche - Alors je vois un compteur circulaire "5...4...3...2...1" - Et le cercle se vide progressivement - Et je sais combien de temps il me reste - - Scénario: Balayer pour ignorer rapidement - Étant donné que je reçois une notification géo - Quand je balaye la notification vers la droite - Alors la notification disparaît immédiatement - Et le contenu est ajouté à la file d'attente - Et je vois "Ajouté à la file d'attente" - - Scénario: Balayer pour accepter rapidement - Étant donné que je reçois une notification géo - Quand je balaye la notification vers la gauche - Alors le contenu se lance immédiatement - Et je vois "Lecture: Histoire du Louvre" - - Scénario: Désactiver les notifications géo dans les paramètres - Étant donné que je suis dans les paramètres - Quand je désactive "Notifications géolocalisées" - Alors je ne reçois plus de notifications au passage de points GPS - Mais les contenus géo restent recommandés normalement dans la file - - Scénario: Régler le rayon de déclenchement - Étant donné que je suis dans les paramètres avancés - Quand je modifie "Rayon de notification" de 500m à 1000m - Alors les notifications se déclenchent à 1000m au lieu de 500m - Et je reçois les notifications plus tôt - - Scénario: Désactiver le son des notifications - Étant donné que je suis dans les paramètres audio - Quand je désactive "Son des notifications géo" - Alors je reçois uniquement les notifications visuelles - Et aucun bip n'est joué - - Scénario: Désactiver uniquement les pubs géolocalisées - Étant donné que je suis dans les paramètres - Quand je désactive "Publicités géolocalisées" - Alors je ne reçois plus de notifications pour les pubs - Mais je reçois toujours les notifications pour les contenus organiques - - Scénario: Notification en mode piéton - Étant donné que je suis en mode piéton (vitesse < 5 km/h) - Quand je passe à <500m d'un point GPS - Alors je reçois la notification normalement - Et la notification peut être plus détaillée (mode piéton) - Et je vois une miniature du contenu - - Scénario: Notification en mode voiture - Étant donné que je conduis à 70 km/h - Quand je reçois une notification géo - Alors la notification est ultra-simplifiée - Et je vois uniquement: Logo + Titre + "Écouter" - Et l'interface est adaptée à la conduite - - Scénario: Historique des notifications ignorées - Étant donné que j'ai ignoré 5 notifications géo aujourd'hui - Quand je consulte "Historique notifications" - Alors je vois la liste des 5 notifications ignorées: - | contenu | heure | lieu | - | Histoire du Louvre | 14:30 | Paris 1er | - | Restaurant local | 15:00 | Paris 8e | - | Musée d'Orsay | 15:45 | Paris 7e | - Et je peux les écouter depuis l'historique - - Scénario: Notification avec aperçu vocal (optionnel) - Étant donné que j'ai activé "Aperçu vocal" dans les paramètres - Quand je reçois une notification géo - Alors après le bip, j'entends: "Histoire du Louvre, 12 minutes, à 400 mètres" - Et je peux accepter vocalement en disant "Écouter" - - Scénario: Plusieurs notifications en cascade - Étant donné que je suis dans une zone dense (Paris) - Et qu'il y a 3 contenus géo-ancrés dans un rayon de 500m - Quand je passe à proximité - Alors je reçois la notification du contenu le plus proche en premier - Et les autres notifications sont espacées de 30 secondes minimum - Et je ne suis pas submergé de notifications - - Scénario: Priorisation des notifications par pertinence - Étant donné que 2 contenus sont à proximité: - | contenu | distance | score_intérêts | - | Audio-guide A | 300m | 0.9 | - | Podcast B | 250m | 0.3 | - Quand je dois recevoir une notification - Alors "Audio-guide A" est notifié en premier (score plus élevé) - Même si "Podcast B" est plus proche - - Scénario: Notification lors d'une pause - Étant donné que j'ai mis en pause mon contenu - Quand je passe à <500m d'un point GPS - Alors je reçois la notification normalement - Et si j'accepte, le nouveau contenu se lance - Et l'ancien contenu en pause reste en pause - - Scénario: Carte avec points d'intérêt à proximité - Étant donné que je consulte l'écran "Carte" - Quand je zoome sur ma position - Alors je vois des marqueurs pour tous les contenus géo-ancrés à <5km - Et chaque marqueur affiche le logo du type de contenu - Et je peux taper sur un marqueur pour voir les détails - - Scénario: Prévisualiser les notifications à venir sur itinéraire - Étant donné que j'ai saisi un itinéraire dans GPS - Quand je consulte "Contenus sur votre route" - Alors je vois la liste des contenus géo qui seront notifiés: - | contenu | dans | type | - | Histoire du Louvre | 5 min | 🏛️ Culturel | - | Restaurant local | 12min | 🍴 Commercial| - Et je peux pré-écouter ou ignorer d'avance - - Scénario: Annuler une notification en cours - Étant donné qu'une notification géo s'affiche - Et que le compteur est à 3 secondes - Quand je tape sur ❌ "Fermer" - Alors la notification disparaît immédiatement - Et le contenu est ajouté à la file d'attente - - Scénario: Badge compteur de notifications ignorées - Étant donné que j'ai ignoré 3 notifications géo - Quand je consulte l'écran principal - Alors je vois un badge "3" sur l'icône "File d'attente" - Et je sais qu'il y a 3 contenus géo en attente - - Scénario: Animation fluide de la notification - Quand une notification géo apparaît - Alors elle glisse du bas vers le haut de l'écran - Et l'animation dure 300ms - Et elle est fluide (60 FPS) - Et elle ne bloque pas l'interface principale - - Scénario: Notification en arrière-plan (app fermée) - Étant donné que l'app est fermée - Et que les notifications sont autorisées - Quand je passe à <500m d'un point GPS - Alors je reçois une notification push système: - """ - 🏛️ RoadWave - - Histoire du Louvre - À 400m • 12 min - - Ouvrir pour écouter - """ - Et en tapant dessus, l'app s'ouvre et le contenu peut être lancé diff --git a/features/ui/recommendation/parametres-personnalisation.feature b/features/ui/recommendation/parametres-personnalisation.feature deleted file mode 100644 index 96487ad..0000000 --- a/features/ui/recommendation/parametres-personnalisation.feature +++ /dev/null @@ -1,314 +0,0 @@ -# language: fr -Fonctionnalité: UI - Paramètres de personnalisation et profils - En tant qu'utilisateur - Je veux personnaliser mon expérience avec des curseurs et profils - Afin d'adapter l'application à mes différents contextes d'usage - - Contexte: - Étant donné que l'application RoadWave est ouverte - Et que je suis connecté - - Scénario: Accéder aux paramètres de personnalisation - Quand j'ouvre le menu principal - Et que je clique sur "Paramètres" - Et que je clique sur "Personnalisation" - Alors je vois l'écran "Personnalisation des recommandations" - Et je vois trois curseurs disponibles: - | curseur | icône | description | - | Géolocalisation | 📍 | Local ← slider → National | - | Découverte | 🎲 | 0% ← slider → 50% | - | Politique | ⚖️ | Masquer / Équilibré / Préféré | - - Scénario: Déplacer le curseur Géolocalisation vers Local - Étant donné que je suis sur l'écran de personnalisation - Et que le curseur Géolocalisation est au centre (défaut) - Quand je déplace le curseur vers la gauche (Local) - Alors le curseur se positionne à 30% (local) - Et je vois le texte "Recommandations locales privilégiées" - Et un indicateur visuel montre que la zone géographique est réduite - Et je vois "Portée: ~50 km" - - Scénario: Déplacer le curseur Géolocalisation vers National - Étant donné que je suis sur l'écran de personnalisation - Quand je déplace le curseur Géolocalisation vers la droite (National) - Alors le curseur se positionne à 80% (national) - Et je vois le texte "Découverte nationale activée" - Et je vois "Portée: toute la France" - Et une carte de France s'affiche avec la zone en surbrillance - - Scénario: Régler le curseur Découverte à 0% - Quand je déplace le curseur Découverte tout à gauche (0%) - Alors le curseur est à 0% - Et je vois l'icône 🎯 "Personnalisé max" - Et je vois le message "Aucune surprise, uniquement vos préférences" - Et un badge "0% aléatoire" s'affiche - - Scénario: Régler le curseur Découverte à 10% (défaut) - Quand je déplace le curseur Découverte à 10% - Alors je vois l'icône ⚖️ "Équilibré" - Et je vois "1 contenu sur 10 sera une découverte" - Et c'est marqué comme "(Recommandé)" - - Scénario: Régler le curseur Découverte à 30% - Quand je déplace le curseur Découverte à 30% - Alors je vois l'icône 🎲 "Découverte élevée" - Et je vois "3 contenus sur 10 seront des découvertes" - - Scénario: Régler le curseur Découverte à 50% (max) - Quand je déplace le curseur Découverte tout à droite (50%) - Alors je vois l'icône 🌍 "Découverte max" - Et je vois "50% de contenus aléatoires" - Et je vois le message "Explorez tout RoadWave!" - - Scénario: Sélectionner option Politique "Masquer" - Étant donné que le paramètre Politique est sur "Équilibré" (défaut) - Quand je clique sur le bouton radio "Masquer" - Alors l'option "Masquer contenu politique" est sélectionnée - Et je vois l'icône 🚫 "Aucun contenu politique" - Et je vois "0% de contenus tagués Politique" - - Scénario: Sélectionner option Politique "Équilibré" - Quand je clique sur le bouton radio "Équilibré" - Alors l'option est sélectionnée - Et je vois l'icône ⚖️ "Équilibré" - Et je vois "Contenu politique selon vos intérêts" (défaut MVP) - - Scénario: Sélectionner option Politique "Mes préférences" - Quand je clique sur le bouton radio "Mes préférences" - Alors l'option est sélectionnée - Et je vois l'icône ❤️ "Selon votre jauge Politique" - Et je vois "Basé sur votre jauge 'Politique': 45%" - - Scénario: Sauvegarder les modifications de paramètres - Étant donné que j'ai modifié les 3 curseurs - Quand je clique sur "Sauvegarder" - Alors je vois une animation de confirmation - Et je vois "Paramètres enregistrés ✓" - Et je retourne à l'écran précédent - Et les nouvelles recommandations utilisent ces paramètres - - Scénario: Annuler les modifications de paramètres - Étant donné que j'ai modifié les curseurs - Et que je n'ai pas sauvegardé - Quand je clique sur "Retour" - Alors je vois une popup "Sauvegarder les modifications?" - Et je vois deux boutons "Sauvegarder" et "Abandonner" - Quand je clique sur "Abandonner" - Alors les paramètres ne sont pas modifiés - Et je retourne à l'écran précédent - - Scénario: Créer un nouveau profil personnalisé - Étant donné que je suis sur l'écran de personnalisation - Quand je clique sur "Créer un profil" - Alors je vois un popup "Nouveau profil" - Et je peux saisir un nom de profil - Et je peux choisir une icône: - | icône | description | - | 🚗 | Trajet quotidien | - | 🛣️ | Road trip | - | 👶 | Enfants | - | 🏃 | Sport | - | 🎵 | Musique | - - Scénario: Créer profil "Trajet quotidien" - Quand je crée un profil nommé "Trajet quotidien" - Et que je choisis l'icône 🚗 - Et que je configure: - | paramètre | valeur | - | Géolocalisation | Local | - | Découverte | 5% | - | Politique | Masquer | - Et que je clique sur "Créer le profil" - Alors le profil "🚗 Trajet quotidien" est créé - Et je le vois dans la liste des profils - Et je vois "Profil créé avec succès" - - Scénario: Créer profil "Road trip" - Quand je crée un profil nommé "Road trip" - Et que je choisis l'icône 🛣️ - Et que je configure: - | paramètre | valeur | - | Géolocalisation | Régional | - | Découverte | 30% | - | Politique | Équilibré | - Alors le profil est créé et sauvegardé - - Scénario: Créer profil "Enfants" avec Mode Kids - Quand je crée un profil nommé "Enfants" - Et que je choisis l'icône 👶 - Et que j'active "Mode Kids" - Alors le profil est créé avec: - | paramètre | valeur | - | Mode Kids | Activé | - | Politique | Masquer (forcé) | - | Publicité | Aucune (forcé) | - Et les autres paramètres sont grisés/verrouillés - - Scénario: Afficher la liste des profils - Étant donné que j'ai créé 3 profils: - | nom | icône | actif | - | Trajet quotidien | 🚗 | Non | - | Road trip | 🛣️ | Oui | - | Enfants | 👶 | Non | - Quand je consulte l'écran de personnalisation - Alors je vois la section "Mes profils" - Et je vois mes 3 profils sous forme de cartes - Et le profil "Road trip" est marqué avec un badge "Actif" - - Scénario: Activer un profil existant - Étant donné que le profil "Road trip" est actif - Et que je vois le profil "Trajet quotidien" - Quand je clique sur la carte "Trajet quotidien" - Alors je vois un popup de confirmation "Activer ce profil?" - Et je vois un aperçu des paramètres du profil - Quand je confirme - Alors le profil "Trajet quotidien" devient actif - Et je vois une animation de transition - Et je vois "Profil 'Trajet quotidien' activé ✓" - Et le badge "Actif" se déplace sur ce profil - - Scénario: Indicateur visuel du profil actif - Étant donné que le profil "Road trip" est actif - Quand je consulte l'écran principal - Alors je vois en haut de l'écran un badge "🛣️ Road trip" - Et ce badge indique quel profil est actuellement utilisé - Et je peux taper dessus pour switcher rapidement - - Scénario: Switcher rapidement de profil depuis l'écran principal - Étant donné que je suis sur l'écran principal - Et que le profil "Road trip" est actif - Quand je tape sur le badge "🛣️ Road trip" - Alors je vois une liste déroulante de tous mes profils - Quand je sélectionne "🚗 Trajet quotidien" - Alors le profil change instantanément - Et je vois "Profil changé" - Et les recommandations se rechargent - - Scénario: Modifier un profil existant - Étant donné que j'ai un profil "Trajet quotidien" - Quand je fais un appui long sur la carte du profil - Alors je vois un menu contextuel avec: - | action | icône | - | Modifier | ✏️ | - | Dupliquer | 📋 | - | Supprimer | 🗑️ | - Quand je clique sur "Modifier" - Alors je peux modifier les paramètres du profil - Et je sauvegarde les changements - - Scénario: Dupliquer un profil - Étant donné que j'ai un profil "Road trip" - Quand je fais un appui long et choisis "Dupliquer" - Alors un nouveau profil "Road trip (copie)" est créé - Et il a les mêmes paramètres que l'original - Et je peux le renommer et modifier - - Scénario: Supprimer un profil - Étant donné que j'ai un profil "Ancien profil" - Quand je fais un appui long et choisis "Supprimer" - Alors je vois une confirmation "Supprimer ce profil?" - Quand je confirme - Alors le profil est supprimé - Et je vois "Profil supprimé" - - Scénario: Impossible de supprimer le profil actif - Étant donné que le profil "Road trip" est actif - Quand je fais un appui long et choisis "Supprimer" - Alors je vois "Impossible de supprimer le profil actif" - Et je dois d'abord activer un autre profil - - Scénario: Synchronisation profils entre devices - Étant donné que j'ai créé 2 profils sur mon iPhone - Quand je me connecte sur mon iPad - Alors je vois mes 2 profils automatiquement synchronisés - Et le profil actif sur iPhone est aussi actif sur iPad - Et je vois "Profils synchronisés depuis iPhone" - - Scénario: Modification profil synchronisée en temps réel - Étant donné que j'ai ouvert l'app sur iPhone et iPad - Quand je modifie un profil sur iPhone - Alors le profil est mis à jour sur iPad en temps réel - Et je vois une notification "Profil mis à jour" sur iPad - - Scénario: Auto-switch selon contexte (détection trajet) - Étant donné que j'ai un profil "Trajet quotidien" - Et que l'option "Auto-switch intelligent" est activée - Quand l'app détecte que je suis sur mon trajet habituel (GPS récurrent) - Alors le profil "Trajet quotidien" s'active automatiquement - Et je vois une notification "Profil 'Trajet quotidien' activé" - Et je peux annuler en 5 secondes - - Scénario: Désactiver l'auto-switch intelligent - Étant donné que l'auto-switch est activé - Quand je désactive l'option dans les paramètres - Alors aucun changement automatique de profil n'est fait - Et je garde le contrôle total - - Scénario: Limitation nombre de profils - Étant donné que j'ai créé 5 profils (maximum) - Quand j'essaie de créer un 6ème profil - Alors je vois "Limite de 5 profils atteinte" - Et je dois supprimer un profil pour en créer un nouveau - - Scénario: Blocage modification paramètres en conduite - Étant donné que je suis en conduite (vitesse GPS > 10 km/h) - Quand j'essaie d'ouvrir les paramètres de personnalisation - Alors l'accès est bloqué - Et je vois "⚠️ Configurez avant de prendre la route" - Et je dois arrêter le véhicule pour modifier - - Scénario: Warning au lancement app - Quand je lance l'application pour la première fois - Alors je vois un message de bienvenue - Et je vois "Configurez vos préférences avant de prendre la route" - Et je peux accéder directement aux paramètres - Ou "Configurer plus tard" - - Scénario: Profil par défaut pour nouveaux utilisateurs - Étant donné que je viens de m'inscrire - Quand j'ouvre l'app pour la première fois - Alors un profil "Par défaut" est créé automatiquement - Et il a les paramètres standards: - | paramètre | valeur | - | Géolocalisation | Équilibré | - | Découverte | 10% | - | Politique | Équilibré | - - Scénario: Prévisualisation des modifications en temps réel - Étant donné que je modifie le curseur Géolocalisation - Quand je déplace le curseur - Alors je vois une prévisualisation en temps réel: - | élément | affichage | - | Rayon géographique | Cercle sur mini-carte | - | Nombre contenus impactés | "~250 contenus à proximité"| - | Distance max | "100 km" | - - Scénario: Tooltip explicatif sur chaque curseur - Quand je tape sur l'icône ℹ️ à côté du curseur Géolocalisation - Alors je vois un tooltip explicatif: - """ - Géolocalisation - - Local: Privilégie les contenus très proches (< 50 km) - National: Découvrez des contenus de toute la France - - Idéal en Local pour les trajets quotidiens, - en National pour les road trips. - """ - - Scénario: Exporter/Importer profils - Étant donné que j'ai configuré mes profils parfaitement - Quand je clique sur "Exporter mes profils" - Alors un fichier JSON est généré - Et je peux le partager avec un autre appareil - Quand j'importe ce fichier sur un autre appareil - Alors tous mes profils sont restaurés - - Scénario: Reset profils aux valeurs par défaut - Étant donné que j'ai modifié tous mes paramètres - Quand je clique sur "Réinitialiser aux valeurs par défaut" - Alors je vois une confirmation - Quand je confirme - Alors tous les profils sont supprimés - Et un profil "Par défaut" est recréé - Et je vois "Paramètres réinitialisés" diff --git a/mkdocs.yml b/mkdocs.yml index 7902f4c..f965076 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -87,50 +87,70 @@ nav: - 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md - 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md - 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md - - Règles Métier: - - Introduction: regles-metier/README.md - - Fondations & Compte: - - '01: Authentification': regles-metier/01-authentification-inscription.md - - '02: Conformité RGPD': regles-metier/02-conformite-rgpd.md - - Consommation de contenu: - - '03: Centres Intérêt': regles-metier/03-centres-interet-jauges.md - - '04: Algorithme Recommandation': regles-metier/04-algorithme-recommandation.md - - '05: Interactions Navigation': regles-metier/05-interactions-navigation.md - - '06: Audio-guides': regles-metier/06-audio-guides-multi-sequences.md - - '07: Contenus Voiture': regles-metier/07-contenus-geolocalises-voiture.md - - '08: Mode Offline': regles-metier/08-mode-offline.md - - '09: Abonnements': regles-metier/09-abonnements-notifications.md - - '10: Gestion Erreurs': regles-metier/10-gestion-erreurs.md - - Création de contenu: - - '11: Création Contenu': regles-metier/11-creation-publication-contenu.md - - '12: Radio Live': regles-metier/12-radio-live.md - - '13: Contenu Protégé': regles-metier/13-detection-contenu-protege.md - - Modération & Sécurité: - - '14: Modération': regles-metier/14-moderation-flows.md - - '15: Modération Communautaire': regles-metier/15-moderation-communautaire.md - - Monétisation & Business: - - '16: Publicités': regles-metier/16-publicites.md - - '17: Premium': regles-metier/17-premium.md - - '18: Monétisation Créateurs': regles-metier/18-monetisation-createurs.md - - Transverse: - - '19: Autres Comportements': regles-metier/19-autres-comportements.md - - 'Annexe: Post-MVP': regles-metier/ANNEXE-POST-MVP.md - - Diagrammes: - - Flux: - - 'Processus de signalement': diagrammes/flux/moderation-signalement.md - - États: - - 'Cycle de vie signalement': diagrammes/etats/signalement-lifecycle.md - - Séquences: - - "Processus d'appel modération": diagrammes/sequence/processus-appel-moderation.md - - Entités: - - 'Modèle global': diagrammes/entites/modele-global.md - - 'Modèle recommandation': diagrammes/entites/modele-recommandation.md - - 'Modèle publicités': diagrammes/entites/modele-publicites.md - - 'Modèle premium': diagrammes/entites/modele-premium.md - - 'Modèle monétisation': diagrammes/entites/modele-monetisation.md - - 'Modèle audio-guides': diagrammes/entites/modele-audio-guides.md - - 'Modèle radio live': diagrammes/entites/modele-radio-live.md - - 'Modèle modération': diagrammes/entites/modele-moderation.md + - Domaines DDD: + - 'Context Map': domains/README.md + - 'Core Domain': + - '🔐 Shared': domains/_shared/README.md + - Règles: + - Authentification: domains/_shared/rules/authentification.md + - RGPD: domains/_shared/rules/rgpd.md + - Gestion Erreurs: domains/_shared/rules/gestion-erreurs.md + - 'Annexe Post-MVP': domains/_shared/rules/ANNEXE-POST-MVP.md + - Entités: + - Modèle Global: domains/_shared/entities/modele-global.md + - 'Supporting Subdomains': + - '🎯 Recommendation': + - Vue d'ensemble: domains/recommendation/README.md + - Règles: + - Centres Intérêt: domains/recommendation/rules/centres-interet-jauges.md + - Algorithme: domains/recommendation/rules/algorithme-recommandation.md + - Interactions: domains/recommendation/rules/interactions-navigation.md + - Entités: + - Modèle Recommandation: domains/recommendation/entities/modele-recommandation.md + - '🎙️ Content': + - Vue d'ensemble: domains/content/README.md + - Règles: + - Création & Publication: domains/content/rules/creation-publication.md + - Audio-guides: domains/content/rules/audio-guides.md + - Radio Live: domains/content/rules/radio-live.md + - Contenus Géolocalisés: domains/content/rules/contenus-geolocalises.md + - Contenu Protégé: domains/content/rules/detection-contenu-protege.md + - Entités: + - Modèle Audio-guides: domains/content/entities/modele-audio-guides.md + - Modèle Radio Live: domains/content/entities/modele-radio-live.md + - '🛡️ Moderation': + - Vue d'ensemble: domains/moderation/README.md + - Règles: + - Modération: domains/moderation/rules/moderation-flows.md + - Modération Communautaire: domains/moderation/rules/moderation-communautaire.md + - Autres Comportements: domains/moderation/rules/autres-comportements.md + - Entités: + - Modèle Modération: domains/moderation/entities/modele-moderation.md + - Diagrammes: + - '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 + - 'Generic Subdomains': + - '📢 Advertising': + - Vue d'ensemble: domains/advertising/README.md + - Règles: + - Publicités: domains/advertising/rules/publicites.md + - Entités: + - Modèle Publicités: domains/advertising/entities/modele-publicites.md + - '💎 Premium': + - Vue d'ensemble: domains/premium/README.md + - Règles: + - Premium: domains/premium/rules/premium.md + - Mode Offline: domains/premium/rules/mode-offline.md + - Abonnements: domains/premium/rules/abonnements-notifications.md + - Entités: + - Modèle Premium: domains/premium/entities/modele-premium.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 - Documentation Légale: - Introduction: legal/README.md - "Conditions Générales d'Utilisation": legal/cgu.md @@ -151,9 +171,6 @@ nav: - Architecture & Techniques: - Séquences: - 'Cache Géospatial': architecture/sequences/cache-geospatial.md - - Modération (Gherkin): - - "Vue d'ensemble": gherkin-moderation-overview.md - - Tests BDD: bdd/ extra: social: diff --git a/scripts/fix-markdown-links.sh b/scripts/fix-markdown-links.sh new file mode 100755 index 0000000..649cc68 --- /dev/null +++ b/scripts/fix-markdown-links.sh @@ -0,0 +1,141 @@ +#!/bin/bash +# Script pour corriger les liens internes dans la documentation après refactorisation DDD + +set -e + +echo "🔗 Correction des liens internes dans la documentation..." + +# Fonction pour corriger les liens dans les fichiers du domaine _shared +fix_shared_links() { + echo " → Correction des liens dans _shared..." + find docs/domains/_shared -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/01-authentification-inscription.md|../rules/authentification.md|g' \ + -e 's|../../regles-metier/02-conformite-rgpd.md|../rules/rgpd.md|g' \ + -e 's|../../regles-metier/10-gestion-erreurs.md|../rules/gestion-erreurs.md|g' \ + -e 's|modele-global.md|../entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine recommendation +fix_recommendation_links() { + echo " → Correction des liens dans recommendation..." + find docs/domains/recommendation -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/03-centres-interet-jauges.md|../rules/centres-interet-jauges.md|g' \ + -e 's|../../regles-metier/04-algorithme-recommandation.md|../rules/algorithme-recommandation.md|g' \ + -e 's|../../regles-metier/05-interactions-navigation.md|../rules/interactions-navigation.md|g' \ + -e 's|../../docs/regles-metier/04-algorithme-recommandation.md|../rules/algorithme-recommandation.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine content +fix_content_links() { + echo " → Correction des liens dans content..." + find docs/domains/content -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/06-audio-guides-multi-sequences.md|../rules/audio-guides.md|g' \ + -e 's|../../regles-metier/07-contenus-geolocalises-voiture.md|../rules/contenus-geolocalises.md|g' \ + -e 's|../../regles-metier/11-creation-publication-contenu.md|../rules/creation-publication.md|g' \ + -e 's|../../regles-metier/12-radio-live.md|../rules/radio-live.md|g' \ + -e 's|../../regles-metier/13-detection-contenu-protege.md|../rules/detection-contenu-protege.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine advertising +fix_advertising_links() { + echo " → Correction des liens dans advertising..." + find docs/domains/advertising -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/16-publicites.md|../rules/publicites.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine premium +fix_premium_links() { + echo " → Correction des liens dans premium..." + find docs/domains/premium -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/08-mode-offline.md|../rules/mode-offline.md|g' \ + -e 's|../../regles-metier/09-abonnements-notifications.md|../rules/abonnements-notifications.md|g' \ + -e 's|../../regles-metier/17-premium.md|../rules/premium.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine monetization +fix_monetization_links() { + echo " → Correction des liens dans monetization..." + find docs/domains/monetization -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/18-monetisation-createurs.md|../rules/monetisation-createurs.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les fichiers du domaine moderation +fix_moderation_links() { + echo " → Correction des liens dans moderation..." + find docs/domains/moderation -type f -name "*.md" -exec sed -i \ + -e 's|../../regles-metier/14-moderation-flows.md|../rules/moderation-flows.md|g' \ + -e 's|../../regles-metier/15-moderation-communautaire.md|../rules/moderation-communautaire.md|g' \ + -e 's|../../regles-metier/19-autres-comportements.md|../rules/autres-comportements.md|g' \ + -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \ + {} \; +} + +# Fonction pour corriger les liens dans les autres fichiers docs (ADR, etc.) +fix_other_docs_links() { + echo " → Correction des liens dans ADR et autres docs..." + + # ADR et autres fichiers qui référencent les anciennes règles métier + find docs/adr docs/mobile docs/compliance docs/architecture -type f -name "*.md" 2>/dev/null -exec sed -i \ + -e 's|regles-metier/01-authentification-inscription.md|domains/_shared/rules/authentification.md|g' \ + -e 's|regles-metier/02-conformite-rgpd.md|domains/_shared/rules/rgpd.md|g' \ + -e 's|regles-metier/03-centres-interet-jauges.md|domains/recommendation/rules/centres-interet-jauges.md|g' \ + -e 's|regles-metier/04-algorithme-recommandation.md|domains/recommendation/rules/algorithme-recommandation.md|g' \ + -e 's|regles-metier/05-interactions-navigation.md|domains/recommendation/rules/interactions-navigation.md|g' \ + -e 's|regles-metier/06-audio-guides-multi-sequences.md|domains/content/rules/audio-guides.md|g' \ + -e 's|regles-metier/07-contenus-geolocalises-voiture.md|domains/content/rules/contenus-geolocalises.md|g' \ + -e 's|regles-metier/08-mode-offline.md|domains/premium/rules/mode-offline.md|g' \ + -e 's|regles-metier/09-abonnements-notifications.md|domains/premium/rules/abonnements-notifications.md|g' \ + -e 's|regles-metier/10-gestion-erreurs.md|domains/_shared/rules/gestion-erreurs.md|g' \ + -e 's|regles-metier/11-creation-publication-contenu.md|domains/content/rules/creation-publication.md|g' \ + -e 's|regles-metier/12-radio-live.md|domains/content/rules/radio-live.md|g' \ + -e 's|regles-metier/13-detection-contenu-protege.md|domains/content/rules/detection-contenu-protege.md|g' \ + -e 's|regles-metier/14-moderation-flows.md|domains/moderation/rules/moderation-flows.md|g' \ + -e 's|regles-metier/15-moderation-communautaire.md|domains/moderation/rules/moderation-communautaire.md|g' \ + -e 's|regles-metier/16-publicites.md|domains/advertising/rules/publicites.md|g' \ + -e 's|regles-metier/17-premium.md|domains/premium/rules/premium.md|g' \ + -e 's|regles-metier/18-monetisation-createurs.md|domains/monetization/rules/monetisation-createurs.md|g' \ + -e 's|regles-metier/19-autres-comportements.md|domains/moderation/rules/autres-comportements.md|g' \ + -e 's|diagrammes/entites/modele-global.md|domains/_shared/entities/modele-global.md|g' \ + -e 's|diagrammes/entites/modele-recommandation.md|domains/recommendation/entities/modele-recommandation.md|g' \ + -e 's|diagrammes/entites/modele-audio-guides.md|domains/content/entities/modele-audio-guides.md|g' \ + -e 's|diagrammes/entites/modele-radio-live.md|domains/content/entities/modele-radio-live.md|g' \ + -e 's|diagrammes/entites/modele-publicites.md|domains/advertising/entities/modele-publicites.md|g' \ + -e 's|diagrammes/entites/modele-premium.md|domains/premium/entities/modele-premium.md|g' \ + -e 's|diagrammes/entites/modele-monetisation.md|domains/monetization/entities/modele-monetisation.md|g' \ + -e 's|diagrammes/entites/modele-moderation.md|domains/moderation/entities/modele-moderation.md|g' \ + -e 's|diagrammes/flux/moderation-signalement.md|domains/moderation/flows/moderation-signalement.md|g' \ + -e 's|diagrammes/etats/signalement-lifecycle.md|domains/moderation/states/signalement-lifecycle.md|g' \ + -e 's|diagrammes/sequence/processus-appel-moderation.md|domains/moderation/sequences/processus-appel-moderation.md|g' \ + {} \; 2>/dev/null || true + + # Fichier gherkin-moderation-overview.md + if [ -f docs/gherkin-moderation-overview.md ]; then + sed -i \ + -e 's|regles-metier/14-moderation-flows.md|domains/moderation/rules/moderation-flows.md|g' \ + -e 's|regles-metier/15-moderation-communautaire.md|domains/moderation/rules/moderation-communautaire.md|g' \ + docs/gherkin-moderation-overview.md + fi +} + +# Exécuter toutes les corrections +fix_shared_links +fix_recommendation_links +fix_content_links +fix_advertising_links +fix_premium_links +fix_monetization_links +fix_moderation_links +fix_other_docs_links + +echo "✅ Correction des liens terminée!" diff --git a/scripts/generate-bdd-docs.py b/scripts/generate-bdd-docs.py index ddd465e..e1a58b3 100644 --- a/scripts/generate-bdd-docs.py +++ b/scripts/generate-bdd-docs.py @@ -367,7 +367,7 @@ def main(): """Point d'entrée principal""" # Chemins project_root = Path(__file__).parent.parent - features_dir = project_root / 'features' + features_dir = project_root / 'docs' / 'domains' output_dir = project_root / 'docs' / 'bdd' # Nettoyer le dossier de sortie