Skip to content

Commit

Permalink
Merge pull request #460 from sparcs-kaist/#449-chat-validation
Browse files Browse the repository at this point in the history
#449-1 채팅 검증 개선 및 오류 수정
  • Loading branch information
chlehdwon authored May 28, 2024
2 parents ad1af59 + 9bb328c commit ef3cb81
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 45 deletions.
34 changes: 34 additions & 0 deletions scripts/chatPaymentSettlementUpdater.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Issue #449-1을 해결하기 위한 DB 마이그레이션 스크립트입니다.
// chat type 중 settlement와 payment를 서로 교체합니다.
// https://github.com/sparcs-kaist/taxi-back/issues/449

const { MongoClient } = require("mongodb");
const { mongo: mongoUrl } = require("../loadenv");

const client = new MongoClient(mongoUrl);
const db = client.db("taxi");
const chats = db.collection("chats");

async function run() {
try {
for await (const doc of chats.find()) {
if (doc.type === "settlement" || doc.type === "payment") {
await chats.findOneAndUpdate(
{ _id: doc._id },
{
$set: {
type: doc.type === "settlement" ? "payment" : "settlement",
},
}
);
}
}
} catch (err) {
console.log(err);
} finally {
await client.close();
}
}
run().then(() => {
console.log("Done!");
});
6 changes: 3 additions & 3 deletions src/lottery/modules/contracts.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ const completeFirstLoginQuest = async (userId, timestamp) => {
* @param {Date} roomObject.time - 출발 시각입니다.
* @returns {Promise}
* @description 정산 요청 또는 송금이 이루어질 때마다 호출해 주세요.
* @usage rooms - commitPaymentHandler, rooms - settlementHandler
* @usage rooms - commitSettlementHandler, rooms - commitPaymentHandler
*/
const completePayingAndSendingQuest = async (userId, timestamp, roomObject) => {
logger.info(
Expand Down Expand Up @@ -167,7 +167,7 @@ const completeFirstRoomCreationQuest = async (userId, timestamp) => {
* @param {Date} roomObject.time - 출발 시각입니다.
* @returns {Promise}
* @description 정산 요청이 이루어질 때마다 호출해 주세요.
* @usage rooms - commitPaymentHandler
* @usage rooms - commitSettlementHandler
*/
const completePayingQuest = async (userId, timestamp, roomObject) => {
logger.info(
Expand Down Expand Up @@ -195,7 +195,7 @@ const completePayingQuest = async (userId, timestamp, roomObject) => {
* @param {Date} roomObject.time - 출발 시각입니다.
* @returns {Promise}
* @description 송금이 이루어질 때마다 호출해 주세요.
* @usage rooms - settlementHandler
* @usage rooms - commitPaymentHandler
*/
const completeSendingQuest = async (userId, timestamp, roomObject) => {
logger.info(
Expand Down
4 changes: 2 additions & 2 deletions src/modules/socket.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,11 @@ const getMessageBody = (type, nickname = "", content = "") => {
const suffix = "님이 퇴장하였습니다";
return `${ellipsisedNickname} ${suffix}`;
}
case "payment": {
case "settlement": {
const suffix = "님이 정산을 시작하였습니다";
return `${ellipsisedNickname} ${suffix}`;
}
case "settlement": {
case "payment": {
const suffix = "님이 송금을 완료하였습니다";
return `${ellipsisedNickname} ${suffix}`;
}
Expand Down
2 changes: 1 addition & 1 deletion src/routes/docs/chats.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ chatsDocs[`${apiPrefix}/send`] = {
Chat {
roomId: ObjectId, //방의 objectId
type: String, // 메시지 종류 ("text": 일반 메시지, "s3img": S3에 업로드된 이미지, "in": 입장 메시지, "out": 퇴장 메시지, "payment": 결제 메시지, "settlement": 정산 완료 메시지, "account": 계좌 전송 메시지)
type: String, // 메시지 종류 ("text": 일반 메시지, "s3img": S3에 업로드된 이미지, "in": 입장 메시지, "out": 퇴장 메시지, "settlement": 정산 메시지, "payment": 송금 메시지, "account": 계좌 전송 메시지)
authorId: ObejctId, //작성자의 objectId
content: String, // 메시지 내용 (메시지 종류에 따라 포맷이 상이함)
time: String(ISO 8601), // ex) 2024-01-08T01:52:00.000Z
Expand Down
20 changes: 10 additions & 10 deletions src/routes/docs/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -683,11 +683,11 @@ roomsDocs[`${apiPrefix}/searchByUser`] = {
},
};

roomsDocs[`${apiPrefix}/commitPayment`] = {
roomsDocs[`${apiPrefix}/commitSettlement`] = {
post: {
tags: [tag],
summary: "방 결제 처리",
description: `해당 방에 요청을 보낸 유저를 결제자로 처리합니다.<br/>
summary: "방 정산 요청 처리",
description: `해당 방에 요청을 보낸 유저를 결제자로 처리하여, 다른 유저들에게 정산을 요청합니다.<br/>
이미 출발한 방에 대해서만 요청을 처리합니다.<br/>
방의 \`part\` 배열에서 요청을 보낸 유저의 \`isSettlement\` 속성은 \`paid\`로 설정됩니다.<br/>
나머지 유저들의 \`isSettlement\` 속성을 \`send-required\`로 설정합니다.`,
Expand Down Expand Up @@ -731,7 +731,7 @@ roomsDocs[`${apiPrefix}/commitPayment`] = {
},
},
example: {
error: "Rooms/:id/commitPayment : cannot find settlement info",
error: "Rooms/:id/commitSettlement : cannot find settlement info",
},
},
},
Expand All @@ -749,7 +749,7 @@ roomsDocs[`${apiPrefix}/commitPayment`] = {
},
},
example: {
error: "Rooms/:id/commitPayment : internal server error",
error: "Rooms/:id/commitSettlement : internal server error",
},
},
},
Expand All @@ -758,11 +758,11 @@ roomsDocs[`${apiPrefix}/commitPayment`] = {
},
};

roomsDocs[`${apiPrefix}/commitSettlement`] = {
roomsDocs[`${apiPrefix}/commitPayment`] = {
post: {
tags: [tag],
summary: "방 정산 완료 처리",
description: `해당 방에 요청을 보낸 유저를 정산 완료로 처리합니다.<br/>
summary: "방 송금 처리",
description: `해당 방에 요청을 보낸 유저를 송금을 완료한 정산 완료로 처리합니다.<br/>
방의 \`part\` 배열에서 요청을 보낸 유저의 \`isSettlement\` 속성은 \`send-required\`에서 \`sent\`로 변경합니다.<br/>
방의 참여한 유저들이 모두 정산완료를 하면 방의 \`isOver\` 속성이 \`true\`로 변경되며, 과거 방으로 취급됩니다.`,
requestBody: {
Expand Down Expand Up @@ -805,7 +805,7 @@ roomsDocs[`${apiPrefix}/commitSettlement`] = {
},
},
example: {
error: "Rooms/:id/settlement : cannot find settlement info",
error: "Rooms/:id/commitPayment : cannot find settlement info",
},
},
},
Expand All @@ -823,7 +823,7 @@ roomsDocs[`${apiPrefix}/commitSettlement`] = {
},
},
example: {
error: "Rooms/:id/settlement : internal server error",
error: "Rooms/:id/commitPayment : internal server error",
},
},
},
Expand Down
8 changes: 8 additions & 0 deletions src/routes/docs/schemas/roomsSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ roomsZod["room"] = z
})
.partial({ settlementTotal: true, isOver: true });

roomsZod["commitSettlement"] = z.object({
roomId: z.string().regex(objectId),
});

roomsZod["commitPayment"] = z.object({
roomId: z.string().regex(objectId),
});

const roomsSchema = zodToSchemaObject(roomsZod);

module.exports = { roomsSchema, roomsZod };
19 changes: 10 additions & 9 deletions src/routes/rooms.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
const express = require("express");
const { query, body } = require("express-validator");
const { validateBody } = require("../middlewares/zod");
const { roomsZod } = require("./docs/schemas/roomsSchema");
const router = express.Router();

const roomHandlers = require("../services/rooms");
Expand Down Expand Up @@ -91,19 +93,18 @@ router.post(
// 로그인된 사용자의 모든 방들을 반환한다.
router.get("/searchByUser", roomHandlers.searchByUserHandler);

// 해당 방에 요청을 보낸 유저의 정산을 처리한다.
router.post(
"/commitPayment",
body("roomId").isMongoId(),
validator,
roomHandlers.commitPaymentHandler
"/commitSettlement",
validateBody(roomsZod.commitSettlement),
roomHandlers.commitSettlementHandler
);

// 해당 룸의 요청을 보낸 유저의 정산을 완료로 처리한다.
// 해당 방에 요청을 보낸 유저의 송금을 처리한다.
router.post(
"/commitSettlement",
body("roomId").isMongoId(),
validator,
roomHandlers.settlementHandler
"/commitPayment",
validateBody(roomsZod.commitPayment),
roomHandlers.commitPaymentHandler
);

// json으로 수정할 값들을 받아 방의 정보를 수정합니다.
Expand Down
26 changes: 13 additions & 13 deletions src/services/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@ const searchByUserHandler = async (req, res) => {
}
};

const commitPaymentHandler = async (req, res) => {
const commitSettlementHandler = async (req, res) => {
try {
const user = await userModel.findOne({ id: req.userId });
const { roomId } = req.body;
Expand Down Expand Up @@ -593,7 +593,7 @@ const commitPaymentHandler = async (req, res) => {

if (!roomObject) {
return res.status(404).json({
error: "Rooms/:id/commitPayment : cannot find settlement info",
error: "Rooms/:id/commitSettlement : cannot find settlement info",
});
}

Expand All @@ -606,17 +606,17 @@ const commitPaymentHandler = async (req, res) => {
if (userOngoingRoomIndex === -1) {
await user.save();
return res.status(500).json({
error: "Rooms/:id/settlement : internal server error",
error: "Rooms/:id/commitSettlement : internal server error",
});
}
user.ongoingRoom.splice(userOngoingRoomIndex, 1);

await user.save();

// 결제 채팅을 보냅니다.
// 정산 채팅을 보냅니다.
await emitChatEvent(req.app.get("io"), {
roomId,
type: "payment",
type: "settlement",
content: user.id,
authorId: user._id,
});
Expand All @@ -638,12 +638,12 @@ const commitPaymentHandler = async (req, res) => {
} catch (err) {
logger.error(err);
res.status(500).json({
error: "Rooms/:id/commitPayment : internal server error",
error: "Rooms/:id/commitSettlement : internal server error",
});
}
};

const settlementHandler = async (req, res) => {
const commitPaymentHandler = async (req, res) => {
try {
const { roomId } = req.body;
const user = await userModel.findOne({ id: req.userId });
Expand Down Expand Up @@ -671,7 +671,7 @@ const settlementHandler = async (req, res) => {

if (!roomObject) {
return res.status(404).json({
error: "Rooms/:id/settlement : cannot find settlement info",
error: "Rooms/:id/commitPayment : cannot find settlement info",
});
}

Expand All @@ -684,17 +684,17 @@ const settlementHandler = async (req, res) => {
if (userOngoingRoomIndex === -1) {
await user.save();
return res.status(500).json({
error: "Rooms/:id/settlement : internal server error",
error: "Rooms/:id/commitPayment : internal server error",
});
}
user.ongoingRoom.splice(userOngoingRoomIndex, 1);

await user.save();

// 정산 채팅을 보냅니다.
// 송금 채팅을 보냅니다.
await emitChatEvent(req.app.get("io"), {
roomId,
type: "settlement",
type: "payment",
content: user.id,
authorId: user._id,
});
Expand All @@ -716,7 +716,7 @@ const settlementHandler = async (req, res) => {
} catch (err) {
logger.error(err);
res.status(500).json({
error: "Rooms/:id/settlement : internal server error",
error: "Rooms/:id/commitPayment : internal server error",
});
}
};
Expand Down Expand Up @@ -811,6 +811,6 @@ module.exports = {
searchHandler,
searchByUserHandler,
commitPaymentHandler,
settlementHandler,
commitSettlementHandler,
// editHandler,
};
14 changes: 7 additions & 7 deletions test/services/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ describe("[rooms] 6.searchByUserHandler", () => {
});

// 7. 1분이 지난 후, 정산 정보를 불러옴. 예상과 같은 정보를 불러오는지 확인
describe("[rooms] 7.commitPaymentHandler", () => {
it("should return information of room and commit payment", async () => {
describe("[rooms] 7.commitSettlementHandler", () => {
it("should return information of room and commit settlement", async () => {
const testUser1 = await userModel.findOne({ id: "test1" });
const testRoom = await roomModel.findOne({ name: "test-room" });
let req = httpMocks.createRequest({
Expand All @@ -152,7 +152,7 @@ describe("[rooms] 7.commitPaymentHandler", () => {
app,
});
let res = httpMocks.createResponse();
await roomsHandlers.commitPaymentHandler(req, res);
await roomsHandlers.commitSettlementHandler(req, res);

const resData = res._getData();
expect(resData).to.has.property("name", "test-room");
Expand All @@ -161,9 +161,9 @@ describe("[rooms] 7.commitPaymentHandler", () => {
});
});

// 8. 도착 정보를 불러옴. 예상과 같은 정보를 불러오는지 확인
describe("[rooms] 8.settlementHandler", () => {
it("should return information of room and set settlement", async () => {
// 8. 송금 후 정산 정보를 불러옴. 예상과 같은 정보를 불러오는지 확인
describe("[rooms] 8.commitPaymentHandler", () => {
it("should return information of room and commit payment", async () => {
const testUser2 = await userModel.findOne({ id: "test2" });
const testRoom = await roomModel.findOne({ name: "test-room" });
let req = httpMocks.createRequest({
Expand All @@ -172,7 +172,7 @@ describe("[rooms] 8.settlementHandler", () => {
app,
});
let res = httpMocks.createResponse();
await roomsHandlers.settlementHandler(req, res);
await roomsHandlers.commitPaymentHandler(req, res);

const resData = res._getData();
expect(resData).to.has.property("name", "test-room");
Expand Down

0 comments on commit ef3cb81

Please sign in to comment.