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