Skip to content

Commit

Permalink
Merge pull request #519 from sparcs-kaist/#516-blockedlist
Browse files Browse the repository at this point in the history
#516 blockedlist
  • Loading branch information
TaehyeonPark authored May 27, 2024
2 parents ca94c72 + 323c09a commit 2cbdc29
Show file tree
Hide file tree
Showing 5 changed files with 213 additions and 1 deletion.
34 changes: 34 additions & 0 deletions src/modules/stores/mongo.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,39 @@ const userSchema = Schema({
account: { type: String, default: "" }, //계좌번호 정보
});

const banSchema = Schema({
// 정지 시킬 사용자를 기제함.
userId: { type: mongoose.Types.ObjectId, ref: "User", required: true },
// 정지 사유
reason: {
type: String,
required: true,
},
bannedAt: {
type: Date, // 정지 당한 시각
required: true,
},
expireAt: {
type: Date, // 정지 만료 시각
required: true,
},
services: [
{
// 정지를 당한 서비스를 기제함
serviceName: {
type: String,
required: true,
// 필요시 이곳에 정지를 시킬 서비스를 추가함.
enum: [
"all", // all -> 과거/미래 모든 서비스 및 이벤트 이용 제한
"service", // service -> 방 생성/참여 제한
"2023-fall-event", // event -> 특정 이벤트 참여 제한
],
},
},
],
});

const participantSchema = Schema({
user: { type: Schema.Types.ObjectId, ref: "User", required: true },
settlementStatus: {
Expand Down Expand Up @@ -207,6 +240,7 @@ const connectDatabase = (mongoUrl) => {
module.exports = {
connectDatabase,
userModel: mongoose.model("User", userSchema),
banModel: mongoose.model("Ban", banSchema),
deviceTokenModel: mongoose.model("DeviceToken", deviceTokenSchema),
notificationOptionModel: mongoose.model(
"NotificationOption",
Expand Down
2 changes: 2 additions & 0 deletions src/routes/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const AdminJSExpress = require("@adminjs/express");
const AdminJSMongoose = require("@adminjs/mongoose");
const {
userModel,
banModel,
roomModel,
locationModel,
chatModel,
Expand All @@ -26,6 +27,7 @@ AdminJS.registerAdapter(AdminJSMongoose);

const resources = [
userModel,
banModel,
roomModel,
locationModel,
chatModel,
Expand Down
139 changes: 139 additions & 0 deletions src/routes/docs/users.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const tag = "users";
const apiPrefix = "/users";
const { objectId } = require("../../modules/patterns");

const usersDocs = {};
usersDocs[`${apiPrefix}/agreeOnTermsOfService`] = {
Expand Down Expand Up @@ -329,4 +330,142 @@ usersDocs[`${apiPrefix}/resetProfileImg`] = {
},
};

usersDocs[`${apiPrefix}/isBanned`] = {
get: {
tags: [tag],
summary: "본인의 현재 정지 기록을 가져움",
description:
"정지 기록들 중 본인이고, 서버 시간을 기준으로 expireAt 보다 작은 경우에 해당하는 정지 기록을 모두 가져옴",
responses: {
200: {
content: {
"application/json": {
schema: {
type: "array",
items: {
properties: {
userId: {
type: "string",
description: "사용자의 ObjectId",
pattern: objectId.source,
},
reason: {
type: "string",
description: "정지 사유",
example: "미정산",
},
bannedAt: {
type: "date",
description: "정지 당한 시각",
example: "2024-05-20 12:00",
},
expireAt: {
type: "date",
description: "정지 만료 시각",
example: "2024-05-21 12:00",
},
services: {
type: "array",
items: {
properties: {
serviceName: {
type: "string",
description: "정지를 당한 서비스 또는 이벤트 이름",
},
},
},
},
},
},
},
},
},
},
400: {
content: {
"text/html": {
example: "Users/isBanned : there is no ban record",
},
},
},
500: {
content: {
"text/html": {
example: "Users/isBanned : internal server error",
},
},
},
},
},
};

usersDocs[`${apiPrefix}/getBanRecord`] = {
get: {
tags: [tag],
summary: "본인의 모든 정지 기록을 가져움",
description:
"정지 기록들 중 본인인 경우에 해당하는 정지 기록을 모두 가져옴",
responses: {
200: {
content: {
"application/json": {
schema: {
type: "array",
items: {
properties: {
userId: {
type: "string",
description: "사용자의 ObjectId",
pattern: objectId.source,
},
reason: {
type: "string",
description: "정지 사유",
example: "미정산",
},
bannedAt: {
type: "date",
description: "정지 당한 시각",
example: "2024-05-20 12:00",
},
expireAt: {
type: "date",
description: "정지 만료 시각",
example: "2024-05-21 12:00",
},
services: {
type: "array",
items: {
properties: {
serviceName: {
type: "string",
description: "정지를 당한 서비스 또는 이벤트 이름",
},
},
},
},
},
},
},
},
},
},
400: {
content: {
"text/html": {
example: "Users/getBanRecord : there is no ban record",
},
},
},
500: {
content: {
"text/html": {
example: "Users/getBanRecord : internal server error",
},
},
},
},
},
};

module.exports = usersDocs;
6 changes: 6 additions & 0 deletions src/routes/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,10 @@ router.get("/editProfileImg/done", userHandlers.editProfileImgDoneHandler);
// 프로필 이미지를 기본값으로 재설정합니다.
router.get("/resetProfileImg", userHandlers.resetProfileImgHandler);

// 유저의 현재 유효한 서비스 정지 기록들만 반환합니다.
router.get("/isBanned", userHandlers.isBannedHandler);

// 유저의 서비스 정지 기록들을 모두 반환합니다.
router.get("/getBanRecord", userHandlers.getBanRecordHandler);

module.exports = router;
33 changes: 32 additions & 1 deletion src/services/users.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { userModel } = require("../modules/stores/mongo");
const { userModel, banModel } = require("../modules/stores/mongo");
const logger = require("../modules/logger");
const aws = require("../modules/stores/aws");

Expand Down Expand Up @@ -200,6 +200,35 @@ const resetProfileImgHandler = async (req, res) => {
}
};

const isBannedHandler = async (req, res) => {
try {
// 현재 시각이 expireAt 보다 작고 본인인 경우(ban의 userId가 userOid랑 같은 경우)의 record를 모두 가져옴
const result = await banModel.find({
userId: req.userOid,
expireAt: {
$gte: req.timestamp,
},
});
if (!result)
return res.status(500).send("Users/isBanned : internal server error");
res.status(200).json(result);
} catch (err) {
res.status(500).send("Users/isBanned : internal server error");
}
};

const getBanRecordHandler = async (req, res) => {
try {
// 본인인 경우(ban의 userId가 userOid랑 같은 경우)의 record를 모두 가져옴
const result = await banModel.find({ userId: req.userOid });
if (!result)
return res.status(500).send("Users/getBanRecord : internal server error");
res.status(200).json(result);
} catch (err) {
res.status(500).send("Users/getBanRecord : internal server error");
}
};

module.exports = {
agreeOnTermsOfServiceHandler,
getAgreeOnTermsOfServiceHandler,
Expand All @@ -209,4 +238,6 @@ module.exports = {
editProfileImgDoneHandler,
resetNicknameHandler,
resetProfileImgHandler,
isBannedHandler,
getBanRecordHandler,
};

0 comments on commit 2cbdc29

Please sign in to comment.