Skip to content

Commit

Permalink
Merge branch 'dev' into #188.1-extend-session-expiry-again
Browse files Browse the repository at this point in the history
  • Loading branch information
14KGun authored Apr 25, 2023
2 parents 5a0231e + 88a0a2b commit 5f576ed
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 38 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ module.exports = {
},
rules: {
"no-unused-vars": 1,
"mocha/no-mocha-arrows": 0,
},
};
2 changes: 1 addition & 1 deletion src/modules/populates/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const roomPopulateOption = [
];

/**
* Room Object가 주어졌을 때 room의 part array의 각 요소를 API 명세에서와 같이 {userId: String, ... , settlementStatus: String}으로 가공합니다.
* Room Object가 주어졌을 때 room의 part array의 각 요소를 API 명세에서와 같이 {userId: String, ... , isSettlement: String}으로 가공합니다.
* 또한, 방이 현재 출발했는지 유무인 isDeparted 속성을 추가합니다.
* @param {Object} roomObject - 정산 정보를 가공할 room Object로, Mongoose Document가 아닌 순수 Javascript Object여야 합니다.
* @param {Object} options - 추가 파라미터로, 기본값은 {}입니다.
Expand Down
67 changes: 43 additions & 24 deletions src/routes/docs/rooms.md
Original file line number Diff line number Diff line change
@@ -1,58 +1,60 @@
# `/rooms` API
**개발 도중 Room 구조가 바뀌어 `/rooms/v2`로 접근하여 사용할 수 있었던 API 입니다.**
**현재도 호환성 유지를 위해 `/rooms/v2`로 접근하여 API를 사용할 수 있습니다.**

## Table of contents

- [`/rooms` API](#rooms-api)
- [Table of contents](#table-of-contents)
- [Description](#description)
- [Available endpoints](#available-endpoints)
- [`/info` **(GET)**](#info-get)
- [`/publicInfo` **(GET)**](#publicinfo-get)
- [URL parameters](#url-parameters)
- [Response](#response)
- [Errors](#errors)
- [`/info` **(GET)**](#info-get)
- [URL parameters](#url-parameters-1)
- [Response](#response-1)
- [Errors](#errors-1)
- [`/create` **(POST)**](#create-post)
- [POST request form](#post-request-form)
- [Errors](#errors-1)
- [Response](#response-1)
- [Errors](#errors-2)
- [Response](#response-2)
- [`/join` (POST)](#join-post)
- [request JSON form](#request-json-form)
- [Errors](#errors-2)
- [Errors](#errors-3)
- [`/abort` (POST)](#abort-post)
- [request JSON form](#request-json-form-1)
- [Errors](#errors-3)
- [`/search` **(GET)**](#search-get)
- [URL parameters](#url-parameters-1)
- [Response](#response-2)
- [Errors](#errors-4)
- [`/searchByUser` **(GET)**](#searchbyuser-get)
- [`/search` **(GET)**](#search-get)
- [URL parameters](#url-parameters-2)
- [Response](#response-3)
- [Errors](#errors-5)
- [`/commitPayment` **(POST)**](#commitpayment-post)
- [Request Body](#request-body)
- [`/searchByUser` **(GET)**](#searchbyuser-get)
- [URL parameters](#url-parameters-3)
- [Response](#response-4)
- [Errors](#errors-6)
- [`/commitSettlement/` **(POST)**](#commitsettlement-post)
- [Request Body](#request-body-1)
- [`/commitPayment` **(POST)**](#commitpayment-post)
- [Request Body](#request-body)
- [Response](#response-5)
- [Errors](#errors-7)
- [`/edit/` **(POST)** **(for dev)**](#edit-post-for-dev)
- [POST request form](#post-request-form-1)
- [`/commitSettlement/` **(POST)**](#commitsettlement-post)
- [Request Body](#request-body-1)
- [Response](#response-6)
- [Errors](#errors-8)
- [`/edit/` **(POST)** **(for dev)**](#edit-post-for-dev)
- [POST request form](#post-request-form-1)
- [Response](#response-7)
- [Errors](#errors-9)
- [`/getAllRoom` **(GET)** (for dev)](#getallroom-get-for-dev)
- [`/removeAllRoom` **(GET)** (for dev)](#removeallroom-get-for-dev)
- [`/:id/delete/` **(GET)** **(for dev)**](#iddelete-get-for-dev)
- [URL Parameters](#url-parameters-3)
- [Response](#response-7)
- [Errors](#errors-9)
- [URL Parameters](#url-parameters-4)
- [Response](#response-8)
- [Errors](#errors-10)

## Description

- 방 생성/수정/삭제/조회 기능을 지원하는 API.
- 로그인된 상태에서만 접근 가능
- `/publicInfo`, `/search`를 제외한 endpoint는 로그인된 상태에서만 접근 가능
- Request form에서 요구하는 property 이름에 ? 이 붙은 경우 필수가 아니라는 뜻
- 방을 반환할 경우 그 type은 다음과 같다.

Expand All @@ -77,17 +79,16 @@ Room {
_id: ObjectId, // part의 ObjectId
user: {
_id: ObjectId, // 참여 중인 사용자 Document의 ObjectId
id: String, // 참여 중인 사용자 id
name: String, // 참여 중인 사용자 이름
nickname: String, // 참여 중인 사용자 닉네임
profileImageUrl: String, // 프로필 사진 url
isSettlement: String || undefined, //해당 사용자의 정산 상태 (주의: "/publicInfo"와 "/search"에서는 isSettlement 속성이 undefined로 설정됨).
},
settlementStatus: String, //해당 사용자의 정산 상태 (주의: rooms/search에서는 isSettlement 속성을 반환하지 않고 undefined를 반환함).
}
],
maxPartLength: Number(2~4), //방의 최대 인원 수
madeat: String(ISO 8601), // ex) 방 생성 시각. '2022-01-12T13:58:20.180Z'
settlementTotal: Number(2~4), // 정산이 완료된 사용자 수 (주의: rooms/search에서는 settlementTotal 속성을 반환하지 않고 undefined를 반환함).
settlementTotal: Number(2~4), // 정산이 완료된 사용자 수 (주의: "/publicInfo"와 "/search"에서는 settlementTotal 속성이 undefined로 설정됨).
isOver: Boolean, // 요청을 보낸 사용자가 해당 방의 정산을 완료됐는지 여부(완료 시 true) (주의: rooms/search에서는 isOver 속성을 반환하지 않고 undefined를 반환함).
__v: Number, // 문서 버전. mongoDB 내부적으로 사용됨.
}
Expand All @@ -102,6 +103,24 @@ Room {

## Available endpoints

### `/publicInfo` **(GET)**

ID를 parameter로 받아 해당 ID의 room의 정보 출력

#### URL parameters

- id : 조회할 room의 ID

#### Response

- 해당 방의 정보
- 각 참여자의 isSettlement 속성과 방의 settlementTotal 속성은 undefined로 설정됨.

#### Errors

- 404 "id does not exist"
- 500 "internal server error"

### `/info` **(GET)**

ID를 parameter로 받아 해당 ID의 room의 정보 출력
Expand Down
8 changes: 8 additions & 0 deletions src/routes/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ router.get(
roomHandlers.searchHandler
);

// 특정 id 방의 정산 정보를 제외한 세부사항을 반환한다.
router.get(
"/publicInfo",
query("id").isMongoId(),
validator,
roomHandlers.publicInfoHandler
);

// 이후 API 접근 시 로그인 필요
router.use(require("../middlewares/auth"));

Expand Down
23 changes: 23 additions & 0 deletions src/services/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,28 @@ const createHandler = async (req, res) => {
}
};

const publicInfoHandler = async (req, res) => {
try {
const roomObject = await roomModel
.findOne({ _id: req.query.id })
.lean()
.populate(roomPopulateOption);
if (roomObject) {
// 방의 정산 정보는 개인정보로 방에 참여하기 전까지는 반환하지 않습니다.
res.send(formatSettlement(roomObject, { includeSettlement: false }));
} 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 infoHandler = async (req, res) => {
try {
const user = await userModel.findOne({ id: req.userId });
Expand Down Expand Up @@ -620,6 +642,7 @@ const settlementHandler = async (req, res) => {
// };

module.exports = {
publicInfoHandler,
infoHandler,
createHandler,
joinHandler,
Expand Down
42 changes: 29 additions & 13 deletions test/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const removeTestData = async () => {
await testRemover(testData);
};

// rooms.js 관련 8개의 handler을 테스트
// rooms.js 관련 9개의 handler을 테스트
// 1. test1이 1분 뒤에 출발하는 test-room 방을 생성, 제대로 생성 되었는지 확인
describe("[rooms] 1.createHandler", () => {
it("should create room which departs after 1 minute", async () => {
Expand Down Expand Up @@ -62,8 +62,24 @@ describe("[rooms] 2.infoHandler", () => {
});
});

// 3. test2가 test-room에 join, 방에 잘 join 했는지 확인
describe("[rooms] 3.joinHandler", () => {
// 3. 로그인되지 않은 유저가 방의 정보를 제대로 가져오는지 확인
describe("[rooms] 3.publicInfoHandler", () => {
it("should return information of room", async () => {
const testRoom = await roomModel.findOne({ name: "test-room" });
let req = httpMocks.createRequest({
query: { id: testRoom._id },
});
let res = httpMocks.createResponse();
await roomsHandlers.publicInfoHandler(req, res);

const resData = res._getData();
expect(resData).to.has.property("name", "test-room");
expect(resData).to.has.property("isOver", undefined);
});
});

// 4. test2가 test-room에 join, 방에 잘 join 했는지 확인
describe("[rooms] 4.joinHandler", () => {
it("should return information of room and join", async () => {
const testUser2 = await userGenerator("test2", testData);
const testRoom = await roomModel.findOne({ name: "test-room" });
Expand All @@ -83,8 +99,8 @@ describe("[rooms] 3.joinHandler", () => {
});
});

// 4. 방의 정보를 통해 검색, 검색 정보가 예상과 일치하는지 확인
describe("[rooms] 4.searchHandler", () => {
// 5. 방의 정보를 통해 검색, 검색 정보가 예상과 일치하는지 확인
describe("[rooms] 5.searchHandler", () => {
it("should return information of searching room", async () => {
const testFrom = await locationModel.findOne({ koName: "대전역" });
const testTo = await locationModel.findOne({ koName: "택시승강장" });
Expand All @@ -107,9 +123,9 @@ describe("[rooms] 4.searchHandler", () => {
});
});

// 5. 방에 속한 유저를 통해 검색
// 6. 방에 속한 유저를 통해 검색
// ongoing은 test-room이 검색되고, done은 아무것도 검색되지 않아야함
describe("[rooms] 5.searchByUserHandler", () => {
describe("[rooms] 6.searchByUserHandler", () => {
it("should return information of searching room", async () => {
const testUser1 = await userModel.findOne({ id: "test1" });
let req = httpMocks.createRequest({
Expand All @@ -124,8 +140,8 @@ describe("[rooms] 5.searchByUserHandler", () => {
});
});

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

// 7. 도착 정보를 불러옴. 예상과 같은 정보를 불러오는지 확인
describe("[rooms] 7.settlementHandler", () => {
// 8. 도착 정보를 불러옴. 예상과 같은 정보를 불러오는지 확인
describe("[rooms] 8.settlementHandler", () => {
it("should return information of room and set settlement", async () => {
const testUser2 = await userModel.findOne({ id: "test2" });
const testRoom = await roomModel.findOne({ name: "test-room" });
Expand All @@ -165,8 +181,8 @@ describe("[rooms] 7.settlementHandler", () => {
});
});

// 8. test2 방에서 퇴장, 제대로 방에서 나갔는지 확인하고 생성해준 data 모두 삭제
describe("[rooms] 8.abortHandler", () => {
// 9. test2 방에서 퇴장, 제대로 방에서 나갔는지 확인하고 생성해준 data 모두 삭제
describe("[rooms] 9.abortHandler", () => {
it("should return information of room and abort user", async () => {
const testUser2 = await userModel.findOne({ id: "test2" });
const testRoom = await roomModel.findOne({ name: "test-room" });
Expand Down

0 comments on commit 5f576ed

Please sign in to comment.