From b4f2ccd8feb3db6454ac50eca005d408e7a09d37 Mon Sep 17 00:00:00 2001 From: "D. Scott Boggs" Date: Thu, 6 Jun 2024 08:30:46 -0400 Subject: [PATCH] Add article and association with user --- migrations/20240606121847-create-article.js | 50 +++++++++++++++++++++ models/article.js | 33 ++++++++++++++ models/user.js | 19 +++++--- 3 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 migrations/20240606121847-create-article.js create mode 100644 models/article.js diff --git a/migrations/20240606121847-create-article.js b/migrations/20240606121847-create-article.js new file mode 100644 index 0000000..dbe0035 --- /dev/null +++ b/migrations/20240606121847-create-article.js @@ -0,0 +1,50 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('articles', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + title: { + type: Sequelize.STRING, + allowNull: false, + }, + content: { + type: Sequelize.STRING + }, + submittedBy: { + type: Sequelize.INTEGER, + references: { + model: 'user', + key: 'id', + onDelete: 'SET NULL', + onUpdate: 'CASCADE' + } + }, + reviewedBy: { + type: Sequelize.INTEGER, + references: { + model: 'user', + key: 'id', + onDelete: 'SET NULL', + onUpdate: 'CASCADE' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('articles'); + } +}; diff --git a/models/article.js b/models/article.js new file mode 100644 index 0000000..4ea21e9 --- /dev/null +++ b/models/article.js @@ -0,0 +1,33 @@ +'use strict'; +const { + Model +} = require('sequelize'); + +module.exports = (sequelize, DataTypes) => { + class article extends Model { + static associate(models) { + Article.belongsTo(models.User, { + foreignKey: 'submitted_by', + onDelete: 'SET NULL', + onUpdate: 'CASCADE', + as: 'submitter', + }) + Article.belongsTo(models.User, { + as: 'reviewer', + foreignKey: 'reviewed_by', + onDelete: 'SET NULL', + onUpdate: 'CASCADE', + }) + } + } + article.init({ + title: DataTypes.STRING, + content: DataTypes.STRING, + submittedBy: DataTypes.STRING, + reviewedBy: DataTypes.STRING + }, { + sequelize, + modelName: 'article', + }); + return article; +}; diff --git a/models/user.js b/models/user.js index 803ae19..a4851d6 100644 --- a/models/user.js +++ b/models/user.js @@ -4,13 +4,18 @@ const { } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class user extends Model { - /** - * Helper method for defining associations. - * This method is not a part of Sequelize lifecycle. - * The `models/index` file will call this method automatically. - */ static associate(models) { - // define association here + User.hasMany(models.Article, { + foreignKey: 'submitted_by', + onDelete: 'SET NULL', + onUpdate: 'CASCADE', + }) + User.hasMany(models.Article, { + foreignKey: 'reviewed_by', + as: 'reviewedArticles', + onDelete: 'SET NULL', + onUpdate: 'CASCADE', + }) } } user.init({ @@ -20,4 +25,4 @@ module.exports = (sequelize, DataTypes) => { modelName: 'user', }); return user; -}; \ No newline at end of file +};