From a6e3101d1fb64425993fa49351a3863ee52b3bf7 Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Fri, 25 Nov 2022 21:37:33 +0900 Subject: [PATCH 1/9] Add: change searchByUserHandler --- src/service/rooms.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/service/rooms.js b/src/service/rooms.js index 31607acc..789ec54b 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -351,6 +351,31 @@ const searchByUserHandler = async (req, res) => { }) .lean(); + // ongoingRoom 중 이미 출발했고, 혼자 참여중인 방은 + // 정산 상태를 완료로 바꾸고 doneRoom으로 옮긴다. + const moving = user.ongoingRoom.filter( + (room) => room.part.length === 1 && room.time < req.timestamp + ); + moving.forEach(async function (room) { + room.part.settlementStatus = "paid"; + room.settlementTotal = 1; + room.isDeparted = true; + await room.save(); + + user.doneRoom.push(room._id); + + const movingRoomIndex = user.ongoingRoom.indexOf(room._id); + if (movingRoomIndex === -1) { + await user.save(); + return res.status(500).json({ + error: "Rooms/searchByUser/:id : internal server error", + }); + } + user.ongoingRoom.splice(movingRoomIndex); + + await user.save(); + }); + // 정산완료여부 기준으로 진행중인 방과 완료된 방을 분리해서 응답을 전송합니다. const response = {}; response.ongoing = user.ongoingRoom.map((room) => From 2762abadbec60118294f7acc5cb76c9a5c24534e Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Fri, 25 Nov 2022 23:51:31 +0900 Subject: [PATCH 2/9] Fix: searchByUserHandler --- src/route/rooms.js | 2 +- src/service/rooms.js | 27 +++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/route/rooms.js b/src/route/rooms.js index ca3d3cf7..4406b90e 100644 --- a/src/route/rooms.js +++ b/src/route/rooms.js @@ -70,7 +70,7 @@ router.get( ); // 로그인된 사용자의 모든 방들을 반환한다. -router.get("/searchByUser", roomHandlers.searchByUserHandler); +router.get("/searchByUser", setTimestamp, roomHandlers.searchByUserHandler); router.post( "/commitPayment", diff --git a/src/service/rooms.js b/src/service/rooms.js index 789ec54b..ca3e7953 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -354,13 +354,28 @@ const searchByUserHandler = async (req, res) => { // ongoingRoom 중 이미 출발했고, 혼자 참여중인 방은 // 정산 상태를 완료로 바꾸고 doneRoom으로 옮긴다. const moving = user.ongoingRoom.filter( - (room) => room.part.length === 1 && room.time < req.timestamp + (room) => room.part.length == 1 && room.time <= req.timestamp ); + moving.forEach(async function (room) { - room.part.settlementStatus = "paid"; - room.settlementTotal = 1; - room.isDeparted = true; - await room.save(); + let changingRoomObject = await roomModel + .findOneAndUpdate( + { _id: room._id }, + { + settlementTotal: 1, + isDeparted: true, + $set: { "part[0].settlementStatus": "paid" }, + }, + { raw: true } + ) + .lean() + .populate(roomPopulateOption); + + if (!changingRoomObject) { + return res.status(404).json({ + error: "Rooms/searchByUser/:id : cannot find settlement info", + }); + } user.doneRoom.push(room._id); @@ -371,7 +386,7 @@ const searchByUserHandler = async (req, res) => { error: "Rooms/searchByUser/:id : internal server error", }); } - user.ongoingRoom.splice(movingRoomIndex); + user.ongoingRoom.splice(movingRoomIndex, 1); await user.save(); }); From fa7f01f76de6f394d66749960989bed03ae93c7a Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Sat, 26 Nov 2022 23:32:30 +0900 Subject: [PATCH 3/9] Fix: searchByUserHandler app crash --- src/service/rooms.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service/rooms.js b/src/service/rooms.js index ca3e7953..4c390985 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -357,7 +357,7 @@ const searchByUserHandler = async (req, res) => { (room) => room.part.length == 1 && room.time <= req.timestamp ); - moving.forEach(async function (room) { + for (const room of moving) { let changingRoomObject = await roomModel .findOneAndUpdate( { _id: room._id }, @@ -389,7 +389,7 @@ const searchByUserHandler = async (req, res) => { user.ongoingRoom.splice(movingRoomIndex, 1); await user.save(); - }); + } // 정산완료여부 기준으로 진행중인 방과 완료된 방을 분리해서 응답을 전송합니다. const response = {}; From 98537e4a7588eeddcb535ae34d1f8ae60e343774 Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Sun, 27 Nov 2022 00:59:02 +0900 Subject: [PATCH 4/9] Fix: searchByUserHandler --- src/service/rooms.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/service/rooms.js b/src/service/rooms.js index 4c390985..ceb480f7 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -360,13 +360,21 @@ const searchByUserHandler = async (req, res) => { for (const room of moving) { let changingRoomObject = await roomModel .findOneAndUpdate( - { _id: room._id }, + { + _id: room._id, + part: { + $elemMatch: { + user: user._id, + settlementStatus: "not-departed", + }, + }, + time: { $lte: req.timestamp }, + }, { settlementTotal: 1, - isDeparted: true, - $set: { "part[0].settlementStatus": "paid" }, + $set: { "part.$.settlementStatus": "paid" }, }, - { raw: true } + { new: true } ) .lean() .populate(roomPopulateOption); From 88d5899c6505e71952edda20b32f43565a19518f Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Tue, 29 Nov 2022 21:17:45 +0900 Subject: [PATCH 5/9] Fix(rooms.js): searchByUserHandler remove lean --- src/service/rooms.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/service/rooms.js b/src/service/rooms.js index ceb480f7..97b4e0a1 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -348,8 +348,7 @@ const searchByUserHandler = async (req, res) => { path: "doneRoom", options: { limit: 1000 }, populate: roomPopulateOption, - }) - .lean(); + }); // ongoingRoom 중 이미 출발했고, 혼자 참여중인 방은 // 정산 상태를 완료로 바꾸고 doneRoom으로 옮긴다. @@ -357,7 +356,9 @@ const searchByUserHandler = async (req, res) => { (room) => room.part.length == 1 && room.time <= req.timestamp ); - for (const room of moving) { + console.log("moving array: " + moving); + for await (const room of moving) { + console.log("before changing settlement: " + room); let changingRoomObject = await roomModel .findOneAndUpdate( { @@ -385,17 +386,18 @@ const searchByUserHandler = async (req, res) => { }); } + console.log("after changing settlement: " + changingRoomObject); user.doneRoom.push(room._id); - const movingRoomIndex = user.ongoingRoom.indexOf(room._id); + console.log("movingRoomIndex: " + movingRoomIndex); if (movingRoomIndex === -1) { await user.save(); + console.log("There is no room that satisfies room id. "); return res.status(500).json({ error: "Rooms/searchByUser/:id : internal server error", }); } user.ongoingRoom.splice(movingRoomIndex, 1); - await user.save(); } From 97a4ad571a7748aed52f46d476ab6f9a42ee9d26 Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Tue, 29 Nov 2022 23:40:44 +0900 Subject: [PATCH 6/9] Fix: searchByUserHandler moving operation --- src/service/rooms.js | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/service/rooms.js b/src/service/rooms.js index 97b4e0a1..5ea61e9f 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -337,7 +337,7 @@ const searchHandler = async (req, res) => { const searchByUserHandler = async (req, res) => { try { - const user = await userModel + var user = await userModel .findOne({ id: req.userId }) .populate({ path: "ongoingRoom", @@ -356,7 +356,7 @@ const searchByUserHandler = async (req, res) => { (room) => room.part.length == 1 && room.time <= req.timestamp ); - console.log("moving array: " + moving); + // 정산 상태를 완료로 바꾼다. for await (const room of moving) { console.log("before changing settlement: " + room); let changingRoomObject = await roomModel @@ -386,21 +386,33 @@ const searchByUserHandler = async (req, res) => { }); } - console.log("after changing settlement: " + changingRoomObject); - user.doneRoom.push(room._id); - const movingRoomIndex = user.ongoingRoom.indexOf(room._id); - console.log("movingRoomIndex: " + movingRoomIndex); - if (movingRoomIndex === -1) { - await user.save(); - console.log("There is no room that satisfies room id. "); - return res.status(500).json({ - error: "Rooms/searchByUser/:id : internal server error", - }); - } - user.ongoingRoom.splice(movingRoomIndex, 1); - await user.save(); + // ongoingRoom에서 doneRoom으로 옮긴다. + await userModel.updateOne( + { id: req.userId }, + { $push: { doneRoom: room.id } } + ); + + await userModel.updateOne( + { id: req.userId }, + { $pull: { ongoingRoom: room.id } } + ); } + // lean()이 적용된 user를 response에 반환해줘야 하기 때문에 user를 한 번 더 지정한다. + user = await userModel + .findOne({ id: req.userId }) + .populate({ + path: "ongoingRoom", + options: { limit: 1000 }, + populate: roomPopulateOption, + }) + .populate({ + path: "doneRoom", + options: { limit: 1000 }, + populate: roomPopulateOption, + }) + .lean(); + // 정산완료여부 기준으로 진행중인 방과 완료된 방을 분리해서 응답을 전송합니다. const response = {}; response.ongoing = user.ongoingRoom.map((room) => From a231e2d44ff1159e139a0117104cd37cd8e825aa Mon Sep 17 00:00:00 2001 From: Hyogyeong8 Date: Wed, 30 Nov 2022 11:07:30 +0900 Subject: [PATCH 7/9] Docs: searchByUserHandler --- src/route/docs/rooms.md | 2 ++ src/service/rooms.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/route/docs/rooms.md b/src/route/docs/rooms.md index 54c20b92..1526034c 100755 --- a/src/route/docs/rooms.md +++ b/src/route/docs/rooms.md @@ -226,6 +226,8 @@ room의 ID를 받아 해당 room의 참가자 목록에서 요청을 보낸 사 ### `/searchByUser` **(GET)** 로그인된 사용자가 참여 중인 room들을 반환한다. +혼자 참여 중인 방 중 이미 출발한 방이 있으면 +정산 완료 처리한 후 과거 참여 방으로 옮긴다. #### URL parameters diff --git a/src/service/rooms.js b/src/service/rooms.js index 5ea61e9f..2c9d6c19 100644 --- a/src/service/rooms.js +++ b/src/service/rooms.js @@ -337,7 +337,7 @@ const searchHandler = async (req, res) => { const searchByUserHandler = async (req, res) => { try { - var user = await userModel + var user = await userModel // 일련의 작업 후 user를 재정의하기 때문에 var로 정의 .findOne({ id: req.userId }) .populate({ path: "ongoingRoom", @@ -382,7 +382,7 @@ const searchByUserHandler = async (req, res) => { if (!changingRoomObject) { return res.status(404).json({ - error: "Rooms/searchByUser/:id : cannot find settlement info", + error: "Rooms/searchByUser : cannot find settlement info", }); } From 11cfed9693d0ec16490f691803c2fb54773e6e0a Mon Sep 17 00:00:00 2001 From: 14Kgun Date: Fri, 8 Sep 2023 20:27:25 +0900 Subject: [PATCH 8/9] Remove: setTimestamp --- src/routes/rooms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/rooms.js b/src/routes/rooms.js index 76d37c35..be1c3f59 100644 --- a/src/routes/rooms.js +++ b/src/routes/rooms.js @@ -76,7 +76,7 @@ router.post( ); // 로그인된 사용자의 모든 방들을 반환한다. -router.get("/searchByUser", setTimestamp, roomHandlers.searchByUserHandler); +router.get("/searchByUser", roomHandlers.searchByUserHandler); router.post( "/commitPayment", From abda40050fe4aba7f33ca660f9ec81169ee92a33 Mon Sep 17 00:00:00 2001 From: cokia Date: Tue, 23 Apr 2024 19:56:33 +0900 Subject: [PATCH 9/9] fix: autoProcessingRoom cron logic --- src/schedules/autoProcessingRoom.js | 56 +++++++++++++++++++++++++++++ src/schedules/index.js | 1 + 2 files changed, 57 insertions(+) create mode 100644 src/schedules/autoProcessingRoom.js diff --git a/src/schedules/autoProcessingRoom.js b/src/schedules/autoProcessingRoom.js new file mode 100644 index 00000000..f297b506 --- /dev/null +++ b/src/schedules/autoProcessingRoom.js @@ -0,0 +1,56 @@ +const { userModel, roomModel, chatModel } = require("../modules/stores/mongo"); +const logger = require("../modules/logger"); +const { MS_PER_MINUTE } = require("../modules/constants"); +const { emitChatEvent } = require("../modules/socket"); + +// 탑승자가 1명인 상태로 탑승일이 지난 방에 대해서 정산 완료 처리 +module.exports = (app) => async () => { + try { + const io = app.get("io"); + const expiredDate = new Date(Date.now() - 90 * MS_PER_MINUTE).toISOString(); + const arrivalDate = new Date(Date.now() - 60 * MS_PER_MINUTE).toISOString(); + + const candidateRooms = await roomModel.find({ + $and: [ + { time: { $gte: expiredDate } }, + { time: { $lte: arrivalDate } }, + { "part.0": { $exists: true }, "part.1": { $exists: false } }, + { "part.0.settlementStatus": { $nin: ["paid", "sent"] } }, + ], + }); + + await Promise.all( + candidateRooms.map(async ({ _id: roomId, time, part }) => { + const countArrivalChat = await chatModel.countDocuments({ + roomId, + type: "arrival", + }); + if (countArrivalChat > 0) return; + const minuteDiff = Math.floor((Date.now() - time) / MS_PER_MINUTE); + if (minuteDiff <= 0) return; + await emitChatEvent(io, { + roomId: roomId, + type: "arrival", + content: minuteDiff.toString(), + }); + // user에게 doneroom 으로 이전 + const user = await userModel.findById(part[0].userId); + user.doneRooms.push(roomId); + + const userOngoingRoomIndex = user.ongoingRoom.indexOf(roomId); + if (userOngoingRoomIndex === -1) { + await user.save(); + return false; + } + user.ongoingRoom.splice(userOngoingRoomIndex, 1); + + await user.save(); + + // room에 대한 정산 완료 처리 isOver + await roomModel.findByIdAndUpdate(roomId, { isOver: true }); + }) + ); + } catch (err) { + logger.error(err); + } +}; diff --git a/src/schedules/index.js b/src/schedules/index.js index 97818b92..e153f3ed 100644 --- a/src/schedules/index.js +++ b/src/schedules/index.js @@ -3,6 +3,7 @@ const cron = require("node-cron"); const registerSchedules = (app) => { cron.schedule("*/5 * * * *", require("./notifyBeforeDepart")(app)); cron.schedule("*/10 * * * *", require("./notifyAfterArrival")(app)); + cron.schedule("*/15 * * * *", require("./autoProcessingRoom")(app)); }; module.exports = registerSchedules;