From 12de45f3962a2f2c3657ec34065b040b6966a6cb Mon Sep 17 00:00:00 2001 From: tpgus2603 <kakaneymar2424@gmail.com> Date: Wed, 27 Nov 2024 01:36:48 +0900 Subject: [PATCH] =?UTF-8?q?bugfix:=20chatroom=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=ED=95=B4=EA=B2=B0(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/chatRooms.js | 23 -------------- models/index.js | 8 +---- package-lock.json | 12 ++++---- routes/schedule.js | 6 ++-- schemas/ChatRooms.js | 44 ++++++++++++--------------- services/chatService.js | 62 +++++++++++++++++++------------------- services/meetingService.js | 12 +------- services/memberService.js | 2 +- 8 files changed, 63 insertions(+), 106 deletions(-) delete mode 100644 models/chatRooms.js diff --git a/models/chatRooms.js b/models/chatRooms.js deleted file mode 100644 index 6c50957..0000000 --- a/models/chatRooms.js +++ /dev/null @@ -1,23 +0,0 @@ -const mongoose = require('mongoose'); - -// MongoDB 梨꾪똿諛� �ㅽ궎留� �섏젙 (FCM �좏겙�� 諛곗뿴濡� 愿�由�) -const chatRoomsSchema = new mongoose.Schema({ - chatRoomId: { type: String, required: true, unique: true }, - chatRoomName: { type: String, required: true }, - messages: [{ - sender: String, - message: String, - timestamp: Date, - type: { type: String, default: 'message' }, // 湲곕낯媛믪� 'message', �ㅻⅨ 媛믪쑝濡� 'join', 'leave' 媛��� - }], - participants: [{ - name: { type: String, required: true }, - fcmTokens: { type: [String], default: [] }, // FCM �좏겙 諛곗뿴 - }], - lastReadAt: { type: Map, of: Date }, - lastReadLogId: { type: Map, of: String }, - isOnline: { type: Map, of: Boolean }, -}, { collection: 'chatrooms' }); - -const ChatRoom = mongoose.model('ChatRooms', chatRoomsSchema); -module.exports = ChatRoom; \ No newline at end of file diff --git a/models/index.js b/models/index.js index 94c499b..70650a3 100644 --- a/models/index.js +++ b/models/index.js @@ -7,7 +7,7 @@ const Meeting = require('./Meeting'); const Friend = require('./Friend'); const FcmToken = require('./fcmToken'); const MeetingParticipant = require('./MeetingParticipant'); -const ChatRooms = require('./ChatRooms'); +// const ChatRooms = require('./ChatRooms'); // 愿�怨� �ㅼ젙 Friend.belongsTo(User, { foreignKey: 'requester_id', as: 'requester' }); // 移쒓뎄 �붿껌�� 蹂대궦 �ъ슜�� @@ -35,12 +35,6 @@ module.exports = { Schedule, Meeting, MeetingParticipant, - ChatRooms, - sequelize, - User, - Schedule, - Meeting, - MeetingParticipant, Friend, FcmToken, }; diff --git a/package-lock.json b/package-lock.json index 0d88e6d..5897dcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11447,7 +11447,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -11986,6 +11986,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dev": true, "license": "Apache-2.0", "optional": true, "peer": true, @@ -12001,6 +12002,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dev": true, "license": "Apache-2.0", "optional": true, "peer": true, @@ -13270,7 +13272,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17498,7 +17499,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -20299,7 +20300,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/stubs": { @@ -21140,7 +21141,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, "license": "0BSD" }, "node_modules/tsutils": { @@ -22140,7 +22140,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/routes/schedule.js b/routes/schedule.js index 35da45e..59f36a5 100644 --- a/routes/schedule.js +++ b/routes/schedule.js @@ -20,7 +20,7 @@ router.get('/all', ScheduleController.getAllSchedules); * 媛쒕퀎 �ㅼ�以� 議고쉶 * Get /api/schedule/:id */ -router.get('/:id', ScheduleController.getScheduleById); +router.get('/:id', ScheduleController.getScheduleByTimeIdx); /** * �ㅼ�以� �앹꽦 @@ -32,13 +32,13 @@ router.post('/', ScheduleController.createSchedule); * �ㅼ�以� �섏젙 * PUT /api/schedule/:id */ -router.put('/:id', ScheduleController.updateSchedule); +router.put('/:id', ScheduleController.updateSchedules); /** * �ㅼ�以� ��젣 * DELETE /api/schedule/:id */ -router.delete('/:id', ScheduleController.deleteSchedule); +router.delete('/:id', ScheduleController.deleteSchedules); module.exports = router; \ No newline at end of file diff --git a/schemas/ChatRooms.js b/schemas/ChatRooms.js index f4a963e..b86c58e 100644 --- a/schemas/ChatRooms.js +++ b/schemas/ChatRooms.js @@ -1,27 +1,23 @@ -// schemas/ChatRoom.js - const mongoose = require('mongoose'); -const ChatRoomSchema = new mongoose.Schema({ - name: { - type: String, - required: true, - }, - meeting_id: { - type: Number, // SQL�� Meetings �뚯씠釉� ID 李몄“ - default: null, - }, - type: { - type: String, - enum: ['OPEN', 'CLOSE'], - required: true, - }, - created_by: { - type: Number, // SQL�� Users �뚯씠釉� ID 李몄“ - required: true, - }, -}, { - timestamps: true, // createdAt, updatedAt �먮룞 愿�由� -}); +// MongoDB 梨꾪똿諛� �ㅽ궎留� �섏젙 (FCM �좏겙�� 諛곗뿴濡� 愿�由�) +const chatRoomsSchema = new mongoose.Schema({ + chatRoomId: { type: String, required: true, unique: true }, + chatRoomName: { type: String, required: true }, + messages: [{ + sender: String, + message: String, + timestamp: Date, + type: { type: String, default: 'message' }, // 湲곕낯媛믪� 'message', �ㅻⅨ 媛믪쑝濡� 'join', 'leave' 媛��� + }], + participants: [{ + name: { type: String, required: true }, + fcmTokens: { type: [String], default: [] }, // FCM �좏겙 諛곗뿴 + }], + lastReadAt: { type: Map, of: Date }, + lastReadLogId: { type: Map, of: String }, + isOnline: { type: Map, of: Boolean }, +}, { collection: 'chatrooms' }); -module.exports = mongoose.model('ChatRoom', ChatRoomSchema); +const ChatRooms = mongoose.model('ChatRooms', chatRoomsSchema); +module.exports = ChatRooms; \ No newline at end of file diff --git a/services/chatService.js b/services/chatService.js index e53ceaa..8a47e9b 100644 --- a/services/chatService.js +++ b/services/chatService.js @@ -1,4 +1,4 @@ -const ChatRoom = require('../models/ChatRooms'); +const ChatRooms = require('../schemas/ChatRooms'); const { v4: uuidv4 } = require('uuid'); class ChatService { @@ -6,7 +6,7 @@ class ChatService { async createChatRoom({ meeting_id, participants, chatRoomName }) { try { const chatRoomId = uuidv4(); - const newRoom = new ChatRoom({ + const newRoom = new ChatRooms({ chatRoomId, chatRoomName, meeting_id, @@ -31,7 +31,7 @@ class ChatService { // 梨꾪똿諛� 紐⑸줉 議고쉶 async getChatRooms() { - const rooms = await ChatRoom.find({}, { chatRoomId: 1, chatRoomName: 1, messages: { $slice: -1 } }); + const rooms = await ChatRooms.find({}, { chatRoomId: 1, chatRoomName: 1, messages: { $slice: -1 } }); return rooms.map(room => { const lastMessage = room.messages[0] || {}; return { @@ -48,7 +48,7 @@ class ChatService { // �ъ슜�� �곹깭 �낅뜲�댄듃 async updateStatus(chatRoomId, nickname, isOnline) { - await ChatRoom.updateOne( + await ChatRooms.updateOne( { chatRoomId, "participants.name": nickname }, { $set: { [`isOnline.${nickname}`]: isOnline } } ); @@ -57,7 +57,7 @@ class ChatService { // �쎌쓬 �곹깭 �낅뜲�댄듃 async updateReadStatus(chatRoomId, nickname) { const now = new Date(); - await ChatRoom.updateOne( + await ChatRooms.updateOne( { chatRoomId, "participants.name": nickname }, { $set: { [`lastReadAt.${nickname}`]: now } } ); @@ -65,14 +65,14 @@ class ChatService { // �쎌� �딆� 硫붿떆吏� 議고쉶 async getUnreadMessages(nickname) { - const chatRooms = await ChatRoom.find({ "participants.name": nickname }); - return await Promise.all(chatRooms.map(async (chatRoom) => { - const lastReadAt = chatRoom.lastReadAt.get(nickname) || new Date(0); - const unreadMessagesCount = chatRoom.messages.filter(message => + const chatRooms = await ChatRooms.find({ "participants.name": nickname }); + return await Promise.all(chatRooms.map(async (chatRooms) => { + const lastReadAt = chatRooms.lastReadAt.get(nickname) || new Date(0); + const unreadMessagesCount = chatRooms.messages.filter(message => message.timestamp > lastReadAt ).length; return { - chatRoomId: chatRoom.chatRoomId, + chatRoomId: chatRooms.chatRoomId, unreadCount: unreadMessagesCount, }; })); @@ -80,14 +80,14 @@ class ChatService { // �쎌� �딆� 硫붿떆吏� �� 議고쉶 async getUnreadCount(chatRoomId) { - const chatRoom = await ChatRoom.findOne({ chatRoomId }); - if (!chatRoom) { + const chatRooms = await ChatRooms.findOne({ chatRoomId }); + if (!chatRooms) { throw new Error('Chat room not found'); } - const unreadCounts = chatRoom.participants - .filter(participant => chatRoom.lastReadLogId.has(participant.name)) // Map�� 議댁옱�섎뒗 �ㅻ쭔 泥섎━ - .map(participant => chatRoom.lastReadLogId.get(participant.name)) // lastReadLogId 媛� 異붿텧 + const unreadCounts = chatRooms.participants + .filter(participant => chatRooms.lastReadLogId.has(participant.name)) // Map�� 議댁옱�섎뒗 �ㅻ쭔 泥섎━ + .map(participant => chatRooms.lastReadLogId.get(participant.name)) // lastReadLogId 媛� 異붿텧 .reduce((acc, logId) => { acc[logId] = (acc[logId] || 0) + 1; // logId 湲곗��쇰줈 �깆옣 �잛닔 �꾩쟻 return acc; @@ -107,7 +107,7 @@ class ChatService { // �쎌� 硫붿떆吏� 濡쒓렇 ID �낅뜲�댄듃 async updateReadLogId(chatRoomId, nickname, logId) { - await ChatRoom.updateOne( + await ChatRooms.updateOne( { chatRoomId, "participants.name": nickname }, { $set: { [`lastReadLogId.${nickname}`]: logId } } ); @@ -115,16 +115,16 @@ class ChatService { // FCM �좏겙 �낅뜲�댄듃 async updateFcmToken(chatRoomId, nickname, fcmToken) { - const chatRoom = await ChatRoom.findOne({ chatRoomId, "participants.name": nickname }); - if (!chatRoom) { + const chatRooms = await ChatRooms.findOne({ chatRoomId, "participants.name": nickname }); + if (!chatRooms) { throw new Error('Chat room or participant not found'); } - const participant = chatRoom.participants.find(p => p.name === nickname); + const participant = chatRooms.participants.find(p => p.name === nickname); if (participant) { if (!participant.fcmTokens.includes(fcmToken)) { participant.fcmTokens.push(fcmToken); - await chatRoom.save(); + await chatRooms.save(); } } } @@ -134,13 +134,13 @@ class ChatService { let finalLogId = logId; if (!isOnline && logId === null) { - const chatRoom = await ChatRoom.findOne({ chatRoomId }); - if (chatRoom && chatRoom.messages.length > 0) { - finalLogId = chatRoom.messages[chatRoom.messages.length - 1]._id; + const chatRooms = await ChatRooms.findOne({ chatRoomId }); + if (chatRooms && chatRooms.messages.length > 0) { + finalLogId = chatRooms.messages[chatRooms.messages.length - 1]._id; } } - await ChatRoom.updateOne( + await ChatRooms.updateOne( { chatRoomId, "participants.name": nickname }, { $set: { @@ -155,8 +155,8 @@ class ChatService { async sendMessage(chatRoomId, sender, messageContent) { try { // 梨꾪똿諛� 議고쉶 - const chatRoom = await ChatRoom.findOne({ chatRoomId }); - if (!chatRoom) { + const chatRooms = await ChatRooms.findOne({ chatRoomId }); + if (!chatRooms) { throw new Error('Chat room not found'); } @@ -167,12 +167,12 @@ class ChatService { timestamp: new Date(), type: 'message', }; - chatRoom.messages.push(newMessage); - await chatRoom.save(); + chatRooms.messages.push(newMessage); + await chatRooms.save(); // �ㅽ봽�쇱씤 �ъ슜�� 李얘린 - const offlineParticipants = chatRoom.participants.filter( - participant => !chatRoom.isOnline[participant.name] + const offlineParticipants = chatRooms.participants.filter( + participant => !chatRooms.isOnline[participant.name] ); // �ㅽ봽�쇱씤 �ъ슜�먮뱾�먭쾶 FCM �몄떆 �뚮┝ �꾩넚 @@ -181,7 +181,7 @@ class ChatService { if (tokens.length > 0) { const message = { notification: { - title: `�� 硫붿떆吏�: ${chatRoom.chatRoomName}`, + title: `�� 硫붿떆吏�: ${chatRooms.chatRoomName}`, body: `${sender}: ${messageContent}`, }, tokens, diff --git a/services/meetingService.js b/services/meetingService.js index f3d5e92..573d41e 100644 --- a/services/meetingService.js +++ b/services/meetingService.js @@ -7,7 +7,7 @@ const { v4: uuidv4 } = require('uuid'); const { Op } = require('sequelize'); const sequelize = require('../config/sequelize'); // �몃옖��뀡 愿�由щ� �꾪빐 sequelize �몄뒪�댁뒪 �꾩슂 const { Meeting, MeetingParticipant, User, Schedule, Invite, Friend } = require('../models'); -const ChatRooms = require('../models/ChatRooms'); +const ChatRooms = require('../schemas/ChatRooms'); const MeetingResponseDTO = require('../dtos/MeetingResponseDTO'); const MeetingDetailResponseDTO = require('../dtos/MeetingDetailResponseDTO'); const CreateMeetingRequestDTO = require('../dtos/CreateMeetingRequestDTO'); @@ -51,16 +51,6 @@ class MeetingService { const user = await this._findUserWithFcmTokens(created_by); const userFcmTokens = user.fcmTokenList.map((fcmToken) => fcmToken.token); - // �ㅼ�以� 異⑸룎 �뺤씤 - // const hasConflict = await ScheduleService.checkScheduleOverlap( - // created_by, - // new Date(start_time), - // new Date(end_time) - // ); - - // if (hasConflict) { - // throw new Error('�ㅼ�以꾩씠 寃뱀묩�덈떎. �ㅻⅨ �쒓컙�� �좏깮�댁<�몄슂.'); - // } const hasConflict = await ScheduleService.checkScheduleOverlapByTime( created_by, diff --git a/services/memberService.js b/services/memberService.js index bf99182..fceb6b0 100644 --- a/services/memberService.js +++ b/services/memberService.js @@ -1,6 +1,6 @@ const User = require('../models/User'); const FcmToken = require('../models/fcmToken'); -const ChatRoom = require('../models/chatRooms'); +const ChatRooms = require('../schemas/ChatRooms'); class MemberService { async registerToken(email, fcmToken) { -- GitLab