From d77856f659846525b9dee8513d6df8d03a4d9bf4 Mon Sep 17 00:00:00 2001 From: chlehdwon Date: Mon, 29 May 2023 15:48:02 +0000 Subject: [PATCH 01/19] Add: updateChatHandler --- src/routes/chats.js | 12 ++++++++++++ src/services/chats.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/routes/chats.js b/src/routes/chats.js index 812755f6..56febcfd 100644 --- a/src/routes/chats.js +++ b/src/routes/chats.js @@ -54,6 +54,18 @@ router.post( chatsHandlers.sendChatHandler ); +/** + * 채팅 정보를 업데이트 한 후, + * 같은 방에 있는 user들에게 업데이트를 요청합니다. + */ +router.post( + "/update", + body("roomId").isMongoId(), + body("lastMsgDate").isISO8601(), + validator, + chatsHandlers.updateChatHandler +); + // 채팅 이미지를 업로드할 수 있는 Presigned-url을 발급합니다. router.post( "/uploadChatImg/getPUrl", diff --git a/src/services/chats.js b/src/services/chats.js index 22e765b1..437470ed 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -165,6 +165,33 @@ const sendChatHandler = async (req, res) => { } }; +const updateChatHandler = async (req, res) => { + try { + const io = req.app.get("io"); + const { userId } = req; + const { roomId, lastMsgDate } = req.body; + const user = await userModel.findOne({ id: userId }); + + if (!userId || !user) { + return res.status(500).send("Chat/update : internal server error"); + } + if (!io) { + return res.status(403).send("Chat/update : socket did not connected"); + } + + const isPart = await isUserInRoom(userId, roomId); + if (!isPart) { + return res + .status(403) + .send("Chat/send : user did not participated in the room"); + } + + /* TODO */ + } catch (e) { + res.status(500).send("Chat/update : internal server error"); + } +}; + const uploadChatImgGetPUrlHandler = async (req, res) => { try { const { type, roomId } = req.body; @@ -277,4 +304,5 @@ module.exports = { sendChatHandler, uploadChatImgGetPUrlHandler, uploadChatImgDoneHandler, + updateChatHandler, }; From 5c40faa456ecdb83502ffcfe40e594a0a6796e07 Mon Sep 17 00:00:00 2001 From: chlehdwon Date: Tue, 30 May 2023 14:28:37 +0000 Subject: [PATCH 02/19] Add: emitUpdateEvent --- src/modules/socket.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/modules/socket.js b/src/modules/socket.js index c16e7856..1cf3ef7a 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -177,6 +177,35 @@ const emitChatEvent = async (io, chat) => { } }; +const emitUpdateEvent = async (io, roomId, userId) => { + try { + // 방의 모든 사용자에게 socket 메세지 업데이트 이벤트를 발생시킵니다. + if (!io || !roomId || !userId) { + throw new IllegalArgumentsException(); + } + + const { name, part } = await roomModel.findById(roomId, "name part"); + + if (!name || !part) { + throw new IllegalArgumentsException(); + } + + const userIds = part.map((participant) => participant.user); + await Promise.all( + userIds.map(async (userId) => + io.in(`user-${userId}`).emit("chat_update", { + roomId, + }) + ) + ); + + return true; + } catch (err) { + logger.error(err); + return false; + } +}; + // https://socket.io/how-to/use-with-express-session 참고 const startSocketServer = (server) => { const io = new Server(server, { @@ -237,5 +266,6 @@ const startSocketServer = (server) => { module.exports = { transformChatsForRoom, emitChatEvent, + emitUpdateEvent, startSocketServer, }; From a9c3b010da192389f8b962557f7e95c97e098b83 Mon Sep 17 00:00:00 2001 From: chlehdwon Date: Tue, 30 May 2023 15:59:16 +0000 Subject: [PATCH 03/19] Add: sendChatHandler --- src/services/chats.js | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/services/chats.js b/src/services/chats.js index 437470ed..0183730b 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -1,7 +1,15 @@ const { chatModel, userModel, roomModel } = require("../modules/stores/mongo"); const { chatPopulateOption } = require("../modules/populates/chats"); const awsS3 = require("../modules/stores/awsS3"); -const { transformChatsForRoom, emitChatEvent } = require("../modules/socket"); +const { + transformChatsForRoom, + emitChatEvent, + emitUpdateEvent, +} = require("../modules/socket"); +const { + roomPopulateOption, + formatSettlement, +} = require("../modules/populates/rooms"); const chatCount = 60; @@ -178,15 +186,40 @@ const updateChatHandler = async (req, res) => { if (!io) { return res.status(403).send("Chat/update : socket did not connected"); } - const isPart = await isUserInRoom(userId, roomId); if (!isPart) { return res .status(403) - .send("Chat/send : user did not participated in the room"); + .send("Chat/update : user did not participated in the room"); + } + + const roomObject = await roomModel + .findOneAndUpdate( + { + _id: roomId, + part: { + $elemMatch: { + user: user._id, + }, + }, + }, + { + $set: { "part.$[updater].readAt": lastMsgDate }, + }, + { + new: true, + arrayFilters: [{ "updater.user": { $eq: user._id } }], + } + ) + .lean() + .populate(roomPopulateOption); + if (!roomObject) { + return res.status(404).send("Chat/update : cannot find room info"); } - /* TODO */ + /* TODO: Return Formatting */ + if (await emitUpdateEvent(io)) res.json({ part: roomObject.part }); + else res.status(500).send("Chat/update : internal server error"); } catch (e) { res.status(500).send("Chat/update : internal server error"); } From 76844ff35c7f1f1f355a76df7d57119f64745f61 Mon Sep 17 00:00:00 2001 From: chlehdwon Date: Tue, 30 May 2023 16:00:40 +0000 Subject: [PATCH 04/19] Add: readAt in participantSchema --- src/modules/stores/mongo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index f9b49e84..9defbd25 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -34,6 +34,7 @@ const participantSchema = Schema({ enum: ["not-departed", "paid", "send-required", "sent"], default: "not-departed", }, + readAt: { type: Date, required: true, default: () => Date.now() }, }); const deviceTokenSchema = Schema({ From f81a2f94f7521f1e5c99e369de8bc8829ef158d1 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Mon, 4 Sep 2023 16:37:21 +0000 Subject: [PATCH 05/19] Refactor: apply prettier --- src/modules/socket.js | 4 ++-- src/modules/stores/mongo.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/socket.js b/src/modules/socket.js index 66233f4c..1f2990b8 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -227,7 +227,7 @@ const startSocketServer = (server) => { setHeader(key, values) { req.cookieHolder = values[0]; }, - writeHead() {}, + writeHead() { }, }; sessionMiddleware(req, fakeRes, () => { if (req.session) { @@ -264,7 +264,7 @@ const startSocketServer = (server) => { socket.join(`user-${userOid}`); }); - socket.on("disconnect", () => {}); + socket.on("disconnect", () => { }); } catch (err) { logger.error(err); } diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index 0de36090..53548965 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -118,6 +118,7 @@ const locationSchema = Schema({ latitude: { type: Number }, // 이후 required: true 로 수정 필요 longitude: { type: Number }, // 이후 required: true 로 수정 필요 }); + const chatSchema = Schema({ roomId: { type: Schema.Types.ObjectId, ref: "Room", required: true }, type: { From 52b5747e60b96f73c7d7d9f58d2f6fe0a4c3620f Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Mon, 4 Sep 2023 16:38:13 +0000 Subject: [PATCH 06/19] Add: partInfoHandler --- src/modules/populates/rooms.js | 2 +- src/routes/rooms.js | 9 +++++++++ src/services/chats.js | 3 ++- src/services/rooms.js | 25 ++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/modules/populates/rooms.js b/src/modules/populates/rooms.js index 18cbedf9..d051a1f3 100644 --- a/src/modules/populates/rooms.js +++ b/src/modules/populates/rooms.js @@ -7,7 +7,7 @@ const roomPopulateOption = [ { path: "to", select: "_id koName enName" }, { path: "part", - select: "-_id user settlementStatus", + select: "-_id user settlementStatus readAt", populate: { path: "user", select: "_id id name nickname profileImageUrl" }, }, ]; diff --git a/src/routes/rooms.js b/src/routes/rooms.js index be1c3f59..f2bdb9c0 100644 --- a/src/routes/rooms.js +++ b/src/routes/rooms.js @@ -41,6 +41,15 @@ router.get( roomHandlers.infoHandler ); +// 특정 id 방 part 정보 보기 +router.get( + "/info/part", + query("id").isMongoId(), + validator, + roomHandlers.partInfoHandler +); + + // JSON으로 받은 정보로 방을 생성한다. router.post( "/create", diff --git a/src/services/chats.js b/src/services/chats.js index 89bc34eb..4a15fe65 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -213,12 +213,13 @@ const updateChatHandler = async (req, res) => { ) .lean() .populate(roomPopulateOption); + if (!roomObject) { return res.status(404).send("Chat/update : cannot find room info"); } /* TODO: Return Formatting */ - if (await emitUpdateEvent(io)) res.json({ part: roomObject.part }); + if (await emitUpdateEvent(io, roomId, userId)) res.json({ part: roomObject.part }); else res.status(500).send("Chat/update : internal server error"); } catch (e) { res.status(500).send("Chat/update : internal server error"); diff --git a/src/services/rooms.js b/src/services/rooms.js index 0456d534..5fab1dfa 100644 --- a/src/services/rooms.js +++ b/src/services/rooms.js @@ -136,6 +136,28 @@ const infoHandler = async (req, res) => { } }; +const partInfoHandler = async (req, res) => { + try { + const user = await userModel.findOne({ id: req.userId }); + const roomObject = await roomModel + .findOne({ _id: req.query.id, "part.user": user._id }) + .lean() + .populate(roomPopulateOption); + if (roomObject) { + res.send(roomObject.part.filter((p) => p.user._id.equals(user._id))[0]); + } else { + res.status(404).json({ + error: "Rooms/info : id does not exist", + }); + } + } catch (err) { + logger.error(err); + res.status(500).json({ + error: "Rooms/info : internal server error", + }); + } +} + const joinHandler = async (req, res) => { try { const user = await userModel @@ -403,7 +425,7 @@ const searchByUserHandler = async (req, res) => { populate: roomPopulateOption, }) .lean(); - + console.log(user); // 정산완료여부 기준으로 진행중인 방과 완료된 방을 분리해서 응답을 전송합니다. const response = {}; response.ongoing = user.ongoingRoom.map((room) => @@ -642,6 +664,7 @@ const settlementHandler = async (req, res) => { module.exports = { publicInfoHandler, infoHandler, + partInfoHandler, createHandler, joinHandler, abortHandler, From b41425bbca02a9f4111933d48f5aaaa8de5766ff Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:22:06 +0000 Subject: [PATCH 07/19] Refactor: change updateChatHandler to readChatHandler --- src/routes/chats.js | 6 +++--- src/services/chats.js | 19 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/routes/chats.js b/src/routes/chats.js index 56febcfd..77fdf925 100644 --- a/src/routes/chats.js +++ b/src/routes/chats.js @@ -55,15 +55,15 @@ router.post( ); /** - * 채팅 정보를 업데이트 한 후, + * 채팅 읽은 시각 업데이트 요청을 처리합니다. * 같은 방에 있는 user들에게 업데이트를 요청합니다. */ router.post( - "/update", + "/readat", body("roomId").isMongoId(), body("lastMsgDate").isISO8601(), validator, - chatsHandlers.updateChatHandler + chatsHandlers.readChatHandler ); // 채팅 이미지를 업로드할 수 있는 Presigned-url을 발급합니다. diff --git a/src/services/chats.js b/src/services/chats.js index 4a15fe65..51d8efdd 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -173,7 +173,7 @@ const sendChatHandler = async (req, res) => { } }; -const updateChatHandler = async (req, res) => { +const readChatHandler = async (req, res) => { try { const io = req.app.get("io"); const { userId } = req; @@ -181,16 +181,16 @@ const updateChatHandler = async (req, res) => { const user = await userModel.findOne({ id: userId }); if (!userId || !user) { - return res.status(500).send("Chat/update : internal server error"); + return res.status(500).send("Chat/read : internal server error"); } if (!io) { - return res.status(403).send("Chat/update : socket did not connected"); + return res.status(403).send("Chat/read : socket did not connected"); } const isPart = await isUserInRoom(userId, roomId); if (!isPart) { return res .status(403) - .send("Chat/update : user did not participated in the room"); + .send("Chat/read : user did not participated in the room"); } const roomObject = await roomModel @@ -215,14 +215,13 @@ const updateChatHandler = async (req, res) => { .populate(roomPopulateOption); if (!roomObject) { - return res.status(404).send("Chat/update : cannot find room info"); + return res.status(404).send("Chat/read : cannot find room info"); } - /* TODO: Return Formatting */ - if (await emitUpdateEvent(io, roomId, userId)) res.json({ part: roomObject.part }); - else res.status(500).send("Chat/update : internal server error"); + if (await emitUpdateEvent(io, roomId, userId)) res.json({ result: true }); + else res.status(500).send("Chat/read : failed to emit socket events"); } catch (e) { - res.status(500).send("Chat/update : internal server error"); + res.status(500).send("Chat/read : internal server error"); } }; @@ -338,5 +337,5 @@ module.exports = { sendChatHandler, uploadChatImgGetPUrlHandler, uploadChatImgDoneHandler, - updateChatHandler, + readChatHandler, }; From 92cab6a9de317ec81da68d53ded507a85766dbe4 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:23:13 +0000 Subject: [PATCH 08/19] Remove: partInfoHandler --- src/routes/rooms.js | 9 --------- src/services/rooms.js | 25 +------------------------ 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/src/routes/rooms.js b/src/routes/rooms.js index f2bdb9c0..be1c3f59 100644 --- a/src/routes/rooms.js +++ b/src/routes/rooms.js @@ -41,15 +41,6 @@ router.get( roomHandlers.infoHandler ); -// 특정 id 방 part 정보 보기 -router.get( - "/info/part", - query("id").isMongoId(), - validator, - roomHandlers.partInfoHandler -); - - // JSON으로 받은 정보로 방을 생성한다. router.post( "/create", diff --git a/src/services/rooms.js b/src/services/rooms.js index 5fab1dfa..0456d534 100644 --- a/src/services/rooms.js +++ b/src/services/rooms.js @@ -136,28 +136,6 @@ const infoHandler = async (req, res) => { } }; -const partInfoHandler = async (req, res) => { - try { - const user = await userModel.findOne({ id: req.userId }); - const roomObject = await roomModel - .findOne({ _id: req.query.id, "part.user": user._id }) - .lean() - .populate(roomPopulateOption); - if (roomObject) { - res.send(roomObject.part.filter((p) => p.user._id.equals(user._id))[0]); - } else { - res.status(404).json({ - error: "Rooms/info : id does not exist", - }); - } - } catch (err) { - logger.error(err); - res.status(500).json({ - error: "Rooms/info : internal server error", - }); - } -} - const joinHandler = async (req, res) => { try { const user = await userModel @@ -425,7 +403,7 @@ const searchByUserHandler = async (req, res) => { populate: roomPopulateOption, }) .lean(); - console.log(user); + // 정산완료여부 기준으로 진행중인 방과 완료된 방을 분리해서 응답을 전송합니다. const response = {}; response.ongoing = user.ongoingRoom.map((room) => @@ -664,7 +642,6 @@ const settlementHandler = async (req, res) => { module.exports = { publicInfoHandler, infoHandler, - partInfoHandler, createHandler, joinHandler, abortHandler, From 3737777c2321ef113565bd25f56ce35c00b178b3 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:39:05 +0000 Subject: [PATCH 09/19] Remove: parameter userId in emitUpdateEvent --- src/modules/socket.js | 4 ++-- src/services/chats.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/socket.js b/src/modules/socket.js index 1f2990b8..b2ad4966 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -187,10 +187,10 @@ const emitChatEvent = async (io, chat) => { } }; -const emitUpdateEvent = async (io, roomId, userId) => { +const emitUpdateEvent = async (io, roomId) => { try { // 방의 모든 사용자에게 socket 메세지 업데이트 이벤트를 발생시킵니다. - if (!io || !roomId || !userId) { + if (!io || !roomId) { throw new IllegalArgumentsException(); } diff --git a/src/services/chats.js b/src/services/chats.js index 51d8efdd..3035ed0c 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -218,7 +218,7 @@ const readChatHandler = async (req, res) => { return res.status(404).send("Chat/read : cannot find room info"); } - if (await emitUpdateEvent(io, roomId, userId)) res.json({ result: true }); + if (await emitUpdateEvent(io, roomId)) res.json({ result: true }); else res.status(500).send("Chat/read : failed to emit socket events"); } catch (e) { res.status(500).send("Chat/read : internal server error"); From 455497ade466daf56b78ebb853636faf7c30fbdc Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:46:20 +0000 Subject: [PATCH 10/19] Fix: disconnectSocket channel --- src/modules/auths/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/auths/login.js b/src/modules/auths/login.js index f8e4308c..8181c991 100644 --- a/src/modules/auths/login.js +++ b/src/modules/auths/login.js @@ -27,7 +27,7 @@ const login = (req, sid, id, oid, name) => { const logout = (req) => { // 로그아웃 전 socket.io 소켓들 연결부터 끊기 const io = req.app.get("io"); - if (io) io.in(req.session.id).disconnectSockets(true); + if (io) io.in(`session-${req.session.id}`).disconnectSockets(true); req.session.destroy((err) => { if (err) logger.error(err); From 985991671771628024b4eb3c31f2a9fe22489141 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:47:55 +0000 Subject: [PATCH 11/19] Fix: change endpoint of readChatHandler --- src/routes/chats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/chats.js b/src/routes/chats.js index 77fdf925..9c0bb56b 100644 --- a/src/routes/chats.js +++ b/src/routes/chats.js @@ -59,7 +59,7 @@ router.post( * 같은 방에 있는 user들에게 업데이트를 요청합니다. */ router.post( - "/readat", + "/read", body("roomId").isMongoId(), body("lastMsgDate").isISO8601(), validator, From 0d1a745ead2478ba05d8a38c69aff91a7b3ca92b Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 5 Sep 2023 14:49:18 +0000 Subject: [PATCH 12/19] Remove: import formatSettlement --- src/services/chats.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/chats.js b/src/services/chats.js index 3035ed0c..71017bdd 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -8,7 +8,6 @@ const { } = require("../modules/socket"); const { roomPopulateOption, - formatSettlement, } = require("../modules/populates/rooms"); const chatCount = 60; From 8092fa1723db2a27de6a2ce714afa0385efc3343 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Sun, 17 Sep 2023 16:26:22 +0000 Subject: [PATCH 13/19] Fix: fix format --- src/modules/socket.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/socket.js b/src/modules/socket.js index 1e04cfcd..8e897c3b 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -246,7 +246,7 @@ const startSocketServer = (server) => { setHeader(key, values) { req.cookieHolder = values[0]; }, - writeHead() { }, + writeHead() {}, }; sessionMiddleware(req, fakeRes, () => { if (req.session) { @@ -283,7 +283,7 @@ const startSocketServer = (server) => { socket.join(`user-${userOid}`); }); - socket.on("disconnect", () => { }); + socket.on("disconnect", () => {}); } catch (err) { logger.error(err); } From 784cad3feccbbb0319a021b5b262ac46f218e655 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Sun, 17 Sep 2023 16:27:02 +0000 Subject: [PATCH 14/19] Remove: lastMsgDate in readChatHandler --- src/routes/chats.js | 1 - src/services/chats.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/routes/chats.js b/src/routes/chats.js index 9c0bb56b..f689348c 100644 --- a/src/routes/chats.js +++ b/src/routes/chats.js @@ -61,7 +61,6 @@ router.post( router.post( "/read", body("roomId").isMongoId(), - body("lastMsgDate").isISO8601(), validator, chatsHandlers.readChatHandler ); diff --git a/src/services/chats.js b/src/services/chats.js index f26facde..8973c24f 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -179,7 +179,7 @@ const readChatHandler = async (req, res) => { try { const io = req.app.get("io"); const { userId } = req; - const { roomId, lastMsgDate } = req.body; + const { roomId } = req.body; const user = await userModel.findOne({ id: userId }); if (!userId || !user) { @@ -206,7 +206,7 @@ const readChatHandler = async (req, res) => { }, }, { - $set: { "part.$[updater].readAt": lastMsgDate }, + $set: { "part.$[updater].readAt": Date.now() }, }, { new: true, From 86babb6bbd171b1eaa08e9a1cf9c0fe48bd079e6 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Sun, 17 Sep 2023 16:28:03 +0000 Subject: [PATCH 15/19] Refactor: change readAt field to optional --- src/modules/populates/rooms.js | 3 ++- src/modules/stores/mongo.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/populates/rooms.js b/src/modules/populates/rooms.js index d051a1f3..7243d648 100644 --- a/src/modules/populates/rooms.js +++ b/src/modules/populates/rooms.js @@ -29,13 +29,14 @@ const formatSettlement = ( roomObject.part = roomObject.part.map((participantSubDocument) => { const { _id, name, nickname, profileImageUrl } = participantSubDocument.user; - const { settlementStatus } = participantSubDocument; + const { settlementStatus, readAt } = participantSubDocument; return { _id, name, nickname, profileImageUrl, isSettlement: includeSettlement ? settlementStatus : undefined, + readAt: readAt ?? roomObject.madeat, }; }); roomObject.settlementTotal = includeSettlement diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index 7223e368..0d29108c 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -34,7 +34,7 @@ const participantSchema = Schema({ enum: ["not-departed", "paid", "send-required", "sent"], default: "not-departed", }, - readAt: { type: Date, required: true, default: () => Date.now() }, + readAt: { type: Date, default: () => Date.now() }, }); const deviceTokenSchema = Schema({ From fdc18d78826e34579c932e658a209fe6b6de4055 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 19 Sep 2023 12:22:31 +0000 Subject: [PATCH 16/19] Refactor: chat.js --- src/modules/socket.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/modules/socket.js b/src/modules/socket.js index 8e897c3b..bca99161 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -219,14 +219,9 @@ const emitUpdateEvent = async (io, roomId) => { throw new IllegalArgumentsException(); } - const userIds = part.map((participant) => participant.user); - await Promise.all( - userIds.map(async (userId) => - io.in(`user-${userId}`).emit("chat_update", { - roomId, - }) - ) - ); + part.forEach(({ user }) => io.in(`user-${user}`).emit("chat_update"), { + roomId, + }); return true; } catch (err) { From 6f9d1a96a9fb3cdb0896b4f0321c7a6f0c14c7ce Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 19 Sep 2023 12:23:23 +0000 Subject: [PATCH 17/19] Remove: readAt default value --- src/modules/stores/mongo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index 0d29108c..bd73367f 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -34,7 +34,7 @@ const participantSchema = Schema({ enum: ["not-departed", "paid", "send-required", "sent"], default: "not-departed", }, - readAt: { type: Date, default: () => Date.now() }, + readAt: { type: Date }, }); const deviceTokenSchema = Schema({ From 8f64026b2c4a02f4a00741a4c08741dc95d197eb Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Tue, 19 Sep 2023 12:24:22 +0000 Subject: [PATCH 18/19] Fix: change Date.now() and remove isPart --- src/services/chats.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/services/chats.js b/src/services/chats.js index 8973c24f..34c32fc0 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -188,12 +188,6 @@ const readChatHandler = async (req, res) => { if (!io) { return res.status(403).send("Chat/read : socket did not connected"); } - const isPart = await isUserInRoom(userId, roomId); - if (!isPart) { - return res - .status(403) - .send("Chat/read : user did not participated in the room"); - } const roomObject = await roomModel .findOneAndUpdate( @@ -206,7 +200,7 @@ const readChatHandler = async (req, res) => { }, }, { - $set: { "part.$[updater].readAt": Date.now() }, + $set: { "part.$[updater].readAt": req.timestamp }, }, { new: true, From 9fbd0893da0de2f893650a1b43a159567e790e83 Mon Sep 17 00:00:00 2001 From: Dongwon Choi Date: Sun, 24 Sep 2023 15:43:31 +0000 Subject: [PATCH 19/19] Fix: remove redundatn populate option --- src/services/chats.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/chats.js b/src/services/chats.js index 34c32fc0..abcbd073 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -207,8 +207,7 @@ const readChatHandler = async (req, res) => { arrayFilters: [{ "updater.user": { $eq: user._id } }], } ) - .lean() - .populate(roomPopulateOption); + .lean(); if (!roomObject) { return res.status(404).send("Chat/read : cannot find room info");