# Méthodes disponibles sur l'objet `Article` (Sequelize) Ce document liste toutes les méthodes automatiquement générées par Sequelize pour le modèle `Article` en fonction des associations définies dans `src/database/relationships/index.js`. --- ## Associations Many-to-Many (belongsToMany) ### 1. **Tags** via `TagList` Association alias: `articleTags` Clés: `foreignKey: "articleId"`, `otherKey: "tagName"` ```javascript article.getArticleTags() // Récupère tous les tags article.setArticleTags([...]) // Définit les tags article.addArticleTag(tag) // Ajoute un tag article.addArticleTags([...]) // Ajoute plusieurs tags article.removeArticleTag(tag) // Retire un tag article.removeArticleTags([...]) // Retire plusieurs tags article.countArticleTags() // Compte les tags article.hasArticleTag(tag) // Vérifie si le tag est lié article.hasArticleTags([...]) // Vérifie si les tags sont liés // Alias généré par Sequelize (correspond à belongsToMany): // Nom de la clé étrangère singularisée + pluralisé = "ArticleTag(s)" => "addTagList", "getTagList", etc. article.addTagList(tag) // Ajoute un tag via l'alias article.addTagLists([...]) // Ajoute plusieurs tags via l'alias article.getTagLists() // Récupère les tags via l'alias article.setTagLists([...]) // Définit les tags via l'alias article.removeTagList(tag) // Retire un tag via l'alias article.removeTagLists([...]) // Retire plusieurs tags via l'alias article.countTagLists() // Compte les tags via l'alias article.hasTagList(tag) // Vérifie si le tag est lié via l'alias article.hasTagLists([...]) // Vérifie si les tags sont liés via l'alias ``` ### 2. **Users (Favoris)** via `Favorite` Association alias: `articleFavoriteUsers` Clés: `foreignKey: "articleId"`, `otherKey: "userId"` ```javascript article.getArticleFavoriteUsers() // Récupère les utilisateurs qui ont favorisé article.setArticleFavoriteUsers([...]) // Définit les utilisateurs article.addUserIdUser(user) // Ajoute un utilisateur article.addArticleFavoriteUsers([...]) // Ajoute plusieurs utilisateurs article.removeUserIdUser(user) // Retire un utilisateur article.removeArticleFavoriteUsers([...]) // Retire plusieurs utilisateurs article.countArticleFavoriteUsers() // Compte les utilisateurs article.hasUserIdUser(user) // Vérifie si l'utilisateur a favorisé article.hasArticleFavoriteUsers([...]) // Vérifie si les utilisateurs ont favorisé ``` --- ## Associations One-to-Many (hasMany) ### 3. **Comments** Association alias: `comments` Clé étrangère: `articleId` ```javascript article.getComments() // Récupère tous les commentaires article.setComments([...]) // Définit les commentaires article.addComment(comment) // Crée/ajoute un commentaire article.addComments([...]) // Ajoute plusieurs commentaires article.removeComment(comment) // Retire un commentaire article.removeComments([...]) // Retire plusieurs commentaires article.countComments() // Compte les commentaires article.hasComment(comment) // Vérifie si le commentaire existe article.hasComments([...]) // Vérifie si les commentaires existent article.createComment({...}) // Crée un nouveau commentaire ``` ### 4. **Favorites** (enregistrements de join) Association alias: `favorites` Clé étrangère: `articleId` ```javascript article.getFavorites() // Récupère les enregistrements Favorite article.setFavorites([...]) // Définit les favoris article.addFavorite(favorite) // Ajoute un enregistrement Favorite article.addFavorites([...]) // Ajoute plusieurs enregistrements article.removeFavorite(favorite) // Retire un enregistrement Favorite article.removeFavorites([...]) // Retire plusieurs enregistrements article.countFavorites() // Compte les enregistrements Favorite article.hasFavorite(favorite) // Vérifie si le Favorite existe article.hasFavorites([...]) // Vérifie si les Favorites existent article.createFavorite({...}) // Crée un nouveau Favorite ``` ### 5. **TagLists** (enregistrements de join) Association alias: `tagLists` Clé étrangère: `articleId` ```javascript article.getTagLists() // Récupère les enregistrements TagList article.setTagLists([...]) // Définit les TagList article.addTagList(tagList) // Ajoute un enregistrement TagList article.addTagLists([...]) // Ajoute plusieurs enregistrements article.removeTagList(tagList) // Retire un enregistrement TagList article.removeTagLists([...]) // Retire plusieurs enregistrements article.countTagLists() // Compte les enregistrements TagList article.hasTagList(tagList) // Vérifie si le TagList existe article.hasTagLists([...]) // Vérifie si les TagLists existent article.createTagList({...}) // Crée un nouveau TagList ``` --- ## Associations Belongs-To (hasOne inverse) ### 6. **Author (User)** Association alias: `author` Clé étrangère: `authorId` ```javascript article.getAuthor() // Récupère l'auteur article.setAuthor(user) // Définit l'auteur article.createAuthor({...}) // Crée un nouvel auteur ``` --- ## Méthodes personnalisées du modèle ### Méthodes d'instance définies dans `Article.js` : ```javascript article.toJSONFor() // Retourne un objet JSON formaté // Format: { id, slug, title, description, body } ``` --- ## Hooks (Triggers) ```javascript Article.beforeValidate() // Déclenché avant la validation // Génère automatiquement un slug basé sur le titre // Format: slug(`${article.title}`) + '-' + random ``` --- ## Exemples d'utilisation concrets ### Ajouter des tags à un article ```javascript const article = await Article.findByPk(1); const tag = await Tag.findByPk('javascript'); await article.addTagList(tag); // Via alias // ou await article.addArticleTag(tag); // Via alias généré automatiquement ``` ### Récupérer les commentaires d'un article ```javascript const article = await Article.findByPk(1); const comments = await article.getComments(); ``` ### Obtenir les utilisateurs qui ont favorisé cet article ```javascript const article = await Article.findByPk(1); const fans = await article.getArticleFavoriteUsers(); ``` ### Créer un commentaire pour un article ```javascript const article = await Article.findByPk(1); const comment = await article.createComment({ body: "Great article!", authorId: userId }); ``` ### Compter les tags ```javascript const article = await Article.findByPk(1); const tagCount = await article.countTagLists(); ``` --- ## Notes importantes 1. **Noms des méthodes générées** : Sequelize génère les noms en fonction du nom de l'association (alias) ou du modèle. - Si alias est `articleTags` → `getArticleTags()`, `addArticleTag()`, etc. - Si alias est `tagLists` → `getTagLists()`, `addTagList()`, etc. 2. **Singulier/Pluriel** : Les méthodes `add*` acceptent soit un seul élément (singulier) soit un tableau (pluriel). 3. **Paramètres optionnels** : La plupart des méthodes `get*` acceptent un paramètre `options` pour personnaliser la requête : ```javascript article.getComments({ where: { createdAt: { [Op.gte]: someDate } }, limit: 10, offset: 0, order: [['createdAt', 'DESC']] }); ``` 4. **Transactions** : Toutes les opérations CRUD peuvent être encapsulées dans une transaction : ```javascript const transaction = await sequelize.transaction(); await article.addTagList(tag, { transaction }); await transaction.commit(); ``` 5. **Alias vs Nom généré** : L'alias défini dans la relation détermine le nom des méthodes générées. Dans ce projet, les alias comme `articleTags`, `tagLists` permettent d'appeler `getTagLists()`, `addTagList()`, etc.