From e5fe4936892fddd0f5565762be3b27c73d70c975 Mon Sep 17 00:00:00 2001 From: HyungWookChoi Date: Fri, 15 Dec 2023 18:14:38 +0900 Subject: [PATCH] =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=A7=84=ED=96=89=20?= =?UTF-8?q?=EC=A4=91=EC=9D=B8=20=EC=B1=8C=EB=A6=B0=EC=A7=80=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/challengeController.js | 20 ++++++++++++++++++++ models/challengeModel.js | 12 ++++++++++++ routes/challengeRouter.js | 23 +++++++++++++++++++++++ services/challengeService.js | 18 ++++++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/controllers/challengeController.js b/controllers/challengeController.js index 02495cb..7664956 100644 --- a/controllers/challengeController.js +++ b/controllers/challengeController.js @@ -189,6 +189,26 @@ const challengeController = { }); } }, + + getChallenges: async (req, res) => { + const memberId = getUserIdFromJwt(req.headers.authorization); + + const result = await challengeService.getChallenges(memberId); + + if (result.success) { + return res.status(200).json({ + success: true, + message: '챌린지 조회 요청에 성공했습니다.', + data: result.data, + }); + } else { + return res.status(400).json({ + success: false, + message: '챌린지 조회 요청에 실패했습니다.', + err: result.err.message, + }); + } + }, }; module.exports = { diff --git a/models/challengeModel.js b/models/challengeModel.js index 4d14837..07437ed 100644 --- a/models/challengeModel.js +++ b/models/challengeModel.js @@ -43,6 +43,18 @@ const challengeModel = { const [rows, fields] = await connection.query('SELECT * FROM challenge WHERE id = ?', [challengeId]); return rows; }, + + findChallengesByMemberId: async ({ memberId }) => { + const connection = await pool.getConnection(); + + // 현재 진행 중인 챌린지 전체 조회 (status: PROGRESS) + const [rows, fields] = await connection.query( + 'SELECT * FROM challenge WHERE id IN (SELECT challenge_id FROM challenge_participant WHERE member_id = ?) AND challenge_status = "PROGRESS"', + [memberId] + ); + + return rows; + }, }; module.exports = { diff --git a/routes/challengeRouter.js b/routes/challengeRouter.js index 2b7e3ea..554f084 100644 --- a/routes/challengeRouter.js +++ b/routes/challengeRouter.js @@ -111,6 +111,29 @@ router.post('/', challengeController.createChallenge); */ router.post('/approve', challengeController.approveChallenge); +/** + * @swagger + * paths: + * /api/challenges: + * get: + * tags: [Challenges] + * summary: "유저의 현재 진행 중인 챌린지 전체 조회" + * description: "유저의 현재 진행 중인 챌린지 전체 조회" + * responses: + * "200": + * description: "챌린지 조회 요청에 성공했습니다." + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * message: + * type: string + */ +router.get('/', challengeController.getUpcomingChallenge); + /** * @swagger * paths: diff --git a/services/challengeService.js b/services/challengeService.js index 1ff545f..d35affe 100644 --- a/services/challengeService.js +++ b/services/challengeService.js @@ -160,6 +160,24 @@ const challengeService = { }; } }, + + getChallenges: async ({ memberId }) => { + try { + const result = await challengeModel.findChallengesByMemberId({ + memberId, + }); + + return { + success: true, + data: result, + }; + } catch (err) { + return { + success: false, + err, + }; + } + }, }; module.exports = {