docs(shared): ajouter documentation complète entités, états et séquences

- Entités: 7 nouveaux schémas (sessions, devices, consents, location-history, interest-gauges, reports, exports)
- États: 5 diagrammes lifecycles (compte, contenu, session, signalement, export)
- Séquences: 6 flows (auth, refresh token, modération, signalement, export, suppression)
- Renommage: modele-global.md → entities-overview.md
- MkDocs: organisation hiérarchique par catégories

Format concis: diagrammes Mermaid + règles essentielles uniquement
This commit is contained in:
jpgiannetti
2026-02-07 21:38:02 +01:00
parent cf7a46be27
commit e63603551d
22 changed files with 1047 additions and 97 deletions

View File

@@ -0,0 +1,48 @@
# Séquence - Suppression de compte
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant API as Backend API
participant DB as PostgreSQL
participant E as Email
participant J as Job Quotidien
U->>API: DELETE /account (demande suppression)
API->>DB: UPDATE account_status=grace_period
API->>DB: UPDATE deletion_requested_at=NOW()
API->>DB: UPDATE sessions.revoked_at=NOW() (toutes)
API->>DB: UPDATE contents (cachés, non diffusés)
API->>E: Email avec lien annulation (30j)
API-->>U: Compte désactivé
alt Utilisateur change d'avis
U->>API: GET /account/cancel-deletion (lien email)
API->>DB: UPDATE account_status=active
API->>DB: UPDATE deletion_requested_at=NULL
API->>DB: Réactivation contenus
API->>E: Email confirmation annulation
API-->>U: Compte réactivé
else Après 30 jours
J->>DB: SELECT users WHERE grace_period > 30j
J->>DB: UPDATE account_status=deleted
J->>DB: Anonymisation données (email, pseudo...)
J->>DB: UPDATE contents.creator="Utilisateur supprimé"
J->>DB: DELETE listening_history, location_history, sessions
J->>DB: Conservation contenus anonymisés
J-->>DB: Suppression complète
end
```
## Légende
**Grace period** : 30 jours pour annuler
**Annulation** : Via lien email unique
**Anonymisation** :
- Données perso supprimées (email, pseudo, GPS...)
- Contenus conservés anonymes (intérêt communauté)
- Irréversible après 30j
**Alternative** : Purge auto inactivité 5 ans (notifications 90j/30j/7j avant)

View File

@@ -0,0 +1,42 @@
# Séquence - Authentification
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant A as App Mobile
participant Z as Zitadel
participant API as Backend API
participant DB as PostgreSQL
U->>A: Saisie email/password
A->>Z: POST /oauth/token (email, password)
Z->>Z: Validation credentials
Z-->>A: access_token (15min) + refresh_token (30j)
A->>API: GET /api/user/profile (Bearer token)
API->>Z: Validation JWT
Z-->>API: Token valide + user_id
API->>DB: SELECT user WHERE id = ?
DB-->>API: Données utilisateur
API-->>A: Profil utilisateur
A->>DB: INSERT session (hash tokens, IP, device)
A->>U: Connexion réussie
```
## Légende
**Acteurs** :
- Zitadel : Gère l'authentification OAuth2/OIDC
- Backend API : Valide les tokens et accède aux données
**Tokens** :
- Access token : 15 min (JWT), utilisé pour chaque requête API
- Refresh token : 30 jours, permet renouvellement access token
**Sécurité** :
- Tokens stockés hashés (SHA256) en DB
- Device fingerprinting (OS, navigateur, IP)
- Notification si nouveau device

View File

@@ -0,0 +1,44 @@
# Séquence - Modération de contenu
## Diagramme
```mermaid
sequenceDiagram
participant C as Créateur
participant API as Backend API
participant DB as PostgreSQL
participant Q as Queue
participant M as Modérateur
participant N as Notification
C->>API: POST /contents (3 premiers contenus)
API->>DB: INSERT content (status=pending_review)
API->>Q: Ajout file modération
API-->>C: Contenu soumis
Q->>M: Notification nouveau contenu
M->>API: GET /moderation/contents/pending
API-->>M: Liste contenus à modérer
M->>M: Écoute + vérification
alt Validation
M->>API: POST /moderation/approve/{id}
API->>DB: UPDATE status=published
API->>N: Email + push créateur
N-->>C: Contenu publié ✓
else Rejet
M->>API: POST /moderation/reject/{id} (motif)
API->>DB: UPDATE status=rejected
API->>DB: INSERT strike (si grave)
API->>N: Email créateur (motif)
N-->>C: Contenu rejeté + motif
end
```
## Légende
**Modération préalable** : 3 premiers contenus uniquement
**Après validation** : Publication directe (modération a posteriori via signalements)
**Délai** : 48h maximum
**Strike** : +1 si violation grave

View File

@@ -0,0 +1,51 @@
# Séquence - Signalement de contenu
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant API as Backend API
participant DB as PostgreSQL
participant M as Modérateur
participant C as Créateur
participant N as Notification
U->>API: POST /reports (content_id, category, comment)
API->>DB: INSERT report (status=pending)
API->>DB: UPDATE contents.reports_count++
alt Priorité haute (3+ reports)
API->>N: Alerte modérateurs
end
API-->>U: Signalement enregistré
M->>API: GET /moderation/reports/pending
API-->>M: Reports triés par priorité
M->>API: PUT /reports/{id} (status=under_review)
M->>M: Écoute contenu + contexte
alt Violation confirmée
M->>API: POST /moderation/action (action_taken)
API->>DB: UPDATE content.status=moderated
API->>DB: UPDATE report.status=actioned
API->>DB: INSERT strike (créateur)
API->>N: Notification créateur + signaleur
N-->>C: Contenu retiré (motif + appel)
N-->>U: Action prise
else Infondé
M->>API: PUT /reports/{id} (status=dismissed)
API->>DB: UPDATE report
API->>N: Notification signaleur
N-->>U: Signalement rejeté
end
```
## Légende
**Priorité haute** : 3+ signalements ou catégories critiques (hate_speech, violence)
**Délai** : < 24h priorité haute, < 48h normale
**Anti-abus** : > 5 dismissed → warning signaleur
**Appel** : Créateur peut contester 7j après moderation

View File

@@ -0,0 +1,49 @@
# Séquence - Export de données RGPD
## Diagramme
```mermaid
sequenceDiagram
participant U as Utilisateur
participant API as Backend API
participant DB as PostgreSQL
participant W as Worker
participant S as OVH Storage
participant E as Email
U->>API: POST /exports (demande)
API->>DB: Vérification limite (1/mois)
API->>DB: INSERT export (status=pending)
API->>W: Job asynchrone
API-->>U: Export en préparation
W->>DB: Collecte données (profil, écoutes, contenus...)
W->>W: Génération JSON + HTML
loop Contenus audio
W->>DB: SELECT audio_url
W->>W: Copie fichier
end
W->>W: Création ZIP
W->>S: Upload fichier
S-->>W: URL signée (7j)
W->>DB: UPDATE export (status=ready, url, size)
W->>E: Email avec lien download
E-->>U: Export prêt (expire 7j)
U->>S: GET /export-signed-url
S-->>U: Téléchargement ZIP
Note over DB: Job quotidien
DB->>S: DELETE exports expirés (> 7j)
```
## Légende
**Conformité RGPD** : Délai max 48h (Article 20)
**Format** : ZIP (JSON machine-readable + HTML human-readable + audio)
**Limite** : 1 export/mois
**Expiration** : 7 jours calendaires
**Sécurité** : URL signée unique

View File

@@ -0,0 +1,38 @@
# Séquence - Refresh Token
## Diagramme
```mermaid
sequenceDiagram
participant A as App Mobile
participant Z as Zitadel
participant DB as PostgreSQL
Note over A: Access token expiré (15min)
A->>Z: POST /oauth/token (refresh_token)
Z->>DB: Vérification hash refresh_token
alt Token valide
Z->>Z: Génération nouveaux tokens
Z->>DB: Update session (nouveau hash)
Z->>DB: Invalidation ancien refresh_token
Z-->>A: Nouveaux tokens
Note over DB: Rotation complète
else Token invalide ou rejoué
Z->>DB: Révocation toutes sessions user
Z-->>A: 401 Unauthorized
Note over A: Reconnexion requise
end
```
## Légende
**Rotation** :
- Nouveau refresh_token à chaque refresh
- Ancien token invalidé immédiatement
- Prévient replay attack
**Sécurité** :
- Si ancien token réutilisé → révocation globale
- Logs sécurité + notification utilisateur