From 82fe2c4940343ceeea014321c254350f0e2873cb Mon Sep 17 00:00:00 2001 From: Rykkel <220993G@mymail.nyp.edu.sg> Date: Sun, 11 Aug 2024 19:32:05 +0800 Subject: [PATCH] Created Tag, PostTag model & associations --- server/models/Post.js | 14 +++++++++++--- server/models/PostTag.js | 30 ++++++++++++++++++++++++++++++ server/models/Tag.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 server/models/PostTag.js create mode 100644 server/models/Tag.js diff --git a/server/models/Post.js b/server/models/Post.js index ee79dc6..1a9e7f1 100644 --- a/server/models/Post.js +++ b/server/models/Post.js @@ -21,11 +21,19 @@ module.exports = (sequelize, DataTypes) => { userId: { type: DataTypes.UUID, allowNull: false, - }, + }, }, { tableName: 'posts', timestamps: true, }); - + + Post.associate = (models) => { + Post.belongsToMany(models.Tag, { + through: models.PostTag, + foreignKey: 'postId', + otherKey: 'tagId', + }); + }; + return Post; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/server/models/PostTag.js b/server/models/PostTag.js new file mode 100644 index 0000000..bc84058 --- /dev/null +++ b/server/models/PostTag.js @@ -0,0 +1,30 @@ +// handle the relationship between Post and Tag +// Purely join table + +module.exports = (sequelize, DataTypes) => { + const PostTag = sequelize.define("PostTag", { + postId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: 'posts', // refers to table name + key: 'id' + }, + onDelete: 'CASCADE', + }, + tagId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: 'tags', // refers to table name + key: 'id' + }, + onDelete: 'CASCADE', + }, + }, { + tableName: 'post_tags', + timestamps: false, + }); + + return PostTag; +}; \ No newline at end of file diff --git a/server/models/Tag.js b/server/models/Tag.js new file mode 100644 index 0000000..31bf177 --- /dev/null +++ b/server/models/Tag.js @@ -0,0 +1,28 @@ +module.exports = (sequelize, DataTypes) => { + const Tag = sequelize.define("Tag", { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + allowNull: false, + primaryKey: true, + }, + tag: { + type: DataTypes.STRING(30), + allowNull: false, + unique: true, // Ensure tags are unique + }, + }, { + tableName: 'tags', + timestamps: false, + }); + + Tag.associate = (models) => { + Tag.belongsToMany(models.Post, { + through: models.PostTag, + foreignKey: 'tagId', + otherKey: 'postId', + }); + }; + + return Tag; +}; \ No newline at end of file