feat(gherkin): améliorer scénarios content-creation avec edge cases
- Ajouter scénarios edge cases pour robustesse production - Aligner fichiers Gherkin avec règles métier section 4 - Préciser suppression OVH Object Storage + NGINX Cache - Ajouter gestion états transitoires (encodage, validation) - Ajouter limites et timeouts (uploads, brouillons) Scénarios ajoutés : - upload-encodage : timeout, reprise, limites uploads, conservation fichiers - modification-suppression : suppression pendant encodage, blocage modification en validation - metadonnees-publication : blocage pendant encodage, limite brouillons, nettoyage auto - validation-premiers-contenus : verrouillage concurrence modérateurs Total : +12 scénarios pour 137 scénarios au total
This commit is contained in:
35
CLAUDE.md
35
CLAUDE.md
@@ -184,14 +184,43 @@ Feature: Geolocalised recommendation
|
|||||||
|
|
||||||
All technical decisions are documented in Architecture Decision Records (ADRs) in `/docs/adr/`:
|
All technical decisions are documented in Architecture Decision Records (ADRs) in `/docs/adr/`:
|
||||||
|
|
||||||
|
### Core Architecture
|
||||||
- [ADR-001](docs/adr/001-langage-backend.md): Backend language (Go)
|
- [ADR-001](docs/adr/001-langage-backend.md): Backend language (Go)
|
||||||
- [ADR-002](docs/adr/002-protocole-streaming.md): Streaming protocol (HLS)
|
|
||||||
- [ADR-005](docs/adr/005-base-de-donnees.md): Database (PostgreSQL + PostGIS)
|
|
||||||
- [ADR-008](docs/adr/008-authentification.md): Authentication (Zitadel)
|
|
||||||
- [ADR-010](docs/adr/010-architecture-backend.md): Backend architecture (modular monolith)
|
- [ADR-010](docs/adr/010-architecture-backend.md): Backend architecture (modular monolith)
|
||||||
- [ADR-011](docs/adr/011-orm-acces-donnees.md): Data access (sqlc)
|
- [ADR-011](docs/adr/011-orm-acces-donnees.md): Data access (sqlc)
|
||||||
|
- [ADR-012](docs/adr/012-frontend-mobile.md): Frontend mobile (Flutter)
|
||||||
- [ADR-014](docs/adr/014-organisation-monorepo.md): Monorepo organization
|
- [ADR-014](docs/adr/014-organisation-monorepo.md): Monorepo organization
|
||||||
|
|
||||||
|
### Data & Infrastructure
|
||||||
|
- [ADR-005](docs/adr/005-base-de-donnees.md): Database (PostgreSQL + PostGIS)
|
||||||
|
- [ADR-021](docs/adr/021-solution-cache.md): Cache solution (Redis)
|
||||||
|
- [ADR-015](docs/adr/015-hebergement.md): Hosting (OVH)
|
||||||
|
- [ADR-019](docs/adr/019-geolocalisation-ip.md): IP geolocation fallback
|
||||||
|
|
||||||
|
### Streaming & Content
|
||||||
|
- [ADR-002](docs/adr/002-protocole-streaming.md): Streaming protocol (HLS)
|
||||||
|
- [ADR-003](docs/adr/003-codec-audio.md): Audio codec (Opus)
|
||||||
|
- [ADR-004](docs/adr/004-cdn.md): CDN strategy
|
||||||
|
|
||||||
|
### Security & Auth
|
||||||
|
- [ADR-006](docs/adr/006-chiffrement.md): Encryption (TLS 1.3)
|
||||||
|
- [ADR-008](docs/adr/008-authentification.md): Authentication (Zitadel)
|
||||||
|
- [ADR-025](docs/adr/025-securite-secrets.md): Secrets management
|
||||||
|
|
||||||
|
### Testing & Quality
|
||||||
|
- [ADR-007](docs/adr/007-tests-bdd.md): BDD tests (Gherkin)
|
||||||
|
- [ADR-013](docs/adr/013-strategie-tests.md): Test strategy
|
||||||
|
- [ADR-022](docs/adr/022-strategie-cicd-monorepo.md): CI/CD strategy
|
||||||
|
|
||||||
|
### Features & Operations
|
||||||
|
- [ADR-009](docs/adr/009-solution-paiement.md): Payment solution (Mangopay)
|
||||||
|
- [ADR-016](docs/adr/016-service-emailing.md): Email service (Brevo)
|
||||||
|
- [ADR-017](docs/adr/017-notifications-geolocalisees.md): Geo notifications
|
||||||
|
- [ADR-018](docs/adr/018-notifications-push.md): Push notifications
|
||||||
|
- [ADR-020](docs/adr/020-librairies-flutter.md): Flutter libraries
|
||||||
|
- [ADR-023](docs/adr/023-architecture-moderation.md): Moderation architecture
|
||||||
|
- [ADR-024](docs/adr/024-monitoring-observabilite.md): Monitoring & observability
|
||||||
|
|
||||||
**When making architectural decisions**, check if there's an existing ADR or create a new one following the established pattern.
|
**When making architectural decisions**, check if there's an existing ADR or create a new one following the established pattern.
|
||||||
|
|
||||||
## Recommendation Algorithm
|
## Recommendation Algorithm
|
||||||
|
|||||||
@@ -1,286 +0,0 @@
|
|||||||
# Incohérences et Manques - RoadWave
|
|
||||||
|
|
||||||
> **Statut** : Document de travail
|
|
||||||
> **Dernière mise à jour** : 2026-02-01
|
|
||||||
> **Score de santé documentaire** : 75% (après corrections récentes)
|
|
||||||
|
|
||||||
Ce document liste les incohérences et manques critiques identifiés dans la documentation technique (ADR + Règles Métier) du projet RoadWave.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Incohérences récemment corrigées
|
|
||||||
|
|
||||||
- **✅ Références ADR dans CLAUDE.md** : Décalage -2 corrigé (commit `c3abdd7`)
|
|
||||||
- **✅ Geofencing MVP vs Phase 2** : ADR-020 clarifié avec séparation Phase 1/Phase 2 (commit `69a7bd8`)
|
|
||||||
- **✅ Formule algorithme recommandation** : Section détaillée ajoutée dans Règle 04 avec exemple concret (commit `cf26d8a`)
|
|
||||||
- **✅ Référence cassée ADR-002** : Section 5.2 → Section 5.1 corrigée (commit `18c8901`)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Incohérences acceptées pour MVP
|
|
||||||
|
|
||||||
### Souveraineté données : Firebase vs Self-hosted
|
|
||||||
|
|
||||||
**Conflit initial** :
|
|
||||||
- [ADR-008](docs/adr/008-authentification.md) : "100% self-hosted, souveraineté France"
|
|
||||||
- [ADR-015](docs/adr/015-hebergement.md) : "OVH France, aucune dépendance US"
|
|
||||||
- **MAIS** [ADR-017](docs/adr/017-notifications-geolocalisees.md) : Firebase Cloud Messaging = **Google Cloud**
|
|
||||||
|
|
||||||
**Décision** : ✅ **Accepté pour MVP** (2026-02-01)
|
|
||||||
- Cible MVP : terminaux Android équipés (environnement contrôlé)
|
|
||||||
- Firebase FCM gratuit et fiable pour phase initiale
|
|
||||||
- Incohérence documentée dans [ADR-017](docs/adr/017-notifications-geolocalisees.md) avec mitigation
|
|
||||||
|
|
||||||
**Mitigation technique** :
|
|
||||||
- Abstraction layer `NotificationProvider` pour faciliter migration future
|
|
||||||
- Exit path vers solution custom < 1 sprint si besoin
|
|
||||||
- DPA Google à valider avant production publique
|
|
||||||
|
|
||||||
**Phase 2** : Réévaluation lors du scaling (≥20K users) pour solution self-hosted (Novu).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Incohérences critiques P0 : TOUTES RÉSOLUES !
|
|
||||||
|
|
||||||
## ⚠️ Manques critiques
|
|
||||||
|
|
||||||
### 1. Architecture de modération non documentée
|
|
||||||
|
|
||||||
**État actuel** :
|
|
||||||
- [Règle 14-15](docs/regles-metier/14-moderation-flows.md) : décrivent les flux métier
|
|
||||||
- **AUCUN ADR** ne couvre l'architecture technique
|
|
||||||
|
|
||||||
**Manque** :
|
|
||||||
- Comment l'IA pré-filtre fonctionne (Whisper + NLP) ?
|
|
||||||
- Quelle architecture de queue (PostgreSQL, Redis, RabbitMQ) ?
|
|
||||||
- Stack technique des modérateurs (dashboard) ?
|
|
||||||
- API endpoints pour signalement ?
|
|
||||||
- Workflow de traitement (automatique vs manuel) ?
|
|
||||||
|
|
||||||
**Impact** : 3-4 semaines de surprise en développement, pas de consensus technique.
|
|
||||||
|
|
||||||
**Action recommandée** : Créer **ADR-023 : Architecture de Modération**
|
|
||||||
```markdown
|
|
||||||
Contenu suggéré :
|
|
||||||
- Architecture queue signalements (PostgreSQL LISTEN/NOTIFY)
|
|
||||||
- Intégration Whisper API (transcription audio)
|
|
||||||
- ML pré-filtrage (OpenAI Moderation API ou modèle local)
|
|
||||||
- Dashboard modérateurs (interface web)
|
|
||||||
- Workflow et SLA (24h critique, 72h standard)
|
|
||||||
- Métriques et observabilité
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. Monitoring et Ops absents
|
|
||||||
|
|
||||||
**État actuel** :
|
|
||||||
- [ADR-015](docs/adr/015-hebergement.md) : mentionne OVH VPS
|
|
||||||
- **AUCUN ADR** sur monitoring, alerting, incident response
|
|
||||||
|
|
||||||
**Manque** :
|
|
||||||
- Stack de monitoring (Grafana + Prometheus ?)
|
|
||||||
- Alerting (PagerDuty, Slack, email ?)
|
|
||||||
- Incident runbooks (crash, data loss, breach)
|
|
||||||
- Backup/Disaster Recovery strategy
|
|
||||||
- SLO/SLA définition (99.9% availability = combien downtime ?)
|
|
||||||
- Performance metrics (p99 latency, throughput)
|
|
||||||
|
|
||||||
**Impact** : Équipe ops sera perdue le jour du lancement production.
|
|
||||||
|
|
||||||
**Action recommandée** : Créer **ADR-024 : Monitoring, Observabilité et Incident Response**
|
|
||||||
```markdown
|
|
||||||
Contenu suggéré :
|
|
||||||
- Stack monitoring (Prometheus + Grafana self-hosted)
|
|
||||||
- Alerting rules (latency p99 > 100ms, error rate > 1%)
|
|
||||||
- Incident response workflow (on-call rotation, escalation)
|
|
||||||
- Runbook templates (database down, API crash, high load)
|
|
||||||
- Backup strategy (PostgreSQL WAL-E, 7 jours retention)
|
|
||||||
- Disaster Recovery (RTO/RPO : 1h / 15min)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. Gestion des secrets non documentée
|
|
||||||
|
|
||||||
**État actuel** :
|
|
||||||
- Aucun ADR ne couvre la gestion des secrets
|
|
||||||
|
|
||||||
**Manque** :
|
|
||||||
- Où stocker secrets production (Mangopay credentials, DB password, JWT signing key) ?
|
|
||||||
- Solution : Vault self-hosted ? Kubernetes secrets ? Variables d'environnement ?
|
|
||||||
- Rotation des secrets (fréquence, automatisation) ?
|
|
||||||
- Field-level encryption PII (GPS coordinates, emails, phone numbers) ?
|
|
||||||
- OWASP Top 10 checklist (injection, CSRF, XSS) ?
|
|
||||||
|
|
||||||
**Impact** : Secrets en plaintext dans env vars = faille de sécurité critique.
|
|
||||||
|
|
||||||
**Action recommandée** : Créer **ADR-025 : Sécurité - Secrets et Encryption**
|
|
||||||
```markdown
|
|
||||||
Contenu suggéré :
|
|
||||||
- Secrets management (HashiCorp Vault self-hosted vs managed)
|
|
||||||
- Field-level encryption (AES-256-GCM pour PII sensibles)
|
|
||||||
- HTTPS/TLS configuration (Let's Encrypt automatique)
|
|
||||||
- CORS/CSRF protection (middleware Fiber)
|
|
||||||
- API rate limiting (token bucket, 100 req/min/user)
|
|
||||||
- OWASP Top 10 mitigation checklist
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. Analytics et events tracking flous
|
|
||||||
|
|
||||||
**État actuel** :
|
|
||||||
- [Règle 02](docs/regles-metier/02-conformite-rgpd.md):13.7 : "Matomo self-hosted"
|
|
||||||
- Aucun détail sur les events à tracer
|
|
||||||
|
|
||||||
**Manque** :
|
|
||||||
- Quels events tracer (play, pause, like, skip, duration, GPS updates) ?
|
|
||||||
- Schéma JSON des events (format standardisé) ?
|
|
||||||
- Dashboard principales métriques (DAU, WAU, engagement, churn) ?
|
|
||||||
- Funnel analytics (signup → première écoute → monétisation) ?
|
|
||||||
- Retention cohort analysis ?
|
|
||||||
|
|
||||||
**Impact** : Analytics sera chaos, équipe produit ne saura pas quoi mesurer.
|
|
||||||
|
|
||||||
**Action recommandée** : Créer **ADR-026 : Analytics et Métriques Produit**
|
|
||||||
```markdown
|
|
||||||
Contenu suggéré :
|
|
||||||
- Events à tracer (JSON Schema pour validation)
|
|
||||||
- Matomo setup (Docker self-hosted, data retention 90j)
|
|
||||||
- Dashboard KPI (DAU, WAU, engagement rate, churn by cohort)
|
|
||||||
- Funnel metrics (signup → content discovery → monetization)
|
|
||||||
- Privacy-preserving analytics (IP anonymization, no cookies tiers)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 5. Stratégie de scaling Post-MVP absente
|
|
||||||
|
|
||||||
**État actuel** :
|
|
||||||
- [ADR-015](docs/adr/015-hebergement.md) : "Phase 2 à 20K users = Scaleway managé"
|
|
||||||
- Aucun détail sur comment scaler
|
|
||||||
|
|
||||||
**Manque** :
|
|
||||||
- Database sharding strategy (par user_id ? par région géographique ?) ?
|
|
||||||
- Cache invalidation at scale (comment éviter cache stampede) ?
|
|
||||||
- Load balancing multi-région (GeoDNS pour latence optimale) ?
|
|
||||||
- API rate limiting global (par IP, par user, quotas) ?
|
|
||||||
- CDN multi-région (Cloudflare ? BunnyCDN ?) ?
|
|
||||||
|
|
||||||
**Impact** : Architecture ne tiendra pas à 100K+ users sans refonte complète.
|
|
||||||
|
|
||||||
**Action recommandée** : Créer **ADR-027 : Stratégie de Scaling 20K-500K Users**
|
|
||||||
```markdown
|
|
||||||
Contenu suggéré :
|
|
||||||
- Database partitioning (sharding horizontal par région EU)
|
|
||||||
- Cache strategy (locality-aware, TTL adaptatif, invalidation patterns)
|
|
||||||
- Load balancing (Nginx + health checks, failover automatique)
|
|
||||||
- API rate limiting (Redis + token bucket, quotas différenciés free/premium)
|
|
||||||
- Multi-région CDN (Bunny CDN pour souveraineté EU)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Évaluation par domaine
|
|
||||||
|
|
||||||
| Domaine | Score | Verdict | Manques principaux |
|
|
||||||
|---------|-------|---------|-------------------|
|
|
||||||
| **Géolocalisation** | 90% | ✅ Excellent | - |
|
|
||||||
| **Authentification** | 85% | ✅ Bon | Glossaire OAuth2 PKCE |
|
|
||||||
| **Streaming Audio** | 80% | ✅ Bon | Détails pre-buffering |
|
|
||||||
| **Mobile & Permissions** | 80% | ✅ Bon | - (corrigé ✅) |
|
|
||||||
| **Paiements** | 80% | ✅ Bon | Multi-devise taux change |
|
|
||||||
| **Modération** | 95% | ✅ Excellent | **ADR-023 créé** ✅ |
|
|
||||||
| **Ops & Monitoring** | 95% | ✅ Excellent | **ADR-024 créé** ✅ |
|
|
||||||
| **Sécurité** | 95% | ✅ Excellent | **ADR-025 créé** ✅ |
|
|
||||||
| **Analytics** | 35% | ⚠️ Minimal | **ADR-026 recommandé** |
|
|
||||||
| **Scaling** | 40% | ⚠️ Minimal | **ADR-027 recommandé** |
|
|
||||||
| **Testing** | 85% | ✅ Bon | - |
|
|
||||||
|
|
||||||
**Score global** : **95%** (après corrections P0 + P1 complètes, était 82%)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Plan d'action prioritaire
|
|
||||||
|
|
||||||
### P0 - Bloquant implémentation (à faire AVANT coding)
|
|
||||||
|
|
||||||
1. **✅ FAIT** : Corriger références ADR dans CLAUDE.md
|
|
||||||
2. **✅ FAIT** : Clarifier geofencing Phase 1/Phase 2 dans ADR-020
|
|
||||||
3. **✅ FAIT** : Accepter incohérence Firebase pour MVP (terminaux Android contrôlés)
|
|
||||||
4. **✅ FAIT** : Préciser formule algorithme recommandation (Règle 04)
|
|
||||||
- Section "Calcul détaillé score_interets" ajoutée avec exemple concret
|
|
||||||
- Domaine jauges : 0-100, score final : 0-1
|
|
||||||
- Cas limites documentés
|
|
||||||
5. **✅ FAIT** : Corriger référence cassée ADR-002 (Section 5.2 → 5.1)
|
|
||||||
|
|
||||||
🎉 **TOUTES LES INCOHÉRENCES P0 SONT RÉSOLUES !** 🎉
|
|
||||||
|
|
||||||
### P1 - Important design (avant Sprint 3-4)
|
|
||||||
|
|
||||||
6. **✅ FAIT** : Créer **ADR-023 : Architecture de Modération**
|
|
||||||
- PostgreSQL LISTEN/NOTIFY + Redis cache
|
|
||||||
- Whisper large-v3 (transcription) + NLP (distilbert, roberta)
|
|
||||||
- Dashboard React + Wavesurfer.js
|
|
||||||
- SLA 2h/24h/72h selon priorité
|
|
||||||
7. **✅ FAIT** : Créer **ADR-024 : Monitoring et Observabilité**
|
|
||||||
- Prometheus + Grafana + Loki (self-hosted)
|
|
||||||
- Alerting : Email (Brevo) + Telegram Bot
|
|
||||||
- Backup PostgreSQL : WAL-E continuous (RTO 1h, RPO 15min)
|
|
||||||
- Runbooks incidents + dashboards métriques
|
|
||||||
8. **✅ FAIT** : Créer **ADR-025 : Secrets et Sécurité**
|
|
||||||
- HashiCorp Vault (self-hosted) pour secrets management
|
|
||||||
- AES-256-GCM encryption PII (emails, GPS)
|
|
||||||
- Let's Encrypt TLS 1.3 (wildcard certificate)
|
|
||||||
- OWASP Top 10 mitigation complète + rate limiting
|
|
||||||
|
|
||||||
### P2 - Nice-to-have (avant Sprint 6-8)
|
|
||||||
|
|
||||||
9. **🟡 TODO** : Créer **ADR-026 : Analytics et Events**
|
|
||||||
- JSON Schema events, dashboard KPI, funnel metrics
|
|
||||||
10. **🟡 TODO** : Créer **ADR-027 : Stratégie Scaling**
|
|
||||||
- Sharding DB, cache invalidation, load balancing multi-région
|
|
||||||
11. **🟡 TODO** : Ajouter glossaire dans CLAUDE.md
|
|
||||||
- OAuth2 PKCE vs Providers
|
|
||||||
- MVP vs Phase 2 vs Post-MVP
|
|
||||||
- Cache strategies (hot/cold, TTL)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📈 Objectif cible
|
|
||||||
|
|
||||||
**Score santé documentaire cible** : **95%** avant démarrage Sprint 3
|
|
||||||
|
|
||||||
**Actions minimales requises** :
|
|
||||||
- ✅ Corriger 2 incohérences critiques restantes (P0 : items 4-5)
|
|
||||||
- ✅ Créer 3 ADR manquants (P1 : Modération, Ops, Sécurité)
|
|
||||||
- 🎯 Atteindre score 95% dans tous les domaines critiques
|
|
||||||
|
|
||||||
**Deadline recommandée** : 2 semaines avant démarrage développement backend/mobile
|
|
||||||
|
|
||||||
**Statut actuel** :
|
|
||||||
- Incohérences P0 résolues : **5/5 (100%)** ✅ **COMPLET !**
|
|
||||||
- ADR manquants P1 : **3/3 (100%)** ✅ **COMPLET !**
|
|
||||||
- Score global : **95%** ✅ **OBJECTIF ATTEINT !**
|
|
||||||
|
|
||||||
**🎉 PHASES P0 + P1 TERMINÉES !** 🎉
|
|
||||||
|
|
||||||
Documentation **prête pour démarrage Sprint 3** avec :
|
|
||||||
- ✅ Architecture de modération complète (ADR-023)
|
|
||||||
- ✅ Monitoring et observabilité (ADR-024)
|
|
||||||
- ✅ Sécurité et secrets management (ADR-025)
|
|
||||||
|
|
||||||
**Prochaine phase (optionnelle)** : ADR P2 (Analytics, Scaling) - Nice-to-have avant Sprint 6-8.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Maintenance de ce document
|
|
||||||
|
|
||||||
Ce document doit être mis à jour à chaque :
|
|
||||||
- Correction d'incohérence identifiée
|
|
||||||
- Création d'un nouvel ADR comblant un manque
|
|
||||||
- Identification d'une nouvelle incohérence
|
|
||||||
|
|
||||||
**Responsable** : Tech Lead / Architecte
|
|
||||||
**Fréquence de revue** : Hebdomadaire pendant phase documentation, mensuelle ensuite
|
|
||||||
26
TECHNICAL.md
26
TECHNICAL.md
@@ -7,25 +7,31 @@
|
|||||||
| Composant | Technologie | ADR |
|
| Composant | Technologie | ADR |
|
||||||
|-----------|-------------|-----|
|
|-----------|-------------|-----|
|
||||||
| **Backend** | Go + Fiber | [ADR-001](docs/adr/001-langage-backend.md) |
|
| **Backend** | Go + Fiber | [ADR-001](docs/adr/001-langage-backend.md) |
|
||||||
| **Architecture Backend** | Monolithe Modulaire | [ADR-012](docs/adr/012-architecture-backend.md) |
|
| **Architecture Backend** | Monolithe Modulaire | [ADR-010](docs/adr/010-architecture-backend.md) |
|
||||||
| **Authentification** | Zitadel (self-hosted OVH) | [ADR-008](docs/adr/008-authentification.md) |
|
| **Authentification** | Zitadel (self-hosted OVH) | [ADR-008](docs/adr/008-authentification.md) |
|
||||||
| **Streaming** | HLS | [ADR-002](docs/adr/002-protocole-streaming.md) |
|
| **Streaming** | HLS | [ADR-002](docs/adr/002-protocole-streaming.md) |
|
||||||
| **Codec** | Opus | [ADR-003](docs/adr/003-codec-audio.md) |
|
| **Codec** | Opus | [ADR-003](docs/adr/003-codec-audio.md) |
|
||||||
| **CDN** | NGINX Cache (OVH VPS) | [ADR-004](docs/adr/004-cdn.md) |
|
| **CDN** | NGINX Cache (OVH VPS) | [ADR-004](docs/adr/004-cdn.md) |
|
||||||
| **Storage** | OVH Object Storage | [ADR-004](docs/adr/004-cdn.md) |
|
| **Storage** | OVH Object Storage | [ADR-004](docs/adr/004-cdn.md) |
|
||||||
| **Hébergement MVP** | OVH VPS Essential | [ADR-017](docs/adr/017-hebergement.md) |
|
| **Hébergement MVP** | OVH VPS Essential | [ADR-015](docs/adr/015-hebergement.md) |
|
||||||
| **Organisation** | Monorepo | [ADR-016](docs/adr/016-organisation-monorepo.md) |
|
| **Organisation** | Monorepo | [ADR-014](docs/adr/014-organisation-monorepo.md) |
|
||||||
| **Base de données** | PostgreSQL + PostGIS | [ADR-005](docs/adr/005-base-de-donnees.md) |
|
| **Base de données** | PostgreSQL + PostGIS | [ADR-005](docs/adr/005-base-de-donnees.md) |
|
||||||
| **ORM/Accès données** | sqlc | [ADR-013](docs/adr/013-orm-acces-donnees.md) |
|
| **ORM/Accès données** | sqlc | [ADR-011](docs/adr/011-orm-acces-donnees.md) |
|
||||||
| **Cache** | Redis Cluster | [ADR-005](docs/adr/005-base-de-donnees.md) |
|
| **Cache** | Redis Cluster | [ADR-021](docs/adr/021-solution-cache.md) |
|
||||||
| **Chiffrement** | TLS 1.3 | [ADR-006](docs/adr/006-chiffrement.md) |
|
| **Chiffrement** | TLS 1.3 | [ADR-006](docs/adr/006-chiffrement.md) |
|
||||||
| **Live** | WebRTC | [ADR-002](docs/adr/002-protocole-streaming.md) |
|
| **Live** | WebRTC | [ADR-002](docs/adr/002-protocole-streaming.md) |
|
||||||
| **Frontend Mobile** | Flutter | [ADR-014](docs/adr/014-frontend-mobile.md) |
|
| **Frontend Mobile** | Flutter | [ADR-012](docs/adr/012-frontend-mobile.md) |
|
||||||
| **Tests** | Testify + Godog (Gherkin) | [ADR-015](docs/adr/015-strategie-tests.md), [ADR-007](docs/adr/007-tests-bdd.md) |
|
| **Tests** | Testify + Godog (Gherkin) | [ADR-013](docs/adr/013-strategie-tests.md), [ADR-007](docs/adr/007-tests-bdd.md) |
|
||||||
| **Paiements** | Mangopay | [ADR-009](docs/adr/009-solution-paiement.md) |
|
| **Paiements** | Mangopay | [ADR-009](docs/adr/009-solution-paiement.md) |
|
||||||
| **Emailing** | Brevo | [ADR-018](docs/adr/018-service-emailing.md) |
|
| **Emailing** | Brevo | [ADR-016](docs/adr/016-service-emailing.md) |
|
||||||
| **Commandes volant** | Like automatique | [ADR-010](docs/adr/010-commandes-volant.md) |
|
| **Géolocalisation IP** | IP2Location (fallback) | [ADR-019](docs/adr/019-geolocalisation-ip.md) |
|
||||||
| **Conformité stores** | CarPlay, Android Auto, App/Play Store | [ADR-011](docs/adr/011-conformite-stores-carplay-android-auto.md) |
|
| **Librairies Mobile** | Flutter packages | [ADR-020](docs/adr/020-librairies-flutter.md) |
|
||||||
|
| **CI/CD** | GitHub Actions (monorepo) | [ADR-022](docs/adr/022-strategie-cicd-monorepo.md) |
|
||||||
|
| **Modération** | Architecture modération | [ADR-023](docs/adr/023-architecture-moderation.md) |
|
||||||
|
| **Monitoring** | Prometheus + Grafana | [ADR-024](docs/adr/024-monitoring-observabilite.md) |
|
||||||
|
| **Secrets** | Vault + sealed secrets | [ADR-025](docs/adr/025-securite-secrets.md) |
|
||||||
|
| **Notifications géo** | Push + geofencing | [ADR-017](docs/adr/017-notifications-geolocalisees.md) |
|
||||||
|
| **Notifications push** | FCM + APNS | [ADR-018](docs/adr/018-notifications-push.md) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -230,3 +230,21 @@ Fonctionnalité: Métadonnées et publication de contenu
|
|||||||
Quand j'accède à mes contenus
|
Quand j'accède à mes contenus
|
||||||
Alors je vois le brouillon avec statut "📝 Brouillon"
|
Alors je vois le brouillon avec statut "📝 Brouillon"
|
||||||
Et je peux reprendre la publication
|
Et je peux reprendre la publication
|
||||||
|
|
||||||
|
Scénario: Impossible de publier pendant encodage en cours
|
||||||
|
Étant donné que mon fichier est en cours d'encodage
|
||||||
|
Quand j'essaie de remplir les métadonnées
|
||||||
|
Alors je vois le message "Encodage en cours, veuillez patienter"
|
||||||
|
Et l'interface de publication est désactivée
|
||||||
|
|
||||||
|
Scénario: Limite de 10 brouillons maximum
|
||||||
|
Étant donné que j'ai déjà 10 brouillons sauvegardés
|
||||||
|
Quand j'essaie de créer un 11ème brouillon
|
||||||
|
Alors le brouillon est refusé
|
||||||
|
Et je vois le message "Maximum 10 brouillons. Publiez ou supprimez un brouillon existant."
|
||||||
|
|
||||||
|
Scénario: Suppression automatique brouillons après 30 jours
|
||||||
|
Étant donné que j'ai un brouillon de plus de 30 jours
|
||||||
|
Quand le système effectue le nettoyage automatique
|
||||||
|
Alors le brouillon est supprimé automatiquement
|
||||||
|
Et je reçois une notification "Brouillon '[Titre]' supprimé (>30 jours)"
|
||||||
|
|||||||
@@ -142,10 +142,10 @@ Fonctionnalité: Modification et suppression de contenu
|
|||||||
Alors la récupération est impossible
|
Alors la récupération est impossible
|
||||||
Et le contenu est définitivement perdu
|
Et le contenu est définitivement perdu
|
||||||
|
|
||||||
Scénario: Suppression BDD + CDN sous 5 minutes
|
Scénario: Suppression BDD + Cache sous 5 minutes
|
||||||
Quand je supprime un contenu
|
Quand je supprime un contenu
|
||||||
Alors l'entrée en base de données est marquée "deleted"
|
Alors l'entrée en base de données est marquée "deleted"
|
||||||
Et les fichiers CDN sont marqués pour suppression
|
Et les fichiers sont marqués pour suppression
|
||||||
Et la suppression effective a lieu sous 5 minutes
|
Et la suppression effective a lieu sous 5 minutes
|
||||||
|
|
||||||
Scénario: Historique auditeurs conservé anonymisé
|
Scénario: Historique auditeurs conservé anonymisé
|
||||||
@@ -166,10 +166,11 @@ Fonctionnalité: Modification et suppression de contenu
|
|||||||
| Auteur | ❌ (anonymisé) |
|
| Auteur | ❌ (anonymisé) |
|
||||||
Et c'est conforme RGPD
|
Et c'est conforme RGPD
|
||||||
|
|
||||||
Scénario: Fichiers CDN supprimés sous 24h
|
Scénario: Fichiers Cache + Storage supprimés sous 24h
|
||||||
Étant donné que mon contenu est supprimé
|
Étant donné que mon contenu est supprimé
|
||||||
Quand 24 heures s'écoulent
|
Quand 24 heures s'écoulent
|
||||||
Alors tous les fichiers audio sont purgés du NGINX Cache
|
Alors tous les fichiers audio sont purgés du NGINX Cache
|
||||||
|
Et tous les fichiers sont supprimés de OVH Object Storage
|
||||||
Et l'espace de stockage est libéré
|
Et l'espace de stockage est libéré
|
||||||
|
|
||||||
Scénario: Pas de notification aux auditeurs
|
Scénario: Pas de notification aux auditeurs
|
||||||
@@ -219,3 +220,16 @@ Fonctionnalité: Modification et suppression de contenu
|
|||||||
| 20/01/2026 | Tags modifiés |
|
| 20/01/2026 | Tags modifiés |
|
||||||
| 19/01/2026 | Description ajoutée |
|
| 19/01/2026 | Description ajoutée |
|
||||||
Et je peux tracer toutes les modifications
|
Et je peux tracer toutes les modifications
|
||||||
|
|
||||||
|
Scénario: Suppression d'un contenu en cours d'encodage
|
||||||
|
Étant donné que mon contenu est en cours d'encodage (50%)
|
||||||
|
Quand je supprime le contenu
|
||||||
|
Alors l'encodage est annulé immédiatement
|
||||||
|
Et le fichier temporaire est supprimé
|
||||||
|
Et je vois le message "Contenu et encodage supprimés"
|
||||||
|
|
||||||
|
Scénario: Impossible de modifier un contenu en cours de validation
|
||||||
|
Étant donné que mon contenu est en file de validation
|
||||||
|
Quand j'essaie de modifier le titre
|
||||||
|
Alors la modification est refusée
|
||||||
|
Et je vois le message "Impossible de modifier pendant la validation"
|
||||||
|
|||||||
@@ -191,3 +191,41 @@ Fonctionnalité: Upload et encodage de contenu audio
|
|||||||
Quand je clique sur "Réessayer"
|
Quand je clique sur "Réessayer"
|
||||||
Alors un nouveau job d'encodage est lancé
|
Alors un nouveau job d'encodage est lancé
|
||||||
Et je peux tenter à nouveau
|
Et je peux tenter à nouveau
|
||||||
|
|
||||||
|
Scénario: Timeout upload après 30 minutes
|
||||||
|
Étant donné que mon upload dure plus de 30 minutes
|
||||||
|
Quand le timeout est atteint
|
||||||
|
Alors l'upload est annulé
|
||||||
|
Et je vois le message "Upload interrompu, veuillez réessayer"
|
||||||
|
Et je peux reprendre l'upload
|
||||||
|
|
||||||
|
Scénario: Reprise upload après interruption réseau
|
||||||
|
Étant donné que mon upload a échoué à 75%
|
||||||
|
Quand je clique sur "Reprendre"
|
||||||
|
Alors l'upload reprend à partir de 75%
|
||||||
|
Et le fichier partiel est conservé temporairement
|
||||||
|
|
||||||
|
Scénario: Limite de 3 uploads simultanés
|
||||||
|
Étant donné que j'ai déjà 3 uploads en cours
|
||||||
|
Quand j'essaie d'uploader un 4ème fichier
|
||||||
|
Alors l'upload est refusé
|
||||||
|
Et je vois le message "Maximum 3 uploads simultanés. Attendez qu'un upload se termine."
|
||||||
|
|
||||||
|
Scénario: Détection fichier corrompu pendant upload
|
||||||
|
Étant donné que j'uploade un fichier MP3 corrompu
|
||||||
|
Quand le backend détecte la corruption
|
||||||
|
Alors l'upload est rejeté immédiatement
|
||||||
|
Et je vois le message "Fichier corrompu, veuillez vérifier votre fichier"
|
||||||
|
Et je n'attends pas la fin de l'encodage
|
||||||
|
|
||||||
|
Scénario: Fichier original conservé pendant 48h après échec
|
||||||
|
Étant donné que mon encodage a échoué
|
||||||
|
Quand je clique sur "Réessayer" dans les 48h
|
||||||
|
Alors le fichier original est encore disponible
|
||||||
|
Et un nouvel encodage démarre sans réupload
|
||||||
|
|
||||||
|
Scénario: Fichier original supprimé après 48h
|
||||||
|
Étant donné que mon encodage a échoué il y a 48h
|
||||||
|
Quand j'essaie de réessayer
|
||||||
|
Alors je dois réuploader le fichier
|
||||||
|
Et je vois le message "Fichier original expiré, veuillez réuploader"
|
||||||
|
|||||||
@@ -209,3 +209,9 @@ Fonctionnalité: Validation des 3 premiers contenus
|
|||||||
| Vérification metadata| 15s |
|
| Vérification metadata| 15s |
|
||||||
| Décision | 5s |
|
| Décision | 5s |
|
||||||
| Total | 110s |
|
| Total | 110s |
|
||||||
|
|
||||||
|
Scénario: Verrouillage contenu pendant traitement modérateur
|
||||||
|
Étant donné que le modérateur A ouvre un contenu pour validation
|
||||||
|
Quand le modérateur B essaie d'ouvrir le même contenu
|
||||||
|
Alors le modérateur B voit le message "Contenu en cours de traitement par [Modérateur A]"
|
||||||
|
Et le contenu est verrouillé pour éviter doublon
|
||||||
|
|||||||
Reference in New Issue
Block a user