Relations - StevenYAMBOS/Smash-Here-API GitHub Wiki
Cette documentation détaille les relations entre les collections MongoDB et les opérations en cascade pour maintenir la cohérence des données.
erDiagram
user ||--o{ roadmap : "CreatedBy/UpdatedBy"
user ||--o{ step : "CreatedBy/UpdatedBy"
user ||--o{ content : "CreatedBy/UpdatedBy"
user ||--o{ guide : "CreatedBy/UpdatedBy"
user ||--o{ game : "CreatedBy/UpdatedBy"
user ||--o{ comment : "CreatedBy/UpdatedBy"
user ||--o{ attachment : "CreatedBy"
user ||--o{ progression : "User"
roadmap ||--o{ step : "contains"
roadmap ||--o{ comment : "commented_on"
roadmap ||--o{ progression : "tracked_in"
roadmap }o--o{ game : "belongs_to"
roadmap }o--o{ tag : "tagged_with"
step ||--o{ content : "contains"
step ||--o{ progression : "tracked_for"
step }o--o{ step : "PreviousSteps/NextSteps"
content }o--o{ guide : "references"
guide ||--o{ attachment : "contains"
guide ||--o{ comment : "commented_on"
guide }o--o{ tag : "tagged_with"
guide }o--|| game : "associated_with"
comment ||--o{ comment : "Responses"
-
Créateur/Modificateur :
roadmap
,step
,content
,guide
,game
,comment
,tag
,attachment
-
Participant :
progression
,comment.User
-
Bookmarks :
roadmap
(many-to-many)
-
Contient :
step
(many-to-many) -
Appartient à :
game
(many-to-many) -
Taggée avec :
tag
(many-to-many) -
Commentée par :
comment
(one-to-many) -
Suivie dans :
progression
(one-to-many)
-
Contient :
attachment
(one-to-many) -
Référencée dans :
content
(many-to-many) -
Associée à :
game
(many-to-one, optionnel) -
Taggée avec :
tag
(many-to-many) -
Commentée par :
comment
(one-to-many)
Collection modifiée : comment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
comment |
Créer document | ✅ |
roadmap ou guide
|
Ajouter dans Comments[]
|
✅ |
user |
Ajouter dans Comments[]
|
✅ |
roadmap ou guide
|
Incrémenter commentsCount
|
✅ |
1. Créer document dans collection `comment`
2. Ajouter ObjectId dans roadmap.Comments[] ou guide.Comments[]
3. Ajouter ObjectId dans user.Comments[]
4. Incrémenter roadmap.commentsCount ou guide.commentsCount
Collection modifiée : comment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
comment |
Supprimer réponses (Responses[] ) |
✅ |
roadmap ou guide
|
Retirer de Comments[]
|
✅ |
user |
Retirer de Comments[]
|
✅ |
roadmap ou guide
|
Décrémenter commentsCount
|
✅ |
comment |
Supprimer document | ✅ |
1. Supprimer toutes les réponses (comment.Responses[])
2. Retirer ObjectId de roadmap.Comments[] ou guide.Comments[]
3. Retirer ObjectId de user.Comments[]
4. Décrémenter roadmap.commentsCount ou guide.commentsCount
5. Supprimer document de collection `comment`
Collection modifiée : comment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
comment |
Créer document réponse | ✅ |
comment |
Ajouter dans comment_parent.Responses[]
|
✅ |
user |
Ajouter dans Comments[]
|
✅ |
roadmap ou guide
|
Incrémenter commentsCount
|
✅ |
1. Créer document réponse dans collection `comment`
2. Ajouter ObjectId dans comment_parent.Responses[]
3. Ajouter ObjectId dans user.Comments[]
4. Incrémenter roadmap.commentsCount ou guide.commentsCount
Collection modifiée : comment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
comment |
Retirer de comment_parent.Responses[]
|
✅ |
user |
Retirer de Comments[]
|
✅ |
roadmap ou guide
|
Décrémenter commentsCount
|
✅ |
comment |
Supprimer document | ✅ |
1. Retirer ObjectId de comment_parent.Responses[]
2. Retirer ObjectId de user.Comments[]
3. Décrémenter roadmap.commentsCount ou guide.commentsCount
4. Supprimer document de collection `comment`
Collection modifiée : user
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
comment |
Anonymiser (CreatedBy = null) |
✅ |
guide |
Supprimer guides créés | ✅ |
attachment |
Supprimer attachments des guides et des attachments | ✅ |
progression |
Supprimer toutes progressions | ✅ |
roadmap , guide
|
Retirer de Bookmarks[] , Likes[] , Views[]
|
✅ |
roadmap , step , content
|
Transférer ownership à admin | ✅ |
user |
Supprimer document | ✅ |
1. Anonymiser tous les commentaires (CreatedBy = null, message = "[deleted]")
2. Supprimer tous les guides créés + leurs attachments
3. Supprimer toutes les progressions de l'utilisateur
4. Retirer de tous les bookmarks, likes, views
5. Transférer ownership des roadmaps/steps/contents à un admin
6. Supprimer document de collection `user`
Collection modifiée : game
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
game |
Créer document | ❌ |
1. Créer document dans collection `game`
// Aucune relation automatique
Collection modifiée : game
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
game |
Mettre à jour document | ❌ |
game |
Mettre à jour UpdatedBy
|
❌ |
1. Mettre à jour document dans collection `game`
2. Mettre à jour game.UpdatedBy
// Aucune propagation vers les roadmaps liées
Collection modifiée : game
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
roadmap |
Retirer de Games[]
|
✅ |
guide |
Retirer référence Game (set null ) |
✅ |
attachment |
Retirer référence Game (set null ) |
✅ |
game |
Supprimer document | ✅ |
1. Retirer ObjectId de toutes roadmap.Games[]
2. Retirer ObjectId de tous guide.Game (set à null)
3. Retirer ObjectId de tous attachment.Game (set à null)
4. Supprimer document de collection `game`
Collection modifiée : content
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
content |
Créer document | ✅ |
step |
Ajouter dans Contents[]
|
✅ |
user |
Ajouter dans ContentsCreated[]
|
✅ |
1. Créer document dans collection `content`
2. Ajouter ObjectId dans step.Contents[] (si spécifié)
3. Ajouter ObjectId dans user.ContentsCreated[]
Collection modifiée : content
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
content |
Mettre à jour document | ❌ |
content |
Mettre à jour UpdatedBy
|
❌ |
1. Mettre à jour document dans collection `content`
2. Mettre à jour content.UpdatedBy
// Aucune propagation vers les steps liées
Collection modifiée : content
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
step |
Retirer de Contents[]
|
✅ |
user |
Retirer de ContentsCreated[]
|
✅ |
guide |
Retirer lien Contents[] (si type guide) |
✅ |
content |
Supprimer document | ✅ |
1. Retirer ObjectId de toutes step.Contents[]
2. Retirer ObjectId de user.ContentsCreated[]
3. Si type = "guide", retirer lien avec guide.Contents[]
4. Supprimer document de collection `content`
Collection modifiée : step
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
step |
Créer document | ✅ |
roadmap |
Ajouter dans Steps[]
|
✅ |
user |
Ajouter dans StepsCreated[]
|
✅ |
step |
Lier PreviousSteps /NextSteps
|
✅ |
1. Créer document dans collection `step`
2. Ajouter ObjectId dans roadmap.Steps[] (si spécifiée)
3. Ajouter ObjectId dans user.StepsCreated[]
4. Lier avec PreviousSteps/NextSteps (si spécifiées)
Collection modifiée : step
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
step |
Mettre à jour document | ❌ |
step |
Mettre à jour UpdatedBy
|
❌ |
1. Mettre à jour document dans collection `step`
2. Mettre à jour step.UpdatedBy
// Aucune propagation automatique
Collection modifiée : step
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
roadmap |
Retirer de Steps[]
|
✅ |
user |
Retirer de StepsCreated[]
|
✅ |
progression |
Supprimer progressions liées | ✅ |
step |
Retirer des PreviousSteps /NextSteps
|
✅ |
content |
Supprimer contenus orphelins | ✅ |
step |
Supprimer document | ✅ |
1. Retirer ObjectId de toutes roadmap.Steps[]
2. Retirer ObjectId de user.StepsCreated[]
3. Supprimer toutes les progressions liées (collection `progression`)
4. Retirer des PreviousSteps/NextSteps des autres étapes
5. Supprimer tous les contenus orphelins (si step était seule référence)
6. Supprimer document de collection `step`
Collection modifiée : roadmap
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
roadmap |
Créer document | ✅ |
user |
Ajouter dans RoadmapsCreated[]
|
✅ |
game |
Ajouter dans Roadmaps[]
|
✅ |
1. Créer document dans collection `roadmap`
2. Ajouter ObjectId dans user.RoadmapsCreated[]
3. Ajouter ObjectId dans game.Roadmaps[] (si spécifié)
Collection modifiée : roadmap
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
roadmap |
Mettre à jour document | ❌ |
roadmap |
Mettre à jour UpdatedBy
|
❌ |
1. Mettre à jour document dans collection `roadmap`
2. Mettre à jour roadmap.UpdatedBy
// Aucune propagation vers les steps/games liées
Collection modifiée : roadmap
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
progression |
Supprimer progressions liées | ✅ |
comment |
Supprimer commentaires liés | ✅ |
user |
Retirer de RoadmapsCreated[]
|
✅ |
user |
Retirer de Bookmarks[]
|
✅ |
user |
Retirer de RoadmapsStarted[]
|
✅ |
game |
Retirer de Roadmaps[]
|
✅ |
step |
Gérer étapes orphelines | ✅ |
roadmap |
Supprimer document | ✅ |
1. Supprimer toutes les progressions liées (collection `progression`)
2. Supprimer tous les commentaires liés
3. Retirer ObjectId de user.RoadmapsCreated[]
4. Retirer ObjectId de tous user.Bookmarks[]
5. Retirer ObjectId de tous user.RoadmapsStarted[]
6. Retirer ObjectId de game.Roadmaps[]
7. Gérer les étapes orphelines (si step n'appartient qu'à cette roadmap)
8. Supprimer document de collection `roadmap`
Collection modifiée : guide
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
guide |
Créer document | ✅ |
user |
Ajouter dans GuidesCreated[]
|
✅ |
1. Créer document dans collection `guide`
2. Ajouter ObjectId dans user.GuidesCreated[] (à ajouter dans user)
Collection modifiée : guide
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
guide |
Mettre à jour document | ❌ |
guide |
Mettre à jour UpdatedBy
|
❌ |
guide |
Incrémenter version | ❌ |
1. Mettre à jour document dans collection `guide`
2. Mettre à jour guide.UpdatedBy
3. Mettre à jour guide.version (incrément automatique)
// Aucune propagation vers les contenus liés
Collection modifiée : guide
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
attachment |
Supprimer attachments liés | ✅ |
comment |
Supprimer commentaires liés | ✅ |
user |
Retirer de GuidesCreated[]
|
✅ |
guide |
Retirer de Likes[] , Views[]
|
✅ |
game |
Retirer de Guides[]
|
✅ |
guide |
Supprimer document | ✅ |
1. Supprimer tous les attachments liés (collection `attachment`)
2. Supprimer tous les commentaires liés
3. Retirer ObjectId de user.GuidesCreated[]
4. Retirer ObjectId de game.Guides[]
5. Retirer ObjectId de toutes les listes Likes/Views
6. Supprimer document de collection `guide`
Collection modifiée : attachment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
attachment |
Créer document | ✅ |
user |
Ajouter dans AttachmentsCreated[]
|
✅ |
1. Créer document dans collection `attachment`
2. Ajouter ObjectId dans user.AttachmentsCreated[] (à ajouter dans user)
Collection modifiée : attachment
Relations en cascade : ❌
Collection | Action | Cascade |
---|---|---|
attachment |
Mettre à jour document | ❌ |
attachment |
Mettre à jour UpdatedBy
|
❌ |
1. Mettre à jour document dans collection `attachment`
2. Mettre à jour attachment.UpdatedBy
// Aucune propagation vers les contenus liés
Collection modifiée : attachment
Relations en cascade : ✅
Collection | Action | Cascade |
---|---|---|
user |
Retirer de AttachmentsCreated[]
|
✅ |
game |
Retirer de Attachments[]
|
✅ |
attachment |
Supprimer document | ✅ |
Opération | Vérification Préalable |
---|---|
Supprimer user | Vérifier s'il est créateur unique de roadmaps critiques |
Supprimer roadmap | Vérifier les progressions actives des utilisateurs |
Supprimer step | Vérifier les dépendances PreviousSteps/NextSteps |
Supprimer guide | Vérifier les références dans les contenus |
Si échec lors d'une opération en cascade :
1. Rollback de toutes les modifications
2. Log de l'erreur avec contexte complet
3. Notification à l'administrateur
4. Retour d'erreur explicite à l'utilisateur
-
Soft delete : Pour les entités critiques (
user
,roadmap
) - Batch operations : Pour les suppressions multiples
- Background jobs : Pour les opérations lourdes (suppression utilisateur)
- Cache invalidation : Lors des modifications impactant les compteurs
Cette documentation doit être maintenue à jour lors de l'ajout de nouvelles collections ou relations.