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