Relations - StevenYAMBOS/Smash-Here-API GitHub Wiki

Documentation des relations entre les éléments de la base de données

Vue d'ensemble

Cette documentation détaille les relations entre les collections MongoDB et les opérations en cascade pour maintenir la cohérence des données.

Schéma des Relations

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"
Loading

Relations par collection

Collection user

  • Créateur/Modificateur : roadmap, step, content, guide, game, comment, tag, attachment
  • Participant : progression, comment.User
  • Bookmarks : roadmap (many-to-many)

Collection roadmap

  • 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)

Collection guide

  • 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)

Opérations en cascade


📓Gestion des commentaires

Création d'un commentaire

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

Suppression d'un commentaire

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`

Création d'une réponse à un commentaire

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

Suppression d'une réponse à un commentaire

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`

📓Gestion des utilisateurs

Suppression d'un compte utilisateur

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`

📓Gestion des jeux

Création d'un jeu

Collection modifiée : game
Relations en cascade : ❌

Collection Action Cascade
game Créer document
1. Créer document dans collection `game`
// Aucune relation automatique

Modification d'un jeu

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

Suppression d'un jeu

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`

📓Gestion des contenus

Création d'un contenu

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[]

Modification d'un contenu

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

Suppression d'un contenu

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`

📓Gestion des étapes

Création d'une étape

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)

Modification d'une étape

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

Suppression d'une étape

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`

📓Gestion des roadmaps

Création d'une roadmap

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é)

Modification d'une roadmap

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

Suppression d'une roadmap

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`

📓Gestion des guides

Création d'un guide

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)

Modification d'un guide

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

Suppression d'un guide

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`

📓Gestion des pièces jointes

Création d'une pièce jointe

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)

Modification d'un guide

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

Suppression d'une pièce jointe

Collection modifiée : attachment
Relations en cascade : ✅

Collection Action Cascade
user Retirer de AttachmentsCreated[]
game Retirer de Attachments[]
attachment Supprimer document

Règles de cohérence

Contraintes d'intégrité

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

Gestion des erreurs

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

Optimisations

  • 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.

⚠️ **GitHub.com Fallback** ⚠️