diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageController.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageController.kt index 53aa0fe..683b6c9 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageController.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageController.kt @@ -1,6 +1,8 @@ package com.back.koreaTravelGuide.domain.userChat.chatmessage.controller import com.back.koreaTravelGuide.common.ApiResponse +import com.back.koreaTravelGuide.domain.userChat.chatmessage.dto.ChatMessageResponse +import com.back.koreaTravelGuide.domain.userChat.chatmessage.dto.ChatMessageSendRequest import com.back.koreaTravelGuide.domain.userChat.chatmessage.service.ChatMessageService import org.springframework.http.ResponseEntity import org.springframework.messaging.simp.SimpMessagingTemplate @@ -23,26 +25,28 @@ class ChatMessageController( @PathVariable roomId: Long, @RequestParam(required = false) after: Long?, @RequestParam(defaultValue = "50") limit: Int, - ): ResponseEntity> { + ): ResponseEntity>> { val messages = if (after == null) { messageService.getlistbefore(roomId, limit) } else { messageService.getlistafter(roomId, after) } - return ResponseEntity.ok(ApiResponse(msg = "메시지 조회", data = messages)) + val responseMessages = messages.map(ChatMessageResponse::from) + return ResponseEntity.ok(ApiResponse(msg = "메시지 조회", data = responseMessages)) } @PostMapping("/{roomId}/messages") fun sendMessage( @PathVariable roomId: Long, - @RequestBody req: ChatMessageService.SendMessageReq, - ): ResponseEntity> { - val saved = messageService.send(roomId, req) + @RequestBody req: ChatMessageSendRequest, + ): ResponseEntity> { + val saved = messageService.send(roomId, req.senderId, req.content) + val response = ChatMessageResponse.from(saved) messagingTemplate.convertAndSend( "/topic/userchat/$roomId", - ApiResponse(msg = "메시지 전송", data = saved), + ApiResponse(msg = "메시지 전송", data = response), ) - return ResponseEntity.status(201).body(ApiResponse(msg = "메시지 전송", data = saved)) + return ResponseEntity.status(201).body(ApiResponse(msg = "메시지 전송", data = response)) } } diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageSocketController.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageSocketController.kt index e977f0c..1f5eb08 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageSocketController.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/controller/ChatMessageSocketController.kt @@ -1,6 +1,8 @@ package com.back.koreaTravelGuide.domain.userChat.chatmessage.controller import com.back.koreaTravelGuide.common.ApiResponse +import com.back.koreaTravelGuide.domain.userChat.chatmessage.dto.ChatMessageResponse +import com.back.koreaTravelGuide.domain.userChat.chatmessage.dto.ChatMessageSendRequest import com.back.koreaTravelGuide.domain.userChat.chatmessage.service.ChatMessageService import org.springframework.messaging.handler.annotation.DestinationVariable import org.springframework.messaging.handler.annotation.MessageMapping @@ -16,12 +18,13 @@ class ChatMessageSocketController( @MessageMapping("/userchat/{roomId}/messages") fun handleMessage( @DestinationVariable roomId: Long, - @Payload req: ChatMessageService.SendMessageReq, + @Payload req: ChatMessageSendRequest, ) { - val saved = chatMessageService.send(roomId, req) + val saved = chatMessageService.send(roomId, req.senderId, req.content) + val response = ChatMessageResponse.from(saved) messagingTemplate.convertAndSend( "/topic/userchat/$roomId", - ApiResponse(msg = "메시지 전송", data = saved), + ApiResponse(msg = "메시지 전송", data = response), ) } } diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageResponse.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageResponse.kt new file mode 100644 index 0000000..97f6468 --- /dev/null +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageResponse.kt @@ -0,0 +1,24 @@ +package com.back.koreaTravelGuide.domain.userChat.chatmessage.dto + +import com.back.koreaTravelGuide.domain.userChat.chatmessage.entity.ChatMessage +import java.time.Instant + +data class ChatMessageResponse( + val id: Long?, + val roomId: Long, + val senderId: Long, + val content: String, + val createdAt: Instant, +) { + companion object { + fun from(message: ChatMessage): ChatMessageResponse { + return ChatMessageResponse( + id = message.id, + roomId = message.roomId, + senderId = message.senderId, + content = message.content, + createdAt = message.createdAt, + ) + } + } +} diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageSendRequest.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageSendRequest.kt new file mode 100644 index 0000000..370535c --- /dev/null +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/dto/ChatMessageSendRequest.kt @@ -0,0 +1,6 @@ +package com.back.koreaTravelGuide.domain.userChat.chatmessage.dto + +data class ChatMessageSendRequest( + val senderId: Long, + val content: String, +) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/service/ChatMessageService.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/service/ChatMessageService.kt index 51574b8..f768dc3 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/service/ChatMessageService.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatmessage/service/ChatMessageService.kt @@ -11,8 +11,6 @@ class ChatMessageService( private val messageRepository: ChatMessageRepository, private val roomRepository: ChatRoomRepository, ) { - data class SendMessageReq(val senderId: Long, val content: String) - @Transactional(readOnly = true) fun getlistbefore( roomId: Long, @@ -28,9 +26,10 @@ class ChatMessageService( @Transactional fun send( roomId: Long, - req: SendMessageReq, + senderId: Long, + content: String, ): ChatMessage { - val saved = messageRepository.save(ChatMessage(roomId = roomId, senderId = req.senderId, content = req.content)) + val saved = messageRepository.save(ChatMessage(roomId = roomId, senderId = senderId, content = content)) roomRepository.findById(roomId).ifPresent { roomRepository.save(it.copy(updatedAt = saved.createdAt, lastMessageId = saved.id)) } diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/controller/ChatRoomController.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/controller/ChatRoomController.kt index 5dda47b..dbe9647 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/controller/ChatRoomController.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/controller/ChatRoomController.kt @@ -1,6 +1,9 @@ package com.back.koreaTravelGuide.domain.userChat.chatroom.controller import com.back.koreaTravelGuide.common.ApiResponse +import com.back.koreaTravelGuide.domain.userChat.chatroom.dto.ChatRoomDeleteRequest +import com.back.koreaTravelGuide.domain.userChat.chatroom.dto.ChatRoomResponse +import com.back.koreaTravelGuide.domain.userChat.chatroom.dto.ChatRoomStartRequest import com.back.koreaTravelGuide.domain.userChat.chatroom.service.ChatRoomService import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.DeleteMapping @@ -16,23 +19,19 @@ import org.springframework.web.bind.annotation.RestController class ChatRoomController( private val roomService: ChatRoomService, ) { - data class StartChatReq(val guideId: Long, val userId: Long) - - data class DeleteChatReq(val userId: Long) - // 같은 페어는 방 재사용 @PostMapping("/start") fun startChat( - @RequestBody req: StartChatReq, - ): ResponseEntity>> { - val roomId = roomService.exceptOneToOneRoom(req.guideId, req.userId).id!! - return ResponseEntity.ok(ApiResponse(msg = "채팅방 시작", data = mapOf("roomId" to roomId))) + @RequestBody req: ChatRoomStartRequest, + ): ResponseEntity> { + val room = roomService.exceptOneToOneRoom(req.guideId, req.userId) + return ResponseEntity.ok(ApiResponse(msg = "채팅방 시작", data = ChatRoomResponse.from(room))) } @DeleteMapping("/{roomId}") fun deleteRoom( @PathVariable roomId: Long, - @RequestBody req: DeleteChatReq, + @RequestBody req: ChatRoomDeleteRequest, ): ResponseEntity> { roomService.deleteByOwner(roomId, req.userId) return ResponseEntity.ok(ApiResponse("채팅방 삭제 완료")) @@ -41,5 +40,8 @@ class ChatRoomController( @GetMapping("/{roomId}") fun get( @PathVariable roomId: Long, - ) = ResponseEntity.ok(ApiResponse(msg = "채팅방 조회", data = roomService.get(roomId))) + ): ResponseEntity> { + val room = roomService.get(roomId) + return ResponseEntity.ok(ApiResponse(msg = "채팅방 조회", data = ChatRoomResponse.from(room))) + } } diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomDeleteRequest.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomDeleteRequest.kt new file mode 100644 index 0000000..b4925c7 --- /dev/null +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomDeleteRequest.kt @@ -0,0 +1,5 @@ +package com.back.koreaTravelGuide.domain.userChat.chatroom.dto + +data class ChatRoomDeleteRequest( + val userId: Long, +) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomResponse.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomResponse.kt new file mode 100644 index 0000000..af1c46b --- /dev/null +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomResponse.kt @@ -0,0 +1,26 @@ +package com.back.koreaTravelGuide.domain.userChat.chatroom.dto + +import com.back.koreaTravelGuide.domain.userChat.chatroom.entity.ChatRoom +import java.time.Instant + +data class ChatRoomResponse( + val id: Long?, + val title: String, + val guideId: Long, + val userId: Long, + val updatedAt: Instant, + val lastMessageId: Long?, +) { + companion object { + fun from(room: ChatRoom): ChatRoomResponse { + return ChatRoomResponse( + id = room.id, + title = room.title, + guideId = room.guideId, + userId = room.userId, + updatedAt = room.updatedAt, + lastMessageId = room.lastMessageId, + ) + } + } +} diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomStartRequest.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomStartRequest.kt new file mode 100644 index 0000000..8337ff9 --- /dev/null +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/userChat/chatroom/dto/ChatRoomStartRequest.kt @@ -0,0 +1,6 @@ +package com.back.koreaTravelGuide.domain.userChat.chatroom.dto + +data class ChatRoomStartRequest( + val guideId: Long, + val userId: Long, +)