Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -23,26 +25,28 @@ class ChatMessageController(
@PathVariable roomId: Long,
@RequestParam(required = false) after: Long?,
@RequestParam(defaultValue = "50") limit: Int,
): ResponseEntity<ApiResponse<Any>> {
): ResponseEntity<ApiResponse<List<ChatMessageResponse>>> {
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<ApiResponse<Any>> {
val saved = messageService.send(roomId, req)
@RequestBody req: ChatMessageSendRequest,
): ResponseEntity<ApiResponse<ChatMessageResponse>> {
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))
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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),
)
}
}
Original file line number Diff line number Diff line change
@@ -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,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.back.koreaTravelGuide.domain.userChat.chatmessage.dto

data class ChatMessageSendRequest(
val senderId: Long,
val content: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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))
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<ApiResponse<Map<String, Long>>> {
val roomId = roomService.exceptOneToOneRoom(req.guideId, req.userId).id!!
return ResponseEntity.ok(ApiResponse(msg = "채팅방 시작", data = mapOf("roomId" to roomId)))
@RequestBody req: ChatRoomStartRequest,
): ResponseEntity<ApiResponse<ChatRoomResponse>> {
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<ApiResponse<Unit>> {
roomService.deleteByOwner(roomId, req.userId)
return ResponseEntity.ok(ApiResponse("채팅방 삭제 완료"))
Expand All @@ -41,5 +40,8 @@ class ChatRoomController(
@GetMapping("/{roomId}")
fun get(
@PathVariable roomId: Long,
) = ResponseEntity.ok(ApiResponse(msg = "채팅방 조회", data = roomService.get(roomId)))
): ResponseEntity<ApiResponse<ChatRoomResponse>> {
val room = roomService.get(roomId)
return ResponseEntity.ok(ApiResponse(msg = "채팅방 조회", data = ChatRoomResponse.from(room)))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.back.koreaTravelGuide.domain.userChat.chatroom.dto

data class ChatRoomDeleteRequest(
val userId: Long,
)
Original file line number Diff line number Diff line change
@@ -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,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.back.koreaTravelGuide.domain.userChat.chatroom.dto

data class ChatRoomStartRequest(
val guideId: Long,
val userId: Long,
)