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:
48
docs/domains/_shared/sequences/account-deletion.md
Normal file
48
docs/domains/_shared/sequences/account-deletion.md
Normal 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)
|
||||
42
docs/domains/_shared/sequences/authentication-flow.md
Normal file
42
docs/domains/_shared/sequences/authentication-flow.md
Normal 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
|
||||
44
docs/domains/_shared/sequences/content-moderation.md
Normal file
44
docs/domains/_shared/sequences/content-moderation.md
Normal 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
|
||||
51
docs/domains/_shared/sequences/content-report.md
Normal file
51
docs/domains/_shared/sequences/content-report.md
Normal 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
|
||||
49
docs/domains/_shared/sequences/data-export.md
Normal file
49
docs/domains/_shared/sequences/data-export.md
Normal 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
|
||||
38
docs/domains/_shared/sequences/token-refresh.md
Normal file
38
docs/domains/_shared/sequences/token-refresh.md
Normal 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
|
||||
Reference in New Issue
Block a user