From c5eb5ebaac16d6ba9fc67374bef29bb94bc84199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9E=AC=EC=97=BD?= <jysim0326@ajou.ac.kr> Date: Tue, 19 Nov 2024 18:22:28 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=EB=A7=A4=ED=95=91=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/chatRooms.js | 21 +++++++++++++++++++++ models/meeting.js | 35 +++++++++++++++++++++++++++++++---- models/meetingParticipant.js | 29 +++++++++++++++++++++-------- models/user.js | 20 +++++++++++++++++++- 4 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 models/chatRooms.js diff --git a/models/chatRooms.js b/models/chatRooms.js new file mode 100644 index 0000000..ca68c39 --- /dev/null +++ b/models/chatRooms.js @@ -0,0 +1,21 @@ +const mongoose = require('mongoose'); + +// MongoDB 채팅방 스키마 수정 (현재 참가 중인 유저 목록 추가) +const chatRoomsSchema = new mongoose.Schema({ + chatRoomId: { type: String, required: true, unique: true }, + messages: [{ + sender: String, + message: String, + timestamp: Date, + type: { type: String, default: 'message' } // 기본값은 'message', 다른 값으로 'join', 'leave' 가능 + }], + participants: [{ type: String }], + lastReadAt: { type: Map, of: Date }, // 각 참가자의 마지막 읽은 메시지 시간 기록 + lastReadLogId: { type: Map, of: String }, // 각 참가자의 마지막으로 읽은 logID 기록 + isOnline: { type: Map, of: Boolean } // 각 참가자의 온라인 상태 +}, { collection: 'chatrooms' }); + +// 모델이 이미 정의되어 있는 경우 재정의하지 않음 +const ChatRooms = mongoose.models.ChatRooms || mongoose.model('ChatRooms', chatRoomsSchema); + +module.exports = ChatRooms; \ No newline at end of file diff --git a/models/meeting.js b/models/meeting.js index 7944e35..14c50b5 100644 --- a/models/meeting.js +++ b/models/meeting.js @@ -1,10 +1,15 @@ // models/Meeting.js const { DataTypes } = require('sequelize'); -const sequelize = require('../config/sequelize'); +const { sequelize } = require('../config/sequelize'); const User = require('./User'); const Meeting = sequelize.define('Meeting', { + id: { + type: DataTypes.BIGINT, + primaryKey: true, + autoIncrement: true, + }, title: { type: DataTypes.STRING, allowNull: false, @@ -30,12 +35,34 @@ const Meeting = sequelize.define('Meeting', { type: DataTypes.ENUM('OPEN', 'CLOSE'), allowNull: false, }, + created_by: { + type: DataTypes.BIGINT, + allowNull: false, + references: { + model: 'Users', + key: 'id', + }, + }, + chatRoomId: { // 새로운 필드 추가 + type: DataTypes.STRING, + allowNull: false, + }, }, { tableName: 'Meetings', timestamps: false, }); -Meeting.belongsTo(User, { foreignKey: 'created_by', as: 'creator' }); -User.hasMany(Meeting, { foreignKey: 'created_by', as: 'meetings' }); -module.exports = Meeting; +// 연관 관계 설정 +Meeting.associate = (models) => { + Meeting.belongsTo(models.User, { + foreignKey: 'created_by', // FK 설정 + as: 'creator', // 별칭 + }); + Meeting.hasMany(models.MeetingParticipant, { + foreignKey: 'meeting_id', + as: 'participants', + }); +}; + +module.exports = Meeting; \ No newline at end of file diff --git a/models/meetingParticipant.js b/models/meetingParticipant.js index 716a442..15c93c1 100644 --- a/models/meetingParticipant.js +++ b/models/meetingParticipant.js @@ -1,19 +1,32 @@ // models/MeetingParticipant.js const { DataTypes } = require('sequelize'); -const sequelize = require('../config/sequelize'); -const Meeting = require('./Meeting'); -const User = require('./User'); +const { sequelize } = require('../config/sequelize'); -const MeetingParticipant = sequelize.define('MeetingParticipant', {}, { +const MeetingParticipant = sequelize.define('MeetingParticipant', { + meeting_id: { + type: DataTypes.BIGINT, + allowNull: false + }, + user_id: { + type: DataTypes.BIGINT, + allowNull: false + } +}, { tableName: 'MeetingParticipants', timestamps: false, }); -MeetingParticipant.belongsTo(Meeting, { foreignKey: 'meeting_id', as: 'meeting' }); -Meeting.hasMany(MeetingParticipant, { foreignKey: 'meeting_id', as: 'participants' }); +MeetingParticipant.associate = (models) => { + MeetingParticipant.belongsTo(models.Meeting, { + foreignKey: 'meeting_id', + as: 'meeting' + }); -MeetingParticipant.belongsTo(User, { foreignKey: 'user_id', as: 'user' }); -User.hasMany(MeetingParticipant, { foreignKey: 'user_id', as: 'meetingParticipations' }); + MeetingParticipant.belongsTo(models.User, { + foreignKey: 'user_id', + as: 'participantUser' + }); +}; module.exports = MeetingParticipant; diff --git a/models/user.js b/models/user.js index fbf92c1..cb14b0b 100644 --- a/models/user.js +++ b/models/user.js @@ -1,9 +1,14 @@ // models/User.js const { DataTypes } = require('sequelize'); -const sequelize = require('../config/sequelize'); // sequelize 인스턴스 경로에 맞게 수정하세요. +const { sequelize } = require('../config/sequelize'); const User = sequelize.define('User', { + id: { + type: DataTypes.BIGINT, // 수정: id 필드를 BIGINT로 설정 + autoIncrement: true, + primaryKey: true, + }, name: { type: DataTypes.STRING, // VARCHAR allowNull: false, @@ -21,4 +26,17 @@ const User = sequelize.define('User', { timestamps: true, // createdAt과 updatedAt 자동 관리 }); +User.associate = (models) => { + User.hasMany(models.Meeting, { + foreignKey: 'created_by', + as: 'createdMeetings', + }); + + User.hasMany(models.MeetingParticipant, { + foreignKey: 'user_id', + as: 'userMeetingParticipations', + }); +}; + + module.exports = User; -- GitLab