From fc0d45aa53b57fb34175883feb98d056a18bc8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EB=8C=80=ED=9D=AC?= <joedaehui@ajou.ac.kr> Date: Mon, 25 Nov 2024 22:01:32 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20meeting=20pagination=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/meetingController.js | 27 ++++++++++++++----- services/meetingService.js | 46 ++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/controllers/meetingController.js b/controllers/meetingController.js index d85e788..4363b41 100644 --- a/controllers/meetingController.js +++ b/controllers/meetingController.js @@ -21,9 +21,9 @@ class MeetingController { async createMeeting(req, res) { try { const userId = req.user.id; - const meetingData = { - ...req.body, - created_by: userId + const meetingData = { + ...req.body, + created_by: userId }; const createMeetingDTO = new CreateMeetingRequestDTO(meetingData); createMeetingDTO.validate(); @@ -43,8 +43,23 @@ class MeetingController { async getMeetings(req, res) { try { const userId = req.user.id; // 인증 미들웨어를 통해 설정된 사용자 ID - const meetings = await MeetingService.getMeetings(userId); - res.status(200).json(meetings); + const page = parseInt(req.query.page) || 0; + const size = parseInt(req.query.size) || 20; + + const meetings = await MeetingService.getMeetings(userId, { + limit: size, + offset: page * size + }); + + res.status(200).json({ + success: true, + data: { + content: meetings.content, + page: page, + size: size, + hasNext: meetings.hasNext + } + }); } catch (err) { console.error('모임 목록 조회 오류:', err); res.status(500).json({ error: err.message || '모임 목록 조회 실패' }); @@ -77,7 +92,7 @@ class MeetingController { const userId = req.user.id; // 인증 미들웨어를 통해 설정된 사용자 ID await MeetingService.joinMeeting(meetingId, userId); - + res.status(200).json({ message: '모임 및 채팅방 참가 완료' }); } catch (err) { console.error('모임 참가 오류:', err); diff --git a/services/meetingService.js b/services/meetingService.js index befefae..bbc157f 100644 --- a/services/meetingService.js +++ b/services/meetingService.js @@ -281,7 +281,9 @@ class MeetingService { } - async getMeetings(userId) { + async getMeetings(userId, pagination) { + const { limit = 20, offset = 0 } = pagination; + const meetings = await Meeting.findAll({ attributes: [ 'id', @@ -307,26 +309,36 @@ class MeetingService { as: 'creator', attributes: ['name'], } - ] + ], + order: [['createdAt', 'DESC']], + offset }); - return Promise.all(meetings.map(async (meeting) => { - const isParticipant = await MeetingParticipant.findOne({ - where: { - meeting_id: meeting.id, - user_id: userId - } - }); + const hasNext = meetings.length > limit; + const content = await Promise.all( + meetings.slice(0, limit).map(async (meeting) => { + const isParticipant = await MeetingParticipant.findOne({ + where: { + meeting_id: meeting.id, + user_id: userId + } + }); - const hasConflict = await ScheduleService.checkScheduleOverlapByTime( - userId, - meeting.time_idx_start, - meeting.time_idx_end - ); + const hasConflict = await ScheduleService.checkScheduleOverlapByTime( + userId, + meeting.time_idx_start, + meeting.time_idx_end + ); + + const creatorName = meeting.creator ? meeting.creator.name : 'Unknown'; + return new MeetingResponseDTO(meeting, !!isParticipant, hasConflict, creatorName); + }) + ); - const creatorName = meeting.creator ? meeting.creator.name : 'Unknown'; - return new MeetingResponseDTO(meeting, !!isParticipant, hasConflict, creatorName); - })); + return { + content, + hasNext + }; } -- GitLab