From eb34e666acfcc62f56a4e5e08217074af400a85f Mon Sep 17 00:00:00 2001 From: cokia Date: Tue, 12 Nov 2024 22:04:31 +0900 Subject: [PATCH] feat: add notice --- app.js | 1 + src/modules/stores/mongo.js | 13 ++++++++++ src/routes/docs/notice.js | 43 ++++++++++++++++++++++++++++++++++ src/routes/docs/swaggerDocs.js | 6 +++++ src/routes/notice.js | 9 +++++++ src/services/notice.js | 24 +++++++++++++++++++ 6 files changed, 96 insertions(+) create mode 100644 src/routes/docs/notice.js create mode 100644 src/routes/notice.js create mode 100644 src/services/notice.js diff --git a/app.js b/app.js index 74035415..05c815cd 100644 --- a/app.js +++ b/app.js @@ -70,6 +70,7 @@ app.use("/locations", require("./src/routes/locations")); app.use("/reports", require("./src/routes/reports")); app.use("/notifications", require("./src/routes/notifications")); app.use("/fare", require("./src/routes/fare")); +app.use("/notice", require("./src/routes/notice")); // [Middleware] 전역 에러 핸들러. 에러 핸들러는 router들보다 아래에 등록되어야 합니다. app.use(require("./src/middlewares/errorHandler")); diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index f236b829..666c2623 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -204,6 +204,18 @@ const taxiFareSchema = Schema( } ); +const noticeSchema = Schema( + { + title: { type: String, required: true }, + notion_url: { type: String, required: true }, + is_pinned: { type: Boolean, default: false }, + is_active: { type: Boolean, default: true }, + }, + { + timestamps: true, // 최근 업데이트 시간 기록용 + } +); + mongoose.set("strictQuery", true); const database = mongoose.connection; @@ -259,4 +271,5 @@ module.exports = { ), adminLogModel: mongoose.model("AdminLog", adminLogSchema), taxiFareModel: mongoose.model("TaxiFare", taxiFareSchema), + noticeModel: mongoose.model("Notice", noticeSchema), }; diff --git a/src/routes/docs/notice.js b/src/routes/docs/notice.js new file mode 100644 index 00000000..97f0ec56 --- /dev/null +++ b/src/routes/docs/notice.js @@ -0,0 +1,43 @@ +const { objectIdPattern } = require("./utils"); + +const tag = "notice"; +const apiPrefix = "/notice"; + +const noticeDocs = {}; + +noticeDocs[`${apiPrefix}/list`] = { + get: { + tags: [tag], + summary: "공지사항 목록 반환", + description: "공지사항의 목록을 반환합니다.", + responses: { + 200: { + description: "예상 택시 요금 반환 성공", + content: { + "application/json": { + schema: { + type: "object", + properties: { + _id: { type: "string", pattern: objectIdPattern }, + title: { type: "string", pattern: objectIdPattern }, + is_pinned: { type: "boolean" }, + is_active: { type: "boolean" }, + createdAt: { type: "boolean" }, + }, + }, + }, + }, + }, + 500: { + description: "notice/list: Failed to load notices", + content: { + "text/html": { + example: "notice/list: Failed to load notices", + }, + }, + }, + }, + }, +}; + +module.exports = noticeDocs; diff --git a/src/routes/docs/swaggerDocs.js b/src/routes/docs/swaggerDocs.js index e1f1090b..582faf11 100644 --- a/src/routes/docs/swaggerDocs.js +++ b/src/routes/docs/swaggerDocs.js @@ -11,6 +11,7 @@ const usersDocs = require("./users"); const roomsDocs = require("./rooms"); const chatsDocs = require("./chats"); const fareDocs = require("./fare"); +const noticeDocs = require("./notice"); const { port, nodeEnv } = require("../../../loadenv"); const serverList = [ @@ -75,6 +76,10 @@ const swaggerDocs = { name: "fare", description: "예상 택시 금액 계산", }, + { + name: "notice", + description: "공지사항 조회", + }, ], consumes: ["application/json"], produces: ["application/json"], @@ -88,6 +93,7 @@ const swaggerDocs = { ...chatsDocs, ...roomsDocs, ...fareDocs, + ...noticeDocs, }, components: { schemas: { diff --git a/src/routes/notice.js b/src/routes/notice.js new file mode 100644 index 00000000..1261163e --- /dev/null +++ b/src/routes/notice.js @@ -0,0 +1,9 @@ +const express = require("express"); + +const { getNotices } = require("../services/notice"); + +const router = express.Router(); + +router.get("/list", getNotices); + +module.exports = router; diff --git a/src/services/notice.js b/src/services/notice.js new file mode 100644 index 00000000..904109e8 --- /dev/null +++ b/src/services/notice.js @@ -0,0 +1,24 @@ +const { noticeModel } = require("../modules/stores/mongo"); + +const getNotices = async (req, res) => { + try { + const pinnedNotice = await noticeModel.findOne({ + is_active: true, + is_pinned: true, + }); + const notices = await noticeModel.find({ + is_active: true, + is_pinned: false, + }); + if (pinnedNotice) { + return res.status(200).json({ notices: [pinnedNotice, ...notices] }); + } + return res.status(200).json({ notices }); + } catch (e) { + return res.status(500).send("notice/list: Failed to load notices"); + } +}; + +module.exports = { + getNotices, +};