Skip to content

Commit

Permalink
Merge branch 'main' into #171-adminjs-version-update
Browse files Browse the repository at this point in the history
  • Loading branch information
14KGun authored Nov 3, 2022
2 parents 451dfba + 1729a89 commit 3d666fb
Show file tree
Hide file tree
Showing 8 changed files with 210 additions and 134 deletions.
4 changes: 2 additions & 2 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ app.use("/admin", require("./src/route/admin"));
app.use(require("./src/middleware/limitRate"));

// 라우터 및 리액트
// /rooms/v2에 요청을 보내는 기존 클라이언트 코드 호환성 유지
app.use("/auth", require("./src/route/auth"));
app.use("/json/logininfo", require("./src/route/logininfo"));
app.use("/users", require("./src/route/users"));
app.use("/rooms/v2", require("./src/route/rooms.v2"));
app.use("/rooms", require("./src/route/rooms.v2"));
app.use(["/rooms/v2", "/rooms"], require("./src/route/rooms"));
app.use("/chats", require("./src/route/chats"));
app.use("/locations", require("./src/route/locations"));
app.use("/reports", require("./src/route/reports"));
Expand Down
4 changes: 2 additions & 2 deletions src/db/mongo.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ const userSchema = Schema({
nickname: { type: String, required: true }, //닉네임
id: { type: String, required: true, unique: true }, //택시 서비스에서만 사용되는 id
profileImageUrl: { type: String, required: true }, //백엔드에서의 프로필 이미지 경로
room: [{ type: Schema.Types.ObjectId, ref: "Room" }], //참여중인 방 배열
ongoingRoom: [{ type: Schema.Types.ObjectId, ref: "Room" }], // 참여중인 진행중인 방 배열
doneRoom: [{ type: Schema.Types.ObjectId, ref: "Room" }], // 참여중인 완료된 방 배열
withdraw: { type: Boolean, default: false },
ban: { type: Boolean, default: false }, //계정 정지 여부
joinat: { type: Date, required: true }, //가입 시각
Expand Down Expand Up @@ -49,7 +50,6 @@ const roomSchema = Schema({
}, // 참여 멤버 및 정산 여부
madeat: { type: Date, required: true }, // 생성 날짜
settlementTotal: { type: Number, default: 0, required: true },
isOver: { type: Boolean, default: false, required: true },
maxPartLength: { type: Number, require: true, default: 4 },
});

Expand Down
72 changes: 72 additions & 0 deletions src/db/rooms.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* 쿼리를 통해 얻은 Room Document를 populate할 설정값을 정의합니다.
* @constant {{path: string, select: string, populate?: {path: string, select: string}}[]}
*/
const roomPopulateOption = [
{ path: "from", select: "_id koName enName" },
{ path: "to", select: "_id koName enName" },
{
path: "part",
select: "-_id user settlementStatus",
populate: { path: "user", select: "_id id name nickname profileImageUrl" },
},
];

/**
* Room Object가 주어졌을 때 room의 part array의 각 요소를 API 명세에서와 같이 {userId: String, ... , settlementStatus: String}으로 가공합니다.
* 또한, 방이 현재 출발했는지 유무인 isDeparted 속성을 추가합니다.
* @param {Object} roomObject - 정산 정보를 가공할 room Object로, Mongoose Document가 아닌 순수 Javascript Object여야 합니다.
* @param {Object} options - 추가 파라미터로, 기본값은 {}입니다.
* @param {Boolean} options.includeSettlement - 반환 결과에 정산 정보를 포함할 지 여부로, 기본값은 true입니다.
* @param {Date} options.timestamp - 방의 출발 여부(isDeparted)를 판단하는 기준이 되는 시각입니다.
* @param {Boolean} options.isOver - 방의 완료 여부(isOver)로, 기본값은 false입니다. includeSettlement가 false인 경우 roomDocument의 isOver 속성은 undefined로 설정됩니다.
* @return {Object} 정산 여부가 위와 같이 가공되고 isDeparted 속성이 추가된 Room Object가 반환됩니다.
*/
const formatSettlement = (
roomObject,
{ includeSettlement = true, isOver = false, timestamp = Date.now() } = {}
) => {
roomObject.part = roomObject.part.map((participantSubDocument) => {
const { _id, name, nickname, profileImageUrl } =
participantSubDocument.user;
const { settlementStatus } = participantSubDocument;
return {
_id,
name,
nickname,
profileImageUrl,
isSettlement: includeSettlement ? settlementStatus : undefined,
};
});
roomObject.settlementTotal = includeSettlement
? roomObject.settlementTotal
: undefined;
roomObject.isOver = includeSettlement ? isOver : undefined;
roomObject.isDeparted = new Date(roomObject.time) < new Date(timestamp);
return roomObject;
};

/**
* formatSettlement 함수를 사용하여 변환한 Room Object와 사용자의 id(userId)가 주어졌을 때, 해당 사용자의 정산 상태를 반환합니다.
* @param {Object} roomObject - formatSettlement 함수를 사용하여 변환한 Room Object입니다.
* @param {String} userId - 방 완료 상태를 확인하려는 사용자의 id(user.id)입니다.
* @return {Boolean | undefined} 사용자의 해당 방에 대한 완료 여부(true | false)를 반환합니다. 사용자가 참여중인 방이 아닐 경우 undefined를 반환합니다.
**/
const getIsOver = (roomObject, userId) => {
// room document의 part subdoocument에서 사용자 id와 일치하는 정산 정보를 찾습니다.
const participantSubDocuments = roomObject.part.filter((part) => {
return part.user.id === userId;
});

// 방에 참여중이지 않은 사용자의 경우, undefined을 반환합니다.
if (participantSubDocuments.length === 0) return undefined;

// 방에 참여중인 사용자의 경우, 정산 상태가 완료된 것인지("paid"거나 "sent"인지)를 반환합니다.
return ["paid", "sent"].includes(participantSubDocuments[0].settlementStatus);
};

module.exports = {
roomPopulateOption,
formatSettlement,
getIsOver,
};
4 changes: 2 additions & 2 deletions src/modules/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ const logger = createLogger({
],
});

// If the environment is development, the log is also recorded on console
if (nodeEnv === "development") {
// If the environment is not production, the log is also recorded on console
if (nodeEnv !== "production") {
logger.add(
new transports.Console({
format: format.combine(
Expand Down
12 changes: 7 additions & 5 deletions src/route/docs/rooms.v2.md → src/route/docs/rooms.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# `/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)
- [`/info` **(GET)**](#info-get)
- [URL parameters](#url-parameters)
- [Response](#response)
- [Errors](#errors)
Expand Down Expand Up @@ -86,7 +88,7 @@ Room {
maxPartLength: Number(2~4), //방의 최대 인원 수
madeat: String(ISO 8601), // ex) 방 생성 시각. '2022-01-12T13:58:20.180Z'
settlementTotal: Number(2~4), // 정산이 완료된 사용자 수 (주의: rooms/search에서는 settlementTotal 속성을 반환하지 않고 undefined를 반환함).
isOver: Boolean, // 해당 방의 정산이 완료됐는지 여부(완료 시 true) (주의: rooms/search에서는 isOver 속성을 반환하지 않고 undefined를 반환함).
isOver: Boolean, // 요청을 보낸 사용자가 해당 방의 정산을 완료됐는지 여부(완료 시 true) (주의: rooms/search에서는 isOver 속성을 반환하지 않고 undefined를 반환함).
__v: Number, // 문서 버전. mongoDB 내부적으로 사용됨.
}
```
Expand Down Expand Up @@ -232,8 +234,8 @@ room의 ID를 받아 해당 room의 참가자 목록에서 요청을 보낸 사

```javascript
{
ongoing: [Room], // 정산이 완료되지 않은 방 (방의 isDone 속성이 false인 방)
done: [Room], // 정산이 완료된 방 (방의 isDone 속성이 true인 방)
ongoing: [Room], // 정산이 완료되지 않은 방 (방의 isOver 속성이 false인 방)
done: [Room], // 정산이 완료된 방 (방의 isOver 속성이 true인 방)
}
```

Expand Down Expand Up @@ -269,7 +271,7 @@ room의 ID를 받아 해당 room의 참가자 목록에서 요청을 보낸 사

- ID를 받아 해당 방에 요청을 보낸 유저의 정산을 완료로 처리
- 방의 part 배열에서 요청을 보낸 유저의 isSettlement 속성을 `send-required`에서 `"sent"`로 변경함.
- 방에 참여한 멤버들이 모두 정산완료를 하면 방의 `isDone` 속성이 `true`로 변경되며, 과거 방으로 취급됨
- 방에 참여한 멤버들이 모두 정산완료를 하면 방의 `isOver` 속성이 `true`로 변경되며, 과거 방으로 취급됨

#### Request Body

Expand Down
8 changes: 2 additions & 6 deletions src/route/rooms.v2.js → src/route/rooms.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
// ########################################################
// ############# Version 2 ROUTER FROM HERE #################
// ########################################################

const express = require("express");
const { query, param, body } = require("express-validator");
const { query, body } = require("express-validator");
const router = express.Router();

const roomHandlers = require("../service/rooms.v2");
const roomHandlers = require("../service/rooms");
const validator = require("../middleware/validator");
const patterns = require("../db/patterns");
const setTimestamp = require("../middleware/setTimestamp");
Expand Down
7 changes: 6 additions & 1 deletion src/service/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const client = new Client(security.sparcssso?.id, security.sparcssso?.key);

const transUserData = (userData) => {
const kaistInfo = userData.kaist_info ? JSON.parse(userData.kaist_info) : {};
const allowedEmployeeTypes = ["P", "S", "ES"]; // P: 교수, S: 학생, ES: 교직원인 학생
const info = {
id: userData.uid,
sid: userData.sid,
Expand All @@ -22,6 +23,7 @@ const transUserData = (userData) => {
kaist: kaistInfo?.ku_std_no || "",
sparcs: userData.sparcs_id || "",
email: userData.email,
isEligible: allowedEmployeeTypes.includes(kaistInfo?.employeeType), // 카이스트 구성원인지 여부. DB에 저장하지 않음.
};
return info;
};
Expand Down Expand Up @@ -94,7 +96,10 @@ const sparcsssoCallbackHandler = (req, res) => {
const code = req.body.code || req.query.code;
client.getUserInfo(code).then((userDataBefore) => {
const userData = transUserData(userDataBefore);
loginDone(req, res, userData);
// 로그인 시마다 사용자가 KAIST 구성원인지 검증함.
if (userData.isEligible || security.nodeEnv !== "production")
loginDone(req, res, userData);
else loginFalse(req, res);
});
}
};
Expand Down
Loading

0 comments on commit 3d666fb

Please sign in to comment.