From ed8191cfbf4d4fcb93a84f7b9e6fb0f6f3397a7e Mon Sep 17 00:00:00 2001 From: kpeel Date: Sat, 24 May 2025 16:59:06 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=97=90=EB=9F=AC=EB=A5=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/v2/CreateMessageV2Controller.kt | 2 +- .../message/v2/GetMessageV2Controller.kt | 5 +++- .../v2/GetTitleOfMessageV2Controller.kt | 23 +++++++++++++++++++ .../dto/request/CreatedMessageV2Request.kt | 4 ++-- .../dto/response/MessageV2OverviewResponse.kt | 2 +- .../response/MessageV2OverviewResponses.kt | 23 +++++++++++++++++++ .../dto/response/TitleOfMessageV2Response.kt | 17 ++++++++++++++ .../port/in/GetTitleOfMessageV2UseCase.kt | 9 ++++++++ .../service/v2/CreatedMessageV2Service.kt | 4 ++-- .../service/v2/GetAnonymousProfileService.kt | 8 +++---- .../message/service/v2/GetMessageV2Service.kt | 2 +- .../service/v2/GetTitleOfMessageV2Service.kt | 22 ++++++++++++++++++ .../com/wespot/message/v2/MessageRoom.kt | 10 +++++--- .../com/wespot/message/v2/MessageRooms.kt | 11 ++++----- .../kotlin/com/wespot/message/v2/MessageV2.kt | 18 ++++++++++----- .../com/wespot/message/v2/UserProfile.kt | 10 +++++--- .../com/wespot/message/v2/UserProfiles.kt | 10 ++++---- .../message/v2/MessageV2JpaRepository.kt | 2 +- .../message/v2/MessageV2PersistenceAdapter.kt | 2 +- 19 files changed, 148 insertions(+), 36 deletions(-) create mode 100644 app/src/main/kotlin/com/wespot/message/v2/GetTitleOfMessageV2Controller.kt create mode 100644 core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponses.kt create mode 100644 core/src/main/kotlin/com/wespot/message/dto/response/TitleOfMessageV2Response.kt create mode 100644 core/src/main/kotlin/com/wespot/message/port/in/GetTitleOfMessageV2UseCase.kt create mode 100644 core/src/main/kotlin/com/wespot/message/service/v2/GetTitleOfMessageV2Service.kt diff --git a/app/src/main/kotlin/com/wespot/message/v2/CreateMessageV2Controller.kt b/app/src/main/kotlin/com/wespot/message/v2/CreateMessageV2Controller.kt index f1fc57d7..7b548f41 100644 --- a/app/src/main/kotlin/com/wespot/message/v2/CreateMessageV2Controller.kt +++ b/app/src/main/kotlin/com/wespot/message/v2/CreateMessageV2Controller.kt @@ -14,7 +14,7 @@ class CreateMessageV2Controller( @PostMapping fun createMessageV2( - createdMessageV2Request: CreatedMessageV2Request + @RequestBody createdMessageV2Request: CreatedMessageV2Request ): ResponseEntity { createdMessageV2UseCase.createMessage(createdMessageV2Request) diff --git a/app/src/main/kotlin/com/wespot/message/v2/GetMessageV2Controller.kt b/app/src/main/kotlin/com/wespot/message/v2/GetMessageV2Controller.kt index b6203f06..02ec150f 100644 --- a/app/src/main/kotlin/com/wespot/message/v2/GetMessageV2Controller.kt +++ b/app/src/main/kotlin/com/wespot/message/v2/GetMessageV2Controller.kt @@ -4,7 +4,10 @@ import com.wespot.message.dto.response.MessageV2DetailsResponse import com.wespot.message.dto.response.MessageV2OverviewResponse import com.wespot.message.port.`in`.GetMessageV2UseCase import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.GetMapping +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") diff --git a/app/src/main/kotlin/com/wespot/message/v2/GetTitleOfMessageV2Controller.kt b/app/src/main/kotlin/com/wespot/message/v2/GetTitleOfMessageV2Controller.kt new file mode 100644 index 00000000..d9ca1a86 --- /dev/null +++ b/app/src/main/kotlin/com/wespot/message/v2/GetTitleOfMessageV2Controller.kt @@ -0,0 +1,23 @@ +package com.wespot.message.v2 + +import com.wespot.message.dto.response.TitleOfMessageV2Response +import com.wespot.message.port.`in`.GetTitleOfMessageV2UseCase +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/api/v2/messages") +class GetTitleOfMessageV2Controller( + private val getTitleOfMessageV2UseCase: GetTitleOfMessageV2UseCase, +) { + + @GetMapping("/title") + fun getTitleOfMessage(): ResponseEntity { + val response = getTitleOfMessageV2UseCase.getTitle() + + return ResponseEntity.ok(response) + } + +} diff --git a/core/src/main/kotlin/com/wespot/message/dto/request/CreatedMessageV2Request.kt b/core/src/main/kotlin/com/wespot/message/dto/request/CreatedMessageV2Request.kt index 0b1ce585..db5a504b 100644 --- a/core/src/main/kotlin/com/wespot/message/dto/request/CreatedMessageV2Request.kt +++ b/core/src/main/kotlin/com/wespot/message/dto/request/CreatedMessageV2Request.kt @@ -5,8 +5,8 @@ class CreatedMessageV2Request( val receiverId: Long, val isAnonymous: Boolean, - val anonymousImageUrl: String, - val anonymousProfileName: String, + val anonymousImageUrl: String?, + val anonymousProfileName: String?, ) { } diff --git a/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponse.kt b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponse.kt index 4c4104c1..1fbcabc7 100644 --- a/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponse.kt +++ b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponse.kt @@ -28,7 +28,7 @@ data class MessageV2OverviewResponse( // TODO : 문서 변경 thumbnail = room.receiverProfileImage(), isExistsUnreadMessage = room.isExistsUnReadMessage(), latestChatTime = room.latestChatTime(), - isAnonymous = room.isAnonymous(), + isAnonymous = room.isReceiverUsingAnonymous(), name = room.receiverName(), schoolName = room.receiverSchoolName(), grade = room.receiverGrade(), diff --git a/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponses.kt b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponses.kt new file mode 100644 index 00000000..80b4b3ed --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/dto/response/MessageV2OverviewResponses.kt @@ -0,0 +1,23 @@ +package com.wespot.message.dto.response + +data class MessageV2OverviewResponses( + val messages: List, + val hasNext: Boolean, + val lastCursor: Long?, +) { + + companion object { + +// fun of( +// messages: List, +// hasNext: Boolean, +// ): MessageV2OverviewResponses { +// return MessageV2OverviewResponses( +// messages = messages, +// hasNext = hasNext, +// lastCursor = lastCursor +// ) +// } + } + +} diff --git a/core/src/main/kotlin/com/wespot/message/dto/response/TitleOfMessageV2Response.kt b/core/src/main/kotlin/com/wespot/message/dto/response/TitleOfMessageV2Response.kt new file mode 100644 index 00000000..7625c96e --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/dto/response/TitleOfMessageV2Response.kt @@ -0,0 +1,17 @@ +package com.wespot.message.dto.response + +import com.wespot.user.User + +data class TitleOfMessageV2Response( + val title: String, +) { + + companion object { + + fun from(loginUser: User): TitleOfMessageV2Response { + return TitleOfMessageV2Response("${loginUser.name}님을 설레게 한 친구에게\n 쪽지로 마음을 표현해 보세요") + } + + } + +} diff --git a/core/src/main/kotlin/com/wespot/message/port/in/GetTitleOfMessageV2UseCase.kt b/core/src/main/kotlin/com/wespot/message/port/in/GetTitleOfMessageV2UseCase.kt new file mode 100644 index 00000000..9999e0de --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/port/in/GetTitleOfMessageV2UseCase.kt @@ -0,0 +1,9 @@ +package com.wespot.message.port.`in` + +import com.wespot.message.dto.response.TitleOfMessageV2Response + +interface GetTitleOfMessageV2UseCase { + + fun getTitle(): TitleOfMessageV2Response + +} diff --git a/core/src/main/kotlin/com/wespot/message/service/v2/CreatedMessageV2Service.kt b/core/src/main/kotlin/com/wespot/message/service/v2/CreatedMessageV2Service.kt index f048b2ed..8225e4b1 100644 --- a/core/src/main/kotlin/com/wespot/message/service/v2/CreatedMessageV2Service.kt +++ b/core/src/main/kotlin/com/wespot/message/service/v2/CreatedMessageV2Service.kt @@ -48,8 +48,8 @@ class CreatedMessageV2Service( if (createdMessageV2Request.isAnonymous) { return profileUseCase.createAnonymousProfile( CreatedAnonymousProfileRequest( - name = createdMessageV2Request.anonymousProfileName, - imageUrl = createdMessageV2Request.anonymousImageUrl, + name = createdMessageV2Request.anonymousProfileName!!, + imageUrl = createdMessageV2Request.anonymousImageUrl!!, receiverId = createdMessageV2Request.receiverId ) ) diff --git a/core/src/main/kotlin/com/wespot/message/service/v2/GetAnonymousProfileService.kt b/core/src/main/kotlin/com/wespot/message/service/v2/GetAnonymousProfileService.kt index 736fef10..1d703332 100644 --- a/core/src/main/kotlin/com/wespot/message/service/v2/GetAnonymousProfileService.kt +++ b/core/src/main/kotlin/com/wespot/message/service/v2/GetAnonymousProfileService.kt @@ -18,16 +18,16 @@ class GetAnonymousProfileService( @Transactional(readOnly = true) override fun getAnonymousProfileByReceiverId(receiverId: Long): List { - val sender = SecurityUtils.getLoginUser(userPort = userPort) + val loginUser = SecurityUtils.getLoginUser(userPort = userPort) val messageRooms = - messagePort.findAllMessageRoomBySenderIdAndReceiverId(senderId = sender.id, receiverId = receiverId) + messagePort.findAllMessageRoomBySenderIdAndReceiverId(senderId = loginUser.id, receiverId = receiverId) val messageRoomIds = messageRooms.map { it.id } val messageDetails = messagePort.findAllLastMessageOfRoomByRoomIdIn(messageRoomIds) val rooms = - MessageRooms.createOverview(user = sender, rooms = messageRooms, messageDetails = messageDetails) + MessageRooms.createOverview(viewer = loginUser, rooms = messageRooms, messageDetails = messageDetails) - return UserProfiles.of(messageRooms = rooms) + return UserProfiles.of(viewer = loginUser, messageRooms = rooms) .asList() .map { AnonymousProfileResponse.from(it) } } diff --git a/core/src/main/kotlin/com/wespot/message/service/v2/GetMessageV2Service.kt b/core/src/main/kotlin/com/wespot/message/service/v2/GetMessageV2Service.kt index c48415a5..ddca5b46 100644 --- a/core/src/main/kotlin/com/wespot/message/service/v2/GetMessageV2Service.kt +++ b/core/src/main/kotlin/com/wespot/message/service/v2/GetMessageV2Service.kt @@ -46,7 +46,7 @@ class GetMessageV2Service( val messageRoomIds: List = rooms.map { it.id } val messageDetails = messageV2Port.findAllLastMessageOfRoomByRoomIdIn(messageRoomIds) - val messageRooms = MessageRooms.createOverview(user = loginUser, rooms = rooms, messageDetails = messageDetails) + val messageRooms = MessageRooms.createOverview(viewer = loginUser, rooms = rooms, messageDetails = messageDetails) return messageRooms.asList() .map { MessageV2OverviewResponse.from(it) } diff --git a/core/src/main/kotlin/com/wespot/message/service/v2/GetTitleOfMessageV2Service.kt b/core/src/main/kotlin/com/wespot/message/service/v2/GetTitleOfMessageV2Service.kt new file mode 100644 index 00000000..7fc745aa --- /dev/null +++ b/core/src/main/kotlin/com/wespot/message/service/v2/GetTitleOfMessageV2Service.kt @@ -0,0 +1,22 @@ +package com.wespot.message.service.v2 + +import com.wespot.auth.service.SecurityUtils +import com.wespot.message.dto.response.TitleOfMessageV2Response +import com.wespot.message.port.`in`.GetTitleOfMessageV2UseCase +import com.wespot.user.port.out.UserPort +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +class GetTitleOfMessageV2Service( + private val userPort: UserPort, +) : GetTitleOfMessageV2UseCase { + + @Transactional(readOnly = true) + override fun getTitle(): TitleOfMessageV2Response { + val loginUser = SecurityUtils.getLoginUser(userPort = userPort) + + return TitleOfMessageV2Response.from(loginUser) + } + +} diff --git a/domain/src/main/kotlin/com/wespot/message/v2/MessageRoom.kt b/domain/src/main/kotlin/com/wespot/message/v2/MessageRoom.kt index 84e925e7..1e185cee 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/MessageRoom.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/MessageRoom.kt @@ -80,8 +80,12 @@ data class MessageRoom( return roomMessage.id } - fun isAnonymous(): Boolean { - return roomMessage.isAnonymousReceiver(viewer = viewer) + fun isMeUsingAnonymous(): Boolean { + return roomMessage.isMeAnonymous(viewer = viewer) + } + + fun isReceiverUsingAnonymous(): Boolean { + return roomMessage.isReceiverAnonymous(viewer = viewer) } fun isViewerOwnerOfMessageRoom(): Boolean { @@ -173,7 +177,7 @@ data class MessageRoom( return messages.asList(viewer = viewer) } - fun readUnreadMessages():List{ + fun readUnreadMessages(): List { return messages.readUnreadMessage(viewer = viewer) } diff --git a/domain/src/main/kotlin/com/wespot/message/v2/MessageRooms.kt b/domain/src/main/kotlin/com/wespot/message/v2/MessageRooms.kt index fd0ad121..a32251a8 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/MessageRooms.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/MessageRooms.kt @@ -11,14 +11,14 @@ data class MessageRooms( companion object { - fun createOverview(user: User, rooms: List, messageDetails: List): MessageRooms { + fun createOverview(viewer: User, rooms: List, messageDetails: List): MessageRooms { val roomIdToMessages: Map> = messageDetails .filter { it.messageRoomId != null } .groupBy { it.messageRoomId!! } val resultOfRooms = rooms.map { roomMessage -> val messages = roomIdToMessages[roomMessage.messageRoomId] ?: emptyList() - MessageRoom.of(viewer = user, roomMessage = roomMessage, messages = messages) + MessageRoom.of(viewer = viewer, roomMessage = roomMessage, messages = messages) } return MessageRooms(resultOfRooms) @@ -33,19 +33,18 @@ data class MessageRooms( return rooms } - fun viewer(): User { + fun viewer(): User? { val viewerSet = rooms.map { it.viewer } .toSet() - if (viewerSet.size != 1) { + if (viewerSet.size > 1) { throw CustomException( message = "조회자는 무조건 1명을 초과할 수 없습니다.", status = HttpStatus.BAD_REQUEST, view = ExceptionView.TOAST, ) } - - return viewerSet.first() + return viewerSet.firstOrNull() } } 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 9050752c..6009fff3 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/MessageV2.kt @@ -178,7 +178,17 @@ data class MessageV2( return anonymousProfile != null } - fun isAnonymousReceiver(viewer: User): Boolean { + fun isMeAnonymous(viewer: User): Boolean { + validateRoomMessage() + + if (viewer.isMeReceiver(receiverId = receiver.id)) { + return false + } + + return anonymousProfile != null + } + + fun isReceiverAnonymous(viewer: User): Boolean { validateRoomMessage() return receiverUsingAnonymousProfile(viewer = viewer) @@ -268,11 +278,7 @@ data class MessageV2( } fun isAbleToAnswer(viewer: User): Boolean { - if (viewer.isMeReceiver(receiverId = receiver.id)) { - return true - } - - return false + return viewer.isMeReceiver(receiverId = receiver.id) } fun isSameUserProfileAndNotAnonymous(viewer: User): Boolean { diff --git a/domain/src/main/kotlin/com/wespot/message/v2/UserProfile.kt b/domain/src/main/kotlin/com/wespot/message/v2/UserProfile.kt index 1a9a9ea4..5050579c 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/UserProfile.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/UserProfile.kt @@ -30,9 +30,13 @@ data class UserProfile( } fun createByUserProfile( - user: User, + user: User?, messageRoom: List - ): UserProfile { + ): UserProfile? { + if (user == null) { + return null + } + return UserProfile( profileId = user.profile.id, image = user.profile.iconUrl, @@ -54,7 +58,7 @@ data class UserProfile( fun isAbleToAnswer(): Boolean { if (messageRoom == EMPTY_MESSAGE_ROOM) { - return false + return true } return messageRoom.isAbleToAnswer() diff --git a/domain/src/main/kotlin/com/wespot/message/v2/UserProfiles.kt b/domain/src/main/kotlin/com/wespot/message/v2/UserProfiles.kt index c2127d3e..f195b8f0 100644 --- a/domain/src/main/kotlin/com/wespot/message/v2/UserProfiles.kt +++ b/domain/src/main/kotlin/com/wespot/message/v2/UserProfiles.kt @@ -2,6 +2,7 @@ package com.wespot.message.v2 import com.wespot.exception.CustomException import com.wespot.exception.ExceptionView +import com.wespot.user.User import org.springframework.http.HttpStatus data class UserProfiles( @@ -10,7 +11,7 @@ data class UserProfiles( companion object { - fun of(messageRooms: MessageRooms): UserProfiles { + fun of(viewer: User, messageRooms: MessageRooms): UserProfiles { val isContainsOwnerIsNotViewer = messageRooms.asList() .any { !it.isViewerOwnerOfMessageRoom() } if (isContainsOwnerIsNotViewer) { @@ -22,7 +23,7 @@ data class UserProfiles( } val anonymousProfiles = messageRooms.asList() - .filter { it.isAnonymous() } + .filter { it.isMeUsingAnonymous() } .map { it.anonymousProfile()!! } val resultOfUserProfiles = anonymousProfiles.map { anonymousProfile -> @@ -31,12 +32,13 @@ data class UserProfiles( messageRoom = messageRooms.asList() ) } + UserProfile.createByUserProfile( - user = messageRooms.viewer(), + user = viewer, messageRoom = messageRooms.asList() ) return UserProfiles( - userProfiles = resultOfUserProfiles.sortedBy { it.recentlyTalk() } + userProfiles = resultOfUserProfiles.filterNotNull() + .sortedBy { it.recentlyTalk() } .reversed() ) } diff --git a/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2JpaRepository.kt b/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2JpaRepository.kt index 395ced8b..f2508dfd 100644 --- a/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2JpaRepository.kt +++ b/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2JpaRepository.kt @@ -58,7 +58,7 @@ interface MessageV2JpaRepository : JpaRepository { ) fun findAllLastMessageOfRoomByReceiverIdAndFromDate( receiverId: Long, - from: LocalDate + from: LocalDateTime ): List } diff --git a/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2PersistenceAdapter.kt b/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2PersistenceAdapter.kt index e3886f3a..3dbf0a6d 100644 --- a/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2PersistenceAdapter.kt +++ b/infrastructure/mysql/src/main/kotlin/com/wespot/message/v2/MessageV2PersistenceAdapter.kt @@ -139,7 +139,7 @@ class MessageV2PersistenceAdapter( val messages = messageV2JpaRepository.findAllLastMessageOfRoomByReceiverIdAndFromDate( receiverId = receiverId, - from = from + from = from.atStartOfDay() ) return getCompleteMessageV2(messages = messages)