Skip to content

Commit b42f1fa

Browse files
authored
Merge pull request #198 from PSR-Co/feat/#196-leaveChatRoom
[feat] 채팅방 나가기 API
2 parents be1d964 + 7dfa40b commit b42f1fa

File tree

5 files changed

+56
-8
lines changed

5 files changed

+56
-8
lines changed

src/main/kotlin/com/psr/psr/chat/controller/ChatRoomController.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.psr.psr.chat.controller
33
import com.psr.psr.chat.service.ChatRoomService
44
import com.psr.psr.global.dto.BaseResponse
55
import com.psr.psr.global.jwt.UserAccount
6+
import com.psr.psr.product.dto.request.CreateproductReq
67
import io.swagger.v3.oas.annotations.Operation
78
import io.swagger.v3.oas.annotations.Parameter
89
import io.swagger.v3.oas.annotations.media.Content
@@ -11,6 +12,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse
1112
import io.swagger.v3.oas.annotations.responses.ApiResponses
1213
import io.swagger.v3.oas.annotations.security.SecurityRequirement
1314
import io.swagger.v3.oas.annotations.tags.Tag
15+
import jakarta.validation.Valid
1416
import org.springframework.security.core.annotation.AuthenticationPrincipal
1517
import org.springframework.web.bind.annotation.*
1618

@@ -41,4 +43,26 @@ class ChatRoomController(
4143
): BaseResponse<Unit> {
4244
return BaseResponse(chatRoomService.createChatRoom(userAccount.getUser(), orderId))
4345
}
46+
47+
/**
48+
* 채팅방 나가기
49+
*/
50+
@Operation(summary = "채팅방 나가기(박소정)", description = "채팅방을 나간다.")
51+
@ApiResponses(
52+
value = [
53+
ApiResponse(responseCode = "200", description = "요청에 성공했습니다."),
54+
ApiResponse(
55+
responseCode = "400",
56+
description = "해당 채팅방을 찾을 수 없습니다.",
57+
content = arrayOf(Content(schema = Schema(implementation = BaseResponse::class)))
58+
)]
59+
)
60+
@PatchMapping("/{chatRoomId}")
61+
fun leaveChatRoom(@AuthenticationPrincipal userAccount: UserAccount,
62+
@Parameter(description = "(Long) 채팅방 id", example = "1") @PathVariable chatRoomId: Long
63+
): BaseResponse<Unit> {
64+
return BaseResponse(chatRoomService.leaveChatRoom(userAccount.getUser(), chatRoomId));
65+
}
66+
67+
4468
}

src/main/kotlin/com/psr/psr/chat/entity/ChatRoom.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,23 @@ data class ChatRoom(
1111
var id: Long? = null,
1212

1313
@ManyToOne
14-
@JoinColumn(nullable = false, name = "sender_user_id")
15-
var senderUser: User,
14+
@JoinColumn(nullable = true, name = "sender_user_id")
15+
var senderUser: User?,
1616

1717
@ManyToOne
18-
@JoinColumn(nullable = false, name = "receiver_user_id")
19-
var receiverUser: User,
18+
@JoinColumn(nullable = true, name = "receiver_user_id")
19+
var receiverUser: User?,
2020

2121
@OneToOne
22-
@JoinColumn(nullable = true, name = "order_id")
23-
var order: Order
22+
@JoinColumn(nullable = false, name = "order_id")
23+
var order: Order?
2424

2525
) : BaseEntity() {
26+
fun leave(user: User) {
27+
if (senderUser == user) senderUser = null
28+
if (receiverUser == user) receiverUser = null
29+
}
30+
2631
companion object {
2732
fun toEntity(user: User, order: Order): ChatRoom {
2833
return ChatRoom(

src/main/kotlin/com/psr/psr/chat/repository/ChatRoomRepository.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.psr.psr.chat.repository
22

33
import com.psr.psr.chat.entity.ChatRoom
4+
import com.psr.psr.order.entity.Order
45
import com.psr.psr.user.entity.User
56
import org.springframework.data.jpa.repository.JpaRepository
67
import org.springframework.stereotype.Repository
@@ -9,4 +10,6 @@ import org.springframework.stereotype.Repository
910
interface ChatRoomRepository: JpaRepository<ChatRoom, Long> {
1011
fun deleteBySenderUser(user: User)
1112
fun deleteByReceiverUser(user: User)
13+
fun findByIdAndStatus(chatRoomId: Long, activeStatus: String): ChatRoom?
14+
1215
}

src/main/kotlin/com/psr/psr/chat/service/ChatRoomService.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ class ChatRoomService(
2020
fun createChatRoom(user: User, orderId: Long) {
2121
val order: Order = orderRepository.findByIdAndStatus(orderId, Constant.UserStatus.ACTIVE_STATUS)
2222
?: throw BaseException(BaseResponseCode.NOT_FOUND_ORDER)
23-
chatRoomRepository.save(ChatRoom.toEntity(user, order));
23+
chatRoomRepository.save(ChatRoom.toEntity(user, order))
24+
}
25+
26+
@Transactional
27+
fun leaveChatRoom(user: User, chatRoomId: Long) {
28+
val chatRoom: ChatRoom = chatRoomRepository.findByIdAndStatus(chatRoomId, Constant.UserStatus.ACTIVE_STATUS)
29+
?: throw BaseException(BaseResponseCode.NOT_FOUND_CHATROOM)
30+
chatRoom.leave(user)
31+
checkChatRoom(chatRoom)
32+
}
33+
34+
private fun checkChatRoom(chatRoom: ChatRoom) {
35+
if(chatRoom.senderUser==null && chatRoom.receiverUser==null)
36+
chatRoomRepository.delete(chatRoom)
2437
}
2538
}

src/main/kotlin/com/psr/psr/global/exception/BaseResponseCode.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ enum class BaseResponseCode(status: HttpStatus, message: String) {
7777
// product
7878
NOT_FOUND_PRODUCT(HttpStatus.NOT_FOUND, "해당 상품을 찾을 수 없습니다."),
7979
NULL_PRODUCT_ID(HttpStatus.BAD_REQUEST, "상품ID를 입력해주세요."),
80-
INVALID_PRODUCT_USER(HttpStatus.BAD_REQUEST, "해당 글 작성자가 아닙니다.");
80+
INVALID_PRODUCT_USER(HttpStatus.BAD_REQUEST, "해당 글 작성자가 아닙니다."),
81+
82+
// chatRoom
83+
NOT_FOUND_CHATROOM(HttpStatus.NOT_FOUND, "해당 채팅방을 찾을 수 없습니다.");
8184

8285
val status: HttpStatus = status
8386
val message: String = message

0 commit comments

Comments
 (0)