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