From c089671262e1c7fac47018181f0fc0895019b2da 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: Tue, 26 Nov 2024 15:12:23 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AF=B8=ED=8C=85=20=ED=83=88=ED=87=B4?=
 =?UTF-8?q?=ED=95=98=EA=B8=B0=20(#19)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 services/meetingService.js | 77 ++++++++++++++++++++++++++++++--------
 1 file changed, 61 insertions(+), 16 deletions(-)

diff --git a/services/meetingService.js b/services/meetingService.js
index b529db0..5cfe533 100644
--- a/services/meetingService.js
+++ b/services/meetingService.js
@@ -407,22 +407,6 @@ class MeetingService {
         };
     }
 
-    
-
-  
-    async closeMeeting(meetingId) {
-        const meeting = await Meeting.findByPk(meetingId);
-        if (!meeting) {
-            throw new Error('모임을 찾을 수 없습니다.');
-        }
-        if (meeting.type === 'CLOSE') {
-            throw new Error('이미 마감된 모임입니다.');
-        }
-        meeting.type = 'CLOSE';
-        await meeting.save();
-        return meeting;
-    }
-    
     async getMeetingDetail(meetingId, userId) {
         const meeting = await Meeting.findByPk(meetingId, {
             include: [
@@ -530,6 +514,67 @@ class MeetingService {
         // 저장
         chatRoom.save();
     }
+    
+    async leaveMeeting(meetingId, userId) {
+        const meeting = await Meeting.findByPk(meetingId);
+        if (!meeting) {
+            throw new Error('모임을 찾을 수 없습니다.');
+        }
+    
+        await sequelize.transaction(async (transaction) => {
+            // 참가자 확인
+            const participant = await MeetingParticipant.findOne({
+                where: {
+                    meeting_id: meetingId,
+                    user_id: userId
+                },
+                transaction
+            });
+    
+            if (!participant) {
+                throw new Error('참가하지 않은 모임입니다.');
+            }
+    
+            // 생성자는 탈퇴할 수 없음
+            if (meeting.created_by === userId) {
+                throw new Error('모임 생성자는 탈퇴할 수 없습니다.');
+            }
+    
+            // 참가자 제거
+            await MeetingParticipant.destroy({
+                where: {
+                    meeting_id: meetingId,
+                    user_id: userId
+                },
+                transaction
+            });
+    
+            // 관련 스케줄 삭제
+            await Schedule.destroy({
+                where: {
+                    user_id: userId,
+                    title: `번개 모임: ${meeting.title}`,
+                    time_idx: {
+                        [Op.between]: [meeting.time_idx_start, meeting.time_idx_end]
+                    }
+                },
+                transaction
+            });
+    
+            // 채팅방에서 제거
+            const chatRoom = await ChatRooms.findOne({
+                chatRoomId: meeting.chatRoomId
+            });
+            if (chatRoom) {
+                const user = await User.findByPk(userId);
+                chatRoom.participants = chatRoom.participants.filter(p => p !== user.name);
+                await chatRoom.save();
+            }
+    
+            // 현재 인원 수 감소
+            await meeting.decrement('cur_num', { by: 1, transaction });
+        });
+    }
 }
 
 module.exports = new MeetingService();
\ No newline at end of file
-- 
GitLab