From 5c8ceb8bf649052e9833d50376b7fbf03ffb87e2 Mon Sep 17 00:00:00 2001 From: kpeel Date: Tue, 6 May 2025 14:58:19 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20read=20=EC=B2=98=EB=A6=AC=20API=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/v2/ReadMessageV2Controller.kt | 24 +++++++++++++++++++ .../dto/response/MessageV2DetailsResponse.kt | 2 ++ .../message/port/in/ReadMessageV2UseCase.kt | 7 ++++++ .../service/v2/ReadMessageV2Service.kt | 24 +++++++++++++++++++ .../com/wespot/message/v2/MessageDetail.kt | 2 ++ .../kotlin/com/wespot/message/v2/MessageV2.kt | 17 +++++++++++-- 6 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/wespot/message/v2/ReadMessageV2Controller.kt create mode 100644 core/src/main/kotlin/com/wespot/message/port/in/ReadMessageV2UseCase.kt create mode 100644 core/src/main/kotlin/com/wespot/message/service/v2/ReadMessageV2Service.kt diff --git a/app/src/main/kotlin/com/wespot/message/v2/ReadMessageV2Controller.kt b/app/src/main/kotlin/com/wespot/message/v2/ReadMessageV2Controller.kt new file mode 100644 index 00000000..e0a60b20 --- /dev/null +++ b/app/src/main/kotlin/com/wespot/message/v2/ReadMessageV2Controller.kt @@ -0,0 +1,24 @@ +package com.wespot.message.v2 + +import com.wespot.message.port.`in`.ReadMessageV2UseCase +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/api/v2/messages") +class ReadMessageV2Controller( + private val readMessageV2UseCase: ReadMessageV2UseCase, +) { + + @PatchMapping("/{messageId}/read") + fun readMessage(@PathVariable messageId: Long): ResponseEntity { + readMessageV2UseCase.readMessage(messageId) + + return ResponseEntity.noContent() + .build() + } + +} diff --git a/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2DetailsResponse.kt b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2DetailsResponse.kt index e213590f..835d83ce 100644 --- a/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2DetailsResponse.kt +++ b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2DetailsResponse.kt @@ -17,6 +17,7 @@ data class MessageV2DetailsResponse( val content: String, val isReceived: Boolean, val isSend: Boolean, + val isRead: Boolean, val isAbleToAnswer: Boolean = false, ) { @@ -28,6 +29,7 @@ data class MessageV2DetailsResponse( content = message.message.content.content, isReceived = message.isReceived, isSend = message.isSend, + isRead = message.isRead, isAbleToAnswer = message.isAbleToAnswer, ) } diff --git a/core/src/main/kotlin/com/wespot/message/port/in/ReadMessageV2UseCase.kt b/core/src/main/kotlin/com/wespot/message/port/in/ReadMessageV2UseCase.kt new file mode 100644 index 00000000..c3d5ec74 --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/port/in/ReadMessageV2UseCase.kt @@ -0,0 +1,7 @@ +package com.wespot.message.port.`in` + +interface ReadMessageV2UseCase { + + fun readMessage(messageId: Long) + +} diff --git a/core/src/main/kotlin/com/wespot/message/service/v2/ReadMessageV2Service.kt b/core/src/main/kotlin/com/wespot/message/service/v2/ReadMessageV2Service.kt new file mode 100644 index 00000000..a02eb521 --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/service/v2/ReadMessageV2Service.kt @@ -0,0 +1,24 @@ +package com.wespot.message.service.v2 + +import com.wespot.auth.service.SecurityUtils +import com.wespot.message.port.`in`.ReadMessageV2UseCase +import com.wespot.message.port.out.MessageV2Port +import com.wespot.user.port.out.UserPort +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +class ReadMessageV2Service( + private val userPort: UserPort, + private val messageV2Port: MessageV2Port +) : ReadMessageV2UseCase { + + @Transactional + override fun readMessage(messageId: Long) { + val loginUser = SecurityUtils.getLoginUser(userPort = userPort) + val message = messageV2Port.findById(id = messageId) + message.read(viewer = loginUser) + messageV2Port.save(messageV2 = message) + } + +} diff --git a/domain/src/main/kotlin/com/wespot/message/v2/MessageDetail.kt b/domain/src/main/kotlin/com/wespot/message/v2/MessageDetail.kt index daf7ecd3..9f82a1ea 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/MessageDetail.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/MessageDetail.kt @@ -11,6 +11,7 @@ data class MessageDetail( val isReceived: Boolean, val isSend: Boolean, val isAbleToAnswer: Boolean, + val isRead: Boolean, val message: MessageV2 ) { @@ -21,6 +22,7 @@ data class MessageDetail( isReceived = message.isReceived(viewer = viewer), isSend = message.isSent(viewer = viewer), isAbleToAnswer = if (isLatestMessage) message.isAbleToAnswer(viewer = viewer) else false, + isRead = message.isRead(viewer = viewer), message = message ) } diff --git a/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt b/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt index 38fc0c21..6d0db5db 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt @@ -16,8 +16,8 @@ data class MessageV2( val content: MessageContent, val sender: User, val receiver: User, - val isReceiverRead: Boolean, - val readAt: LocalDateTime?, + var isReceiverRead: Boolean, + var readAt: LocalDateTime?, val isBlocked: Boolean, val isReported: Boolean, @@ -350,6 +350,19 @@ data class MessageV2( return messageRoomId } + fun read(viewer: User) { + if (viewer.isMeSender(senderId = sender.id)) { + return + } + + if (!viewer.isMeReceiver(receiverId = receiver.id)) { + return + } + + readAt = LocalDateTime.now() + isReceiverRead = true + } + override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is MessageV2) return false