refactor(docs): réorganiser ADR et règles métier pour clarté
**Changements majeurs** : 1. **Suppression ADR-010 (Commandes volant et likes)** : - Contenu consolidé dans Règle 05 (section 5.3) - Raison : ADR-010 était du métier déguisé en architecture - Section "Implémentation Technique" ajoutée à Règle 05 - Pattern correct (addition) vs incorrect (multiplication) 2. **Déplacement ADR-011 → Compliance** : - `docs/adr/011-conformite-stores.md` → `docs/compliance/stores-submission.md` - Raison : Nature opérationnelle/légale, pas architecture technique - Nouveau dossier `/docs/compliance/` créé 3. **Renumérotation ADR (010-022)** : - Combler les trous de numérotation (010 et 011) - ADR-012→010, ADR-013→011, ..., ADR-024→022 - 22 ADR numérotés en continu (001-022) - Historique Git préservé (git mv) 4. **Mise à jour références** : - Règle 03 : ADR-010 → Règle 05 (section 5.3) - Règle 09 : ADR-010 → Règle 05 (section 5.3) - INCONSISTENCIES-ANALYSIS.md : toutes références mises à jour - Incohérence #15 annulée (faux problème : modes séparés) **Résultat** : - ✅ Séparation claire ADR (technique) vs Règles métier (fonctionnel) - ✅ Documentation compliance séparée - ✅ Numérotation ADR continue sans trous - ✅ Single Source of Truth (pas de redondance) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -48,7 +48,7 @@ Rust offre meilleures performances absolues (2M conn/serveur vs 1M, 0 GC pauses)
|
||||
- pprof intégré (CPU, mémoire)
|
||||
- race detector systématique
|
||||
- Cold start ~10ms (vs ~50ms Rust)
|
||||
- **Scalabilité future** : Excellent support Kubernetes (migration prévue à 100K+ users, voir [ADR-017](017-hebergement.md#roadmap-infrastructure))
|
||||
- **Scalabilité future** : Excellent support Kubernetes (migration prévue à 100K+ users, voir [ADR-015](015-hebergement.md#roadmap-infrastructure))
|
||||
|
||||
**Note importante** : Kubernetes n'est **pas utilisé en MVP** (Docker Compose sur VPS suffit pour 0-20K users). Go est choisi **principalement** pour sa **simplicité**, son **écosystème mature** et ses **performances concurrentielles**. Le support K8s est un **bonus** pour la scalabilité future, pas la raison principale du choix.
|
||||
|
||||
@@ -66,4 +66,4 @@ Rust offre meilleures performances absolues (2M conn/serveur vs 1M, 0 GC pauses)
|
||||
- Monitoring GC pauses en production (cibler < 20ms p95)
|
||||
- Potential migration partielle à Rust pour services critiques post-Series A
|
||||
|
||||
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour stack complet (16 librairies validées)
|
||||
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour stack complet (16 librairies validées)
|
||||
|
||||
@@ -179,4 +179,4 @@ Si le pre-buffer échoue (réseau faible, pas de cache), afficher un **loader av
|
||||
- [Low-Latency HLS (LL-HLS)](https://developer.apple.com/documentation/http_live_streaming/enabling_low-latency_hls)
|
||||
- Règle Métier 05 : Section 5.2 (Mode Voiture, lignes 16-84)
|
||||
- Règle Métier 17 : Section 17.2 (ETA Géolocalisé, lignes 25-65)
|
||||
- **ADR-019** : Architecture des Notifications Géolocalisées
|
||||
- **ADR-017** : Architecture des Notifications Géolocalisées
|
||||
|
||||
@@ -146,4 +146,4 @@ Feature: Recommandation géolocalisée
|
||||
- Les use cases du README doivent être traduits en `.feature`
|
||||
- CI exécute `godog run` avant chaque merge
|
||||
|
||||
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour analyse complète des frameworks BDD
|
||||
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour analyse complète des frameworks BDD
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-012 : Architecture Backend
|
||||
# ADR-010 : Architecture Backend
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-20
|
||||
@@ -1,98 +0,0 @@
|
||||
# ADR-010 : Commandes au volant et likes
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-20
|
||||
|
||||
## Contexte
|
||||
|
||||
RoadWave est utilisée en conduisant. Les utilisateurs doivent pouvoir liker du contenu pour améliorer les recommandations, mais les commandes au volant ont des limitations :
|
||||
- 40% des véhicules n'ont que Suivant/Précédent/Mute
|
||||
- iOS/Android ne supportent pas nativement les appuis longs ou doubles-appuis
|
||||
- La sécurité impose des interactions minimales
|
||||
|
||||
## Décision
|
||||
|
||||
**Like automatique basé sur le temps d'écoute**.
|
||||
|
||||
**Principe** : Le système calcule automatiquement un score d'engagement basé sur le pourcentage du contenu écouté, puis applique des ajustements de jauges d'intérêt en conséquence.
|
||||
|
||||
**Progression** : Les jauges utilisent des **points de pourcentage absolus** (addition/soustraction), **pas des pourcentages relatifs** (multiplication).
|
||||
|
||||
> 📋 **Valeurs concrètes** : Voir [Règle 03 - Évolution des Jauges](../regles-metier/03-centres-interet-jauges.md#31-évolution-des-jauges) pour les seuils et impacts exacts.
|
||||
|
||||
## Alternatives considérées
|
||||
|
||||
| Option | Compatibilité | Sécurité | Complexité |
|
||||
|--------|---------------|----------|------------|
|
||||
| **Like automatique** | 100% | Maximale | Faible |
|
||||
| Double-tap Pause | ~80% | Moyenne | Moyenne |
|
||||
| Appui long Suivant | ~95% | Faible | Élevée |
|
||||
| Configuration paramétrable | 100% | Variable | Très élevée |
|
||||
|
||||
## Justification
|
||||
|
||||
- **Sécurité maximale** : Aucune action complexe en conduite
|
||||
- **Compatibilité universelle** : Fonctionne sur 100% des véhicules
|
||||
- **UX intuitive** : Comportement standard (Spotify, YouTube Music)
|
||||
- **Engagement** : Tous les contenus génèrent des signaux
|
||||
- **Simplicité** : Une seule logique à implémenter et maintenir
|
||||
|
||||
## Pattern d'Implémentation
|
||||
|
||||
### Architecture
|
||||
|
||||
```
|
||||
[Audio Player] → [Listen Event Tracker]
|
||||
↓
|
||||
[Gauge Calculation Service]
|
||||
- Calcule score basé sur %écoute
|
||||
- Applique seuils (définis dans règles métier)
|
||||
- Retourne ajustement (points absolus)
|
||||
↓
|
||||
[Gauge Update Service]
|
||||
- Applique ajustement (addition/soustraction)
|
||||
- Applique bornes [0, 100]
|
||||
- Persiste en DB
|
||||
```
|
||||
|
||||
### Principes Clés
|
||||
|
||||
**Calcul d'ajustement** :
|
||||
```go
|
||||
// Pattern générique (valeurs dans règles métier)
|
||||
func CalculateGaugeAdjustment(listenPercentage float64) float64 {
|
||||
// Logique par seuils définis dans règles métier
|
||||
// Retourne ajustement absolu (ex: +2.0, +1.0, -0.5)
|
||||
}
|
||||
```
|
||||
|
||||
**Application avec bornes** :
|
||||
```go
|
||||
// ✅ CORRECT : Addition de points absolus
|
||||
newValue := currentValue + adjustment
|
||||
newValue = clamp(newValue, 0.0, 100.0)
|
||||
|
||||
// ❌ INCORRECT : Multiplication (pourcentage relatif)
|
||||
newValue := currentValue * (1 + adjustment/100) // NE PAS FAIRE
|
||||
```
|
||||
|
||||
**Multi-tags** :
|
||||
- Si contenu a plusieurs tags → chaque jauge correspondante est ajustée
|
||||
- Ajustement identique appliqué à toutes les jauges concernées
|
||||
|
||||
## Conséquences
|
||||
|
||||
### Technique
|
||||
- Tracking du temps d'écoute via le player audio
|
||||
- Calcul du score côté backend basé sur `completion_rate`
|
||||
- **Architecture à 2 services** : Calculation (calcule ajustement) + Update (applique avec bornes)
|
||||
- Métriques à suivre : taux de complétion, distribution des scores, feedbacks utilisateurs
|
||||
|
||||
### UX
|
||||
- Communication onboarding : "Vos likes sont automatiques selon votre temps d'écoute"
|
||||
- Possibilité de like manuel depuis l'app (à l'arrêt) également
|
||||
- **Progression linéaire** : Évite l'effet "rich get richer" (progression équitable)
|
||||
- Prévisibilité : Ajustements absolus, pas de calculs complexes
|
||||
|
||||
### Référence
|
||||
- **Seuils et valeurs** : Voir [Règle 03 - Évolution des Jauges](../regles-metier/03-centres-interet-jauges.md#31-évolution-des-jauges)
|
||||
@@ -1,137 +0,0 @@
|
||||
# ADR-011 : Conformité App Stores et Plateformes Auto
|
||||
|
||||
**Statut** : Accepté avec actions requises
|
||||
**Date** : 2026-01-20
|
||||
|
||||
## Contexte
|
||||
|
||||
RoadWave est une app audio géolocalisée utilisée en conduite (CarPlay/Android Auto) avec :
|
||||
- Contenu généré par utilisateurs (UGC)
|
||||
- Monétisation : publicités géolocalisées + Premium (4.99€ web / 5.99€ IAP)
|
||||
- GPS en arrière-plan
|
||||
- Partage de revenus avec créateurs (70/30)
|
||||
|
||||
## Décision
|
||||
|
||||
**Stratégie de conformité multi-plateforme** avec :
|
||||
- Modération UGC robuste (IA + humain)
|
||||
- Prix différenciés selon région (US/EU/Monde)
|
||||
- GPS avec disclosure complète
|
||||
- Paiements créateurs externes (Mangopay)
|
||||
|
||||
## Plateformes analysées
|
||||
|
||||
| Plateforme | Conformité | Points critiques |
|
||||
|------------|------------|------------------|
|
||||
| **Android Auto** | ✅ Conforme | API Level 35+ (Android 15+) |
|
||||
| **CarPlay** | ✅ Conforme | Entitlement audio à demander |
|
||||
| **Google Play** | ⚠️ Actions requises | Déclaration GPS + UGC modération |
|
||||
| **App Store** | ⚠️ Actions requises | Prix différenciés US/EU |
|
||||
|
||||
## Conformité détaillée
|
||||
|
||||
### Android Auto / CarPlay ✅
|
||||
- 100% audio (pas de vidéo)
|
||||
- Commandes standard au volant
|
||||
- Aucun achat in-car
|
||||
- Like automatique = sécurité maximale
|
||||
- **Notifications géolocalisées** : sonore uniquement en mode CarPlay/Android Auto (pas d'overlay visuel)
|
||||
- **Action** : Demander CarPlay Audio Entitlement (Apple)
|
||||
|
||||
### Google Play ⚠️
|
||||
|
||||
**UGC (critique)** :
|
||||
- Modération hybride IA + humain ✅
|
||||
- 3 premiers contenus validés manuellement ✅
|
||||
- Système de strikes (4 = ban) ✅
|
||||
- Signalement + blocage utilisateurs ✅
|
||||
|
||||
**GPS Background (critique)** :
|
||||
- Permission "Always Location" = **OPTIONNELLE**
|
||||
- Demandée uniquement pour mode piéton (notifications arrière-plan audio-guides)
|
||||
- Justification Play Console :
|
||||
> "RoadWave permet aux utilisateurs de recevoir des alertes audio-guides lorsqu'ils passent à pied près de monuments/musées, même quand l'app est en arrière-plan. Cette fonctionnalité est optionnelle et peut être désactivée dans les paramètres."
|
||||
- In-app disclosure obligatoire (écran dédié avant demande permission)
|
||||
- Si refusée : app fonctionne en mode voiture uniquement
|
||||
- **Action** : Remplir formulaire background location Play Console avec justification
|
||||
|
||||
**Réponses formulaire Play Console** :
|
||||
|
||||
| Question | Réponse |
|
||||
|----------|---------|
|
||||
| Why does your app need background location? | "RoadWave offers optional pedestrian mode: users receive push notifications when passing near audio-guide points (museums, monuments) even when app is in background. This feature is opt-in and can be disabled in settings." |
|
||||
| Is this feature core to your app? | "No. This is an optional feature. Users can use RoadWave without background location permission (in-car mode works with foreground location only)." |
|
||||
| What user value does this provide? | "Pedestrian users (tourists, museum visitors) can keep phone in pocket and receive audio-guide alerts automatically without opening the app." |
|
||||
| Does a less invasive alternative exist? | "Yes. Users can use manual navigation (open app, select audio-guide). Background location is a convenience feature for hands-free experience." |
|
||||
|
||||
### App Store ⚠️
|
||||
|
||||
**Prix différenciés (légaux depuis 2025-2026)** :
|
||||
- 🇺🇸 US : Lien externe autorisé (0% commission)
|
||||
- 🇪🇺 EU : Paiement externe DMA (7-20% commission réduite)
|
||||
- 🌍 Monde : IAP obligatoire (30% commission)
|
||||
|
||||
**UGC** :
|
||||
- Mode Kids obligatoire (filtrage selon âge) ✅
|
||||
- Système de modération + signalement ✅
|
||||
|
||||
**GPS Background (critique)** :
|
||||
- Permission "Always Location" = **OPTIONNELLE**
|
||||
- Deux strings Info.plist requises :
|
||||
- `NSLocationWhenInUseUsageDescription` : explication mode voiture
|
||||
- `NSLocationAlwaysAndWhenInUseUsageDescription` : explication mode piéton (optionnel)
|
||||
- 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)
|
||||
|
||||
### Revenus créateurs
|
||||
|
||||
**Position** : Paiements créateurs = "services" (comme YouTube/Uber), pas IAP
|
||||
- Paiement via Mangopay Connect (externe)
|
||||
- Commission stores uniquement sur Premium (IAP)
|
||||
- Comparables : YouTube AdSense, TikTok Creator Fund, Uber
|
||||
|
||||
## Actions bloquantes avant soumission
|
||||
|
||||
| Action | Plateforme | Deadline | Complexité |
|
||||
|--------|-----------|----------|------------|
|
||||
| Demander CarPlay Audio Entitlement | Apple | Avant soumission iOS | Faible |
|
||||
| Remplir formulaire background location avec justification | Google Play | Avant soumission Android | Faible |
|
||||
| Implémenter disclosure GPS (écran dédié mode piéton) | iOS + Android | MVP | Moyenne |
|
||||
| Rendre permission "Always Location" optionnelle | iOS + Android | MVP | Moyenne |
|
||||
| Désactiver overlay visuel notification en CarPlay/Android Auto | iOS + Android | MVP | Moyenne |
|
||||
| Mettre à jour strings Info.plist avec justifications détaillées | iOS | MVP | Faible |
|
||||
| Finaliser système modération UGC | Google + Apple | MVP | Élevée |
|
||||
|
||||
**Estimation totale** : +5 jours développement avant soumission stores
|
||||
|
||||
## Stratégie de lancement
|
||||
|
||||
**Phase 1 - MVP** :
|
||||
- IAP uniquement (5.99€/mois mondial)
|
||||
- Modération UGC active
|
||||
- GPS avec disclosure
|
||||
- CarPlay/Android Auto basique
|
||||
|
||||
**Phase 2 - Post-validation** :
|
||||
- Prix différenciés US (lien externe 4.99€)
|
||||
- Paiement externe EU (DMA)
|
||||
- Monétisation créateurs (Mangopay)
|
||||
|
||||
## Conséquences
|
||||
|
||||
- Formation équipe sur politiques stores
|
||||
- Suivi des métriques modération (% rejet, SLA)
|
||||
- Migration iOS 26 SDK (Avril 2026)
|
||||
- API Level 35 Android (2026)
|
||||
- Communication transparente GPS/publicités
|
||||
|
||||
## Sources
|
||||
|
||||
- [Android Auto Media Apps](https://developer.android.com/training/cars/media)
|
||||
- [CarPlay Developer Guide](https://developer.apple.com/carplay)
|
||||
- [Google Play UGC Policy](https://support.google.com/googleplay/android-developer/answer/9876937)
|
||||
- [App Store Guidelines](https://developer.apple.com/app-store/review/guidelines/)
|
||||
- [Apple DMA Update EU](https://www.revenuecat.com/blog/growth/apple-eu-dma-update-june-2025/)
|
||||
- [Google Background Location 2026](https://support.google.com/googleplay/android-developer/answer/9799150)
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-013 : ORM et Accès Données
|
||||
# ADR-011 : ORM et Accès Données
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-20
|
||||
@@ -208,4 +208,4 @@ ON user_locations USING GIST(last_position);
|
||||
- Migrations gérées séparément avec `golang-migrate`
|
||||
- CI doit exécuter `sqlc generate` pour valider cohérence SQL/Go
|
||||
|
||||
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour stack complet (sqlc + golang-migrate + pgx)
|
||||
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour stack complet (sqlc + golang-migrate + pgx)
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-014 : Frontend Mobile
|
||||
# ADR-012 : Frontend Mobile
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-20
|
||||
@@ -31,7 +31,7 @@ RoadWave nécessite applications iOS et Android avec support CarPlay/Android Aut
|
||||
|
||||
## Packages Flutter
|
||||
|
||||
> **Voir [ADR-022 - Librairies Flutter](022-librairies-flutter.md)** pour la liste complète des packages, licences, alternatives considérées et justifications détaillées.
|
||||
> **Voir [ADR-020 - Librairies Flutter](020-librairies-flutter.md)** pour la liste complète des packages, licences, alternatives considérées et justifications détaillées.
|
||||
|
||||
**Packages clés pour RoadWave** :
|
||||
|
||||
@@ -46,7 +46,7 @@ RoadWave nécessite applications iOS et Android avec support CarPlay/Android Aut
|
||||
|
||||
**Points d'attention** :
|
||||
- ⚠️ **Permissions progressives requises** pour `geofence_service` et `geolocator` (voir section "Stratégie de Permissions")
|
||||
- ⚠️ **Licences** : 100% permissives (MIT, BSD-3) - voir ADR-022
|
||||
- ⚠️ **Licences** : 100% permissives (MIT, BSD-3) - voir ADR-020
|
||||
|
||||
## Stratégie de Permissions (iOS/Android)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-015 : Stratégie Tests
|
||||
# ADR-013 : Stratégie Tests
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-20
|
||||
@@ -83,4 +83,4 @@ Approche **multi-niveaux** : unitaires, intégration, BDD (Gherkin), E2E, load t
|
||||
- Tests intégration/E2E : nightly builds (15-30 min)
|
||||
- Load tests : avant chaque release majeure
|
||||
|
||||
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour analyses complètes des frameworks de tests
|
||||
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour analyses complètes des frameworks de tests
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-016 : Organisation en Monorepo
|
||||
# ADR-014 : Organisation en Monorepo
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-24
|
||||
@@ -77,7 +77,7 @@ Cela garantit que :
|
||||
- **Turborepo** ou **Nx** : orchestration des builds/tests, cache intelligent
|
||||
- **Docker Compose** : environnement de dev local (PostgreSQL, Redis, backend, etc.)
|
||||
- **Make** : commandes communes (`make test`, `make build`, `make dev`)
|
||||
- **CI/CD** : GitHub Actions avec path filters (voir [ADR-024](024-strategie-cicd-monorepo.md))
|
||||
- **CI/CD** : GitHub Actions avec path filters (voir [ADR-020](020-strategie-cicd-monorepo.md))
|
||||
|
||||
## Conséquences
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-017 : Hébergement
|
||||
# ADR-015 : Hébergement
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2025-01-25
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-018 : Service d'Emailing Transactionnel
|
||||
# ADR-016 : Service d'Emailing Transactionnel
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-26
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-019 : Architecture des Notifications Géolocalisées
|
||||
# ADR-017 : Architecture des Notifications Géolocalisées
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-28
|
||||
@@ -100,7 +100,7 @@ Architecture hybride en **2 phases** :
|
||||
- **Batterie** : Utilise les mécanismes système (Google Play Services)
|
||||
- **Cross-platform** : API unifiée iOS/Android
|
||||
|
||||
### Incohérence acceptée : Firebase vs self-hosted (ADR-008, ADR-017)
|
||||
### Incohérence acceptée : Firebase vs self-hosted (ADR-008, ADR-015)
|
||||
|
||||
**Problème** : RoadWave promeut 100% self-hosted + souveraineté française, mais Firebase = dépendance Google Cloud.
|
||||
|
||||
@@ -150,7 +150,7 @@ Architecture hybride en **2 phases** :
|
||||
|
||||
### Négatives
|
||||
|
||||
- ⚠️ **Dépendance Google (Firebase)** : Contradictoire avec ADR-008 (self-hosted) + ADR-017 (souveraineté FR)
|
||||
- ⚠️ **Dépendance Google (Firebase)** : Contradictoire avec ADR-008 (self-hosted) + ADR-015 (souveraineté FR)
|
||||
- Mitigé par abstraction layer (`NotificationProvider` interface) → swap facile si besoin
|
||||
- Exit path documenté pour migration custom (< 1 sprint)
|
||||
- ⚠️ **Données utilisateur chez Google** : Tokens FCM, timestamps notifications
|
||||
@@ -163,8 +163,8 @@ Architecture hybride en **2 phases** :
|
||||
|
||||
- **ADR-002 (Streaming)** : Aucun conflit - HLS reste pour l'audio
|
||||
- **ADR-005 (Base de données)** : Ajouter index PostGIS `GIST (geom)` sur `points_of_interest`
|
||||
- **ADR-012 (Architecture Backend)** : Ajouter un module `geofencing` avec worker dédié
|
||||
- **ADR-014 (Frontend Mobile)** : Intégrer `firebase_messaging` (Flutter) et gérer permissions
|
||||
- **ADR-010 (Architecture Backend)** : Ajouter un module `geofencing` avec worker dédié
|
||||
- **ADR-010 (Frontend Mobile)** : Intégrer `firebase_messaging` (Flutter) et gérer permissions
|
||||
|
||||
## Abstraction Layer (Mitigation Vendor Lock-in)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-020 : Librairies Go du Backend
|
||||
# ADR-018 : Librairies Go du Backend
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-31
|
||||
@@ -22,7 +22,7 @@ Utilisation de **16 librairies open-source** avec licences permissives.
|
||||
| **HTTP Framework** | `gofiber/fiber/v3` | MIT | 36K RPS, WebSocket natif, Express-like |
|
||||
| **PostgreSQL** | `jackc/pgx/v5` | MIT | 30-50% plus rapide, PostGIS natif |
|
||||
| **Redis** | `redis/rueidis` | Apache-2.0 | Client-side caching, GEORADIUS |
|
||||
| **SQL Codegen** | `sqlc-dev/sqlc` | MIT | Type-safe, zero overhead (ADR-013) |
|
||||
| **SQL Codegen** | `sqlc-dev/sqlc` | MIT | Type-safe, zero overhead (ADR-011) |
|
||||
| **Migrations** | `golang-migrate/migrate` | MIT | Standard, CLI + library |
|
||||
|
||||
### Tests
|
||||
@@ -40,8 +40,8 @@ Utilisation de **16 librairies open-source** avec licences permissives.
|
||||
|-----------|-----------|---------|---------------|
|
||||
| **Auth JWT** | `zitadel/zitadel-go/v3` | Apache-2.0 | SDK Zitadel officiel (ADR-008) |
|
||||
| **WebRTC** | `pion/webrtc/v4` | MIT | Pure Go, radio live (ADR-002) |
|
||||
| **WebSocket** | `coder/websocket` | ISC | Minimal, notifications (ADR-019) |
|
||||
| **FCM Push** | `firebase.google.com/go` | BSD-3 | SDK Google officiel (ADR-019) |
|
||||
| **WebSocket** | `coder/websocket` | ISC | Minimal, notifications (ADR-017) |
|
||||
| **FCM Push** | `firebase.google.com/go` | BSD-3 | SDK Google officiel (ADR-017) |
|
||||
| **HLS/FFmpeg** | `asticode/go-astiav` | MIT | Bindings FFmpeg n8.0 |
|
||||
|
||||
### Utilitaires
|
||||
@@ -88,7 +88,7 @@ Voir [analyse détaillée](../ANALYSE_LIBRAIRIES_GO.md) pour comparatifs complet
|
||||
|
||||
### Négatives
|
||||
- ⚠️ **k6 (AGPL-3.0)** : Copyleft, mais OK pour tests internes (pas de SaaS k6 prévu)
|
||||
- ⚠️ **Firebase FCM** : Dépendance Google (mitigation via abstraction layer, ADR-019)
|
||||
- ⚠️ **Firebase FCM** : Dépendance Google (mitigation via abstraction layer, ADR-017)
|
||||
- ❌ Courbe d'apprentissage : 16 librairies à maîtriser (doc nécessaire)
|
||||
|
||||
### Dépendances go.mod
|
||||
@@ -119,6 +119,6 @@ require (
|
||||
- [Analyse complète des librairies](../ANALYSE_LIBRAIRIES_GO.md) (tableaux comparatifs, sources)
|
||||
- ADR-001 : Langage Backend (Fiber, pgx, go-redis)
|
||||
- ADR-007 : Tests BDD (Godog)
|
||||
- ADR-013 : Accès données (sqlc)
|
||||
- ADR-015 : Stratégie tests (testify, testcontainers, k6)
|
||||
- ADR-019 : Notifications (WebSocket, FCM)
|
||||
- ADR-011 : Accès données (sqlc)
|
||||
- ADR-011 : Stratégie tests (testify, testcontainers, k6)
|
||||
- ADR-017 : Notifications (WebSocket, FCM)
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-021 : Service de Géolocalisation par IP
|
||||
# ADR-019 : Service de Géolocalisation par IP
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-31
|
||||
@@ -113,6 +113,6 @@ flowchart TD
|
||||
## Références
|
||||
|
||||
- [ADR-004 : CDN (Souveraineté)](004-cdn.md)
|
||||
- [ADR-017 : Hébergement](017-hebergement.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)
|
||||
- IP2Location Lite : https://lite.ip2location.com/
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-022 : Librairies Flutter du Mobile
|
||||
# ADR-020 : Librairies Flutter du Mobile
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-31
|
||||
@@ -80,7 +80,7 @@ Utilisation de **8 librairies open-source** Flutter avec licences permissives.
|
||||
- **geofence_service** : Geofencing natif, minimise consommation batterie
|
||||
|
||||
### Conformité Stores
|
||||
- **Permissions progressives** : `permission_handler` + stratégie ADR-014
|
||||
- **Permissions progressives** : `permission_handler` + stratégie ADR-010
|
||||
- **Background modes** : `geolocator` + `geofence_service` approuvés stores
|
||||
- **Notifications** : `flutter_local_notifications` conforme guidelines iOS/Android
|
||||
|
||||
@@ -143,7 +143,7 @@ graph TB
|
||||
|
||||
### Positives
|
||||
- ✅ Aucune restriction licence commerciale (100% permissif)
|
||||
- ✅ Stack cohérent avec ADR-014 (Frontend Mobile)
|
||||
- ✅ Stack cohérent avec ADR-010 (Frontend Mobile)
|
||||
- ✅ Performance native (compilation ARM64 directe)
|
||||
- ✅ Écosystème mature et documenté
|
||||
- ✅ Support CarPlay/Android Auto via communauté
|
||||
@@ -151,7 +151,7 @@ graph TB
|
||||
|
||||
### Négatives
|
||||
- ⚠️ **CarPlay/Android Auto** : Packages communautaires (pas officiels Flutter)
|
||||
- ⚠️ **Géolocalisation background** : Scrutée par App Store (stratégie progressive requise, ADR-014)
|
||||
- ⚠️ **Géolocalisation background** : Scrutée par App Store (stratégie progressive requise, ADR-010)
|
||||
- ❌ **Courbe d'apprentissage** : Dart + pattern BLoC à maîtriser
|
||||
- ❌ **Tests stores** : Validation TestFlight (iOS) et Internal Testing (Android) obligatoires
|
||||
|
||||
@@ -176,11 +176,11 @@ graph TB
|
||||
- `flutter_carplay` - Intégration CarPlay
|
||||
- `android_auto_flutter` - Support Android Auto
|
||||
|
||||
### Migration depuis ADR-014
|
||||
### Migration depuis ADR-010
|
||||
|
||||
La section "Packages clés" de l'ADR-014 est désormais obsolète et doit référencer cet ADR :
|
||||
La section "Packages clés" de l'ADR-010 est désormais obsolète et doit référencer cet ADR :
|
||||
|
||||
> **Packages Flutter** : Voir [ADR-022 - Librairies Flutter](020-librairies-flutter.md) pour la liste complète, licences et justifications.
|
||||
> **Packages Flutter** : Voir [ADR-018 - Librairies Flutter](018-librairies-flutter.md) pour la liste complète, licences et justifications.
|
||||
|
||||
## Risques et Mitigations
|
||||
|
||||
@@ -190,7 +190,7 @@ La section "Packages clés" de l'ADR-014 est désormais obsolète et doit réfé
|
||||
|
||||
### Risque 2 : Validation App Store (permissions background)
|
||||
- **Impact** : Taux de rejet ~70% si mal justifié
|
||||
- **Mitigation** : Stratégie progressive (ADR-014), écrans d'éducation, tests beta TestFlight
|
||||
- **Mitigation** : Stratégie progressive (ADR-010), écrans d'éducation, tests beta TestFlight
|
||||
|
||||
### Risque 3 : Performance audio HLS en arrière-plan
|
||||
- **Impact** : Interruptions si OS tue l'app
|
||||
@@ -198,8 +198,8 @@ La section "Packages clés" de l'ADR-014 est désormais obsolète et doit réfé
|
||||
|
||||
## Références
|
||||
|
||||
- ADR-014 : Frontend Mobile (Flutter, architecture permissions)
|
||||
- ADR-020 : Librairies Go (même format de documentation)
|
||||
- ADR-010 : Frontend Mobile (Flutter, architecture permissions)
|
||||
- ADR-018 : Librairies Go (même format de documentation)
|
||||
- [flutter_bloc documentation](https://bloclibrary.dev/)
|
||||
- [just_audio repository](https://pub.dev/packages/just_audio)
|
||||
- [geolocator documentation](https://pub.dev/packages/geolocator)
|
||||
@@ -1,4 +1,4 @@
|
||||
# ADR-023 : Solution de Cache
|
||||
# ADR-021 : Solution de Cache
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-31
|
||||
@@ -1,11 +1,11 @@
|
||||
# ADR-024 : Stratégie CI/CD avec Path Filters pour Monorepo
|
||||
# ADR-022 : Stratégie CI/CD avec Path Filters pour Monorepo
|
||||
|
||||
**Statut** : Accepté (non implémenté)
|
||||
**Date** : 2026-02-01
|
||||
|
||||
## Contexte
|
||||
|
||||
RoadWave est organisé en monorepo contenant backend Go, mobile Flutter, documentation et features BDD ([ADR-016](016-organisation-monorepo.md)). Sans optimisation, chaque commit déclencherait **tous** les builds (backend + mobile + docs), même si seul un composant a changé.
|
||||
RoadWave est organisé en monorepo contenant backend Go, mobile Flutter, documentation et features BDD ([ADR-014](014-organisation-monorepo.md)). Sans optimisation, chaque commit déclencherait **tous** les builds (backend + mobile + docs), même si seul un composant a changé.
|
||||
|
||||
**Problématique** :
|
||||
- ❌ Temps de CI/CD inutilement longs (rebuild complet ~15 min)
|
||||
@@ -252,7 +252,7 @@ jobs:
|
||||
| `features/api/authentication/*.feature` | ✅ | ❌ | ❌ | ~5 min |
|
||||
| `features/ui/audio-guides/*.feature` | ❌ | ✅ | ❌ | ~8 min |
|
||||
| `features/e2e/abonnements/*.feature` | ✅ | ✅ | ❌ | ~13 min (parallèle) |
|
||||
| `docs/adr/018-email.md` | ❌ | ❌ | ✅ | ~30s |
|
||||
| `docs/adr/016-email.md` | ❌ | ❌ | ✅ | ~30s |
|
||||
| **Commit mixte (backend + mobile + docs)** | ✅ | ✅ | ✅ | ~13 min (parallèle) |
|
||||
|
||||
**Économie de temps** :
|
||||
@@ -390,7 +390,7 @@ git push
|
||||
## Références
|
||||
|
||||
- [ADR-007 - Tests BDD et Catégorisation Features](007-tests-bdd.md)
|
||||
- [ADR-016 - Organisation Monorepo](016-organisation-monorepo.md)
|
||||
- [ADR-014 - Organisation Monorepo](014-organisation-monorepo.md)
|
||||
- [GitHub Actions - Path Filters](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
|
||||
- [Monorepo CI/CD Best Practices](https://monorepo.tools/#ci-cd)
|
||||
|
||||
Reference in New Issue
Block a user