diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/CharacterChatParticipant.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/CharacterChatParticipant.kt index 60e1d2c..fdfc436 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/CharacterChatParticipant.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/CharacterChatParticipant.kt @@ -29,7 +29,7 @@ class CharacterChatParticipant( @JoinColumn(name = "character_id") val character: ChatCharacter? = null, - val isActive: Boolean = true + var isActive: Boolean = true ) : BaseEntity() { @OneToMany(mappedBy = "participant", cascade = [CascadeType.ALL], fetch = FetchType.LAZY) val messages: MutableList = mutableListOf() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/controller/ChatRoomController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/controller/ChatRoomController.kt index d36aa54..1a02229 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/controller/ChatRoomController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/controller/ChatRoomController.kt @@ -78,4 +78,23 @@ class ChatRoomController( val isActive = chatRoomService.isMyRoomSessionActive(member, chatRoomId) ApiResponse.ok(isActive) } + + /** + * 채팅방 나가기 API + * - URL에 chatRoomId 포함 + * - 내가 참여 중인지 확인 (아니면 "잘못된 접근입니다") + * - 내 참여자 isActive=false 처리 + * - 내가 마지막 USER였다면 외부 API로 세션 종료 호출 + */ + @PostMapping("/{chatRoomId}/leave") + fun leaveChatRoom( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + @PathVariable chatRoomId: Long + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + if (member.auth == null) throw SodaException("본인인증을 하셔야 합니다.") + + chatRoomService.leaveChatRoom(member, chatRoomId) + ApiResponse.ok(true) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/repository/CharacterChatParticipantRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/repository/CharacterChatParticipantRepository.kt index 77b2a5b..edd5e60 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/repository/CharacterChatParticipantRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/repository/CharacterChatParticipantRepository.kt @@ -1,8 +1,8 @@ package kr.co.vividnext.sodalive.chat.room.repository -import kr.co.vividnext.sodalive.chat.character.ChatCharacter import kr.co.vividnext.sodalive.chat.room.CharacterChatParticipant import kr.co.vividnext.sodalive.chat.room.CharacterChatRoom +import kr.co.vividnext.sodalive.chat.room.ParticipantType import kr.co.vividnext.sodalive.member.Member import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository @@ -12,10 +12,6 @@ interface CharacterChatParticipantRepository : JpaRepository