Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#449-1 채팅 검증 개선 및 오류 수정 #460

Merged
merged 14 commits into from
May 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading