From c8df9d070b10957fcba0068395cc19b4423229dc Mon Sep 17 00:00:00 2001 From: Sim-km Date: Sun, 18 May 2025 15:07:20 +0900 Subject: [PATCH 1/5] =?UTF-8?q?ASAP-451=20=EB=B9=84=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=8E=B8=EC=A7=80=20=EC=83=9D=EC=84=B1=20api=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/web/letter/api/LetterApi.kt | 39 ++++++++++++------- .../web/letter/controller/LetterController.kt | 15 +++++++ .../letter/dto/AnonymousSendLetterRequest.kt | 8 ++++ .../letter/controller/LetterControllerTest.kt | 37 ++++++++++++++++++ .../letter/LetterApiIntegrationTest.kt | 28 +++++++++++++ 5 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/AnonymousSendLetterRequest.kt diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/api/LetterApi.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/api/LetterApi.kt index 887fbe7..4167d77 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/api/LetterApi.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/api/LetterApi.kt @@ -2,20 +2,7 @@ package com.asap.bootstrap.web.letter.api import com.asap.bootstrap.common.exception.ExceptionResponse import com.asap.bootstrap.common.security.annotation.AccessUser -import com.asap.bootstrap.web.letter.dto.AddPhysicalLetterRequest -import com.asap.bootstrap.web.letter.dto.AddVerifiedLetterRequest -import com.asap.bootstrap.web.letter.dto.AllLetterCountResponse -import com.asap.bootstrap.web.letter.dto.DeleteSendLettersRequest -import com.asap.bootstrap.web.letter.dto.GetIndependentLetterDetailResponse -import com.asap.bootstrap.web.letter.dto.GetIndependentLetterSimpleInfo -import com.asap.bootstrap.web.letter.dto.LetterVerifyRequest -import com.asap.bootstrap.web.letter.dto.LetterVerifyResponse -import com.asap.bootstrap.web.letter.dto.ModifyLetterRequest -import com.asap.bootstrap.web.letter.dto.SendLetterDetailResponse -import com.asap.bootstrap.web.letter.dto.SendLetterHistoryResponse -import com.asap.bootstrap.web.letter.dto.SendLetterRequest -import com.asap.bootstrap.web.letter.dto.SendLetterResponse -import com.asap.bootstrap.web.letter.dto.VerifiedLetterInfoResponse +import com.asap.bootstrap.web.letter.dto.* import com.asap.common.page.ListResponse import com.asap.common.page.SliceResponse import io.swagger.v3.oas.annotations.Operation @@ -317,4 +304,28 @@ interface LetterApi { @RequestBody request: DeleteSendLettersRequest, @AccessUser userId: String, ) + + @Operation(summary = "비회원 편지 쓰기") + @PostMapping("/anonymous/send") + @ApiResponses( + value = [ + ApiResponse( + responseCode = "200", + description = "비회원 편지 전송 성공", + content = [ + Content( + mediaType = "application/json", + schema = Schema(implementation = SendLetterResponse::class), + ), + ], + ), + ApiResponse( + responseCode = "4XX", + description = "비회원 편지 전송 실패", + ), + ], + ) + fun sendAnonymousLetter( + @RequestBody request: AnonymousSendLetterRequest, + ): SendLetterResponse } diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/controller/LetterController.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/controller/LetterController.kt index 3019be5..3496ba7 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/controller/LetterController.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/controller/LetterController.kt @@ -265,4 +265,19 @@ class LetterController( ), ) } + + override fun sendAnonymousLetter(request: AnonymousSendLetterRequest): SendLetterResponse { + val response = + sendLetterUsecase.sendAnonymous( + SendLetterUsecase.AnonymousCommand( + receiverName = request.receiverName, + content = request.content, + images = request.images, + templateType = request.templateType, + ), + ) + return SendLetterResponse( + letterCode = response.letterCode, + ) + } } diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/AnonymousSendLetterRequest.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/AnonymousSendLetterRequest.kt new file mode 100644 index 0000000..147bf26 --- /dev/null +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/AnonymousSendLetterRequest.kt @@ -0,0 +1,8 @@ +package com.asap.bootstrap.web.letter.dto + +data class AnonymousSendLetterRequest( + val receiverName: String, + val content: String, + val images: List, + val templateType: Int, +) diff --git a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/acceptance/letter/controller/LetterControllerTest.kt b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/acceptance/letter/controller/LetterControllerTest.kt index 68fb4b4..6a6ec16 100644 --- a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/acceptance/letter/controller/LetterControllerTest.kt +++ b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/acceptance/letter/controller/LetterControllerTest.kt @@ -589,4 +589,41 @@ class LetterControllerTest : LetterAcceptanceSupporter() { } } } + @Test + fun sendAnonymousLetter() { + // given + val request = + AnonymousSendLetterRequest( + receiverName = "receiverName", + content = "content", + images = listOf("images"), + templateType = 1, + ) + BDDMockito + .given( + sendLetterUsecase.sendAnonymous( + SendLetterUsecase.AnonymousCommand( + receiverName = request.receiverName, + content = request.content, + images = request.images, + templateType = request.templateType, + ), + ), + ).willReturn(SendLetterUsecase.Response("letterCode")) + // when + val response = + mockMvc.post("/api/v1/letters/anonymous/send") { + contentType = MediaType.APPLICATION_JSON + content = objectMapper.writeValueAsString(request) + } + // then + response.andExpect { + status { isOk() } + jsonPath("$.letterCode") { + exists() + isString() + isNotEmpty() + } + } + } } diff --git a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt index 058b862..901324c 100644 --- a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt +++ b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt @@ -1081,4 +1081,32 @@ class LetterApiIntegrationTest : IntegrationSupporter() { } } } + + @Test + @DisplayName("비회원 편지 쓰기") + fun sendAnonymousLetter() { + // given + val request = + AnonymousSendLetterRequest( + receiverName = "receiverName", + content = "content", + images = listOf("images"), + templateType = 1, + ) + // when + val response = + mockMvc.post("/api/v1/letters/anonymous/send") { + contentType = MediaType.APPLICATION_JSON + content = objectMapper.writeValueAsString(request) + } + // then + response.andExpect { + status { isOk() } + jsonPath("$.letterCode") { + exists() + isString() + isNotEmpty() + } + } + } } From 480a1a25a393c789614eccd1a68d764f4a137f19 Mon Sep 17 00:00:00 2001 From: Sim-km Date: Sun, 18 May 2025 15:10:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?ASAP-451=20=EC=9D=B5=EB=AA=85=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=80=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../letter/port/in/SendLetterUsecase.kt | 18 ++++++++----- .../letter/service/LetterCommandService.kt | 26 ++++++++++++++++++- .../service/LetterCommandServiceTest.kt | 20 ++++++++++++++ .../letter/service/LetterCodeGenerator.kt | 5 ++-- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/SendLetterUsecase.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/SendLetterUsecase.kt index 9bca7b0..ede1b7d 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/SendLetterUsecase.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/SendLetterUsecase.kt @@ -1,10 +1,9 @@ package com.asap.application.letter.port.`in` interface SendLetterUsecase { + fun send(command: Command): Response - fun send( - command: Command - ): Response + fun sendAnonymous(command: AnonymousCommand): Response data class Command( val receiverName: String, @@ -12,10 +11,17 @@ interface SendLetterUsecase { val images: List, val templateType: Int, val draftId: String?, - val userId: String + val userId: String, + ) + + data class AnonymousCommand( + val receiverName: String, + val content: String, + val images: List, + val templateType: Int, ) data class Response( - val letterCode: String + val letterCode: String, ) -} \ No newline at end of file +} diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt index 3fa993d..eefa4c7 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt @@ -56,6 +56,27 @@ class LetterCommandService( return SendLetterUsecase.Response(letterCode = sendLetter.letterCode!!) } + override fun sendAnonymous(command: SendLetterUsecase.AnonymousCommand): SendLetterUsecase.Response { + val sendLetter = + SendLetter.createAnonymous( + receiverName = command.receiverName, + content = + LetterContent( + content = command.content, + templateType = command.templateType, + images = command.images.toMutableList(), + ), + letterCode = + letterCodeGenerator.generateCode( + content = command.content, + ), + ) + + sendLetterManagementPort.save(sendLetter) + + return SendLetterUsecase.Response(letterCode = sendLetter.letterCode!!) + } + override fun verify(command: VerifyLetterAccessibleUsecase.Command): VerifyLetterAccessibleUsecase.Response { if (sendLetterManagementPort.verifiedLetter(DomainId(command.userId), command.letterCode)) { val sendLetter = @@ -89,7 +110,10 @@ class LetterCommandService( sender = SenderInfo( senderId = sendLetter.senderId, - senderName = userManagementPort.getUserNotNull(sendLetter.senderId).username, + senderName = + sendLetter.senderId + ?.let { userManagementPort.getUserNotNull(it).username } + .orEmpty(), ), receiver = ReceiverInfo( diff --git a/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterCommandServiceTest.kt b/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterCommandServiceTest.kt index 7f86652..baf2d52 100644 --- a/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterCommandServiceTest.kt +++ b/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterCommandServiceTest.kt @@ -57,6 +57,26 @@ class LetterCommandServiceTest : } } + given("익명 편지 전송 요청이 들어올 때") { + val command = + SendLetterUsecase.AnonymousCommand( + receiverName = "receiver-name", + content = "content", + images = emptyList(), + templateType = 1, + ) + `when`("익명 편지 전송 요청을 처리하면") { + val response = letterCommandService.sendAnonymous(command) + then("편지 코드가 생성되고, 편지가 저장되어야 한다") { + response.letterCode shouldNotBeNull { + this.isNotBlank() + this.isNotEmpty() + } + verify { mockSendLetterManagementPort.save(any()) } + } + } + } + given("편지 검증 시에") { val letterCode = "letter-code" val mockUser = UserFixture.createUser(username = "receiver-name") diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/service/LetterCodeGenerator.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/service/LetterCodeGenerator.kt index 9d94200..bb91eba 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/service/LetterCodeGenerator.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/service/LetterCodeGenerator.kt @@ -4,10 +4,9 @@ import java.security.MessageDigest import java.util.* class LetterCodeGenerator { - fun generateCode( content: String, - ownerId: String + ownerId: String = UUID.randomUUID().toString(), ): String { val salt = UUID.randomUUID().toString() val input = content + ownerId + salt @@ -22,4 +21,4 @@ class LetterCodeGenerator { val letterCode = hexString.toString() return letterCode } -} \ No newline at end of file +} From d92d5063c46769f8c3cd61418b2a578231d34553 Mon Sep 17 00:00:00 2001 From: Sim-km Date: Sun, 18 May 2025 15:17:58 +0900 Subject: [PATCH 3/5] =?UTF-8?q?ASAP-451=20=EC=9D=B5=EB=AA=85=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=80=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F?= =?UTF-8?q?=20DB=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `send_letter.sender_id`를 nullable로 수정: 도메인, 엔터티, 매퍼 및 DDL 변경. - 익명 편지 생성 팩토리 메서드 `createAnonymous` 추가. --- .../asap/domain/letter/entity/SendLetter.kt | 23 ++++++++++++++++++- .../jpa/letter/SendLetterMapper.kt | 4 ++-- .../jpa/letter/entity/SendLetterEntity.kt | 9 ++++---- ...lter_send_letter_sender_id_to_nullable.sql | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 Infrastructure-Module/Persistence/src/main/resources/db/V1_20__alter_send_letter_sender_id_to_nullable.sql diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt index 4ff0ec9..360f0ce 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt @@ -12,7 +12,7 @@ import java.time.LocalDateTime class SendLetter( id: DomainId, val content: LetterContent, - val senderId: DomainId, + val senderId: DomainId? = null, var receiverName: String, var letterCode: String?, var status: LetterStatus, @@ -46,6 +46,27 @@ class SendLetter( ).also { it.registerEvent(SendLetterEvent.SendLetterCreatedEvent(it, draftId?.value)) } + + fun createAnonymous( + content: LetterContent, + receiverName: String, + letterCode: String?, + status: LetterStatus = LetterStatus.SENDING, + receiverId: DomainId? = null, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), + ): SendLetter = + SendLetter( + id = DomainId.generate(), + content = content, + senderId = null, + receiverName = receiverName, + letterCode = letterCode, + status = status, + receiverId = receiverId, + createdAt = createdAt, + updatedAt = updatedAt, + ) } fun isSameReceiver(receiver: () -> User): Boolean { diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt index 38087c4..0fa655b 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt @@ -17,7 +17,7 @@ object SendLetterMapper { ), receiverName = sendLetterEntity.receiverName, letterCode = sendLetterEntity.letterCode ?: "", - senderId = DomainId(sendLetterEntity.senderId), + senderId = sendLetterEntity.senderId?.let { DomainId(it) }, receiverId = sendLetterEntity.receiverId?.let { DomainId(it) }, status = sendLetterEntity.letterStatus, createdAt = sendLetterEntity.createdAt, @@ -31,7 +31,7 @@ object SendLetterMapper { images = sendLetter.content.images, templateType = sendLetter.content.templateType, receiverName = sendLetter.receiverName, - senderId = sendLetter.senderId.value, + senderId = sendLetter.senderId?.value, letterCode = sendLetter.letterCode, receiverId = sendLetter.receiverId?.value, letterStatus = sendLetter.status, diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt index 1f258e8..8fe740e 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt @@ -26,7 +26,7 @@ class SendLetterEntity( content: String, images: List, templateType: Int, - senderId: String, + senderId: String?, letterCode: String?, receiverId: String?, letterStatus: LetterStatus, @@ -49,17 +49,16 @@ class SendLetterEntity( var images: List = images var templateType: Int = templateType - @Column(name = "sender_id", nullable = false) - var senderId: String = senderId + @Column(name = "sender_id") + var senderId: String? = senderId @ManyToOne(fetch = FetchType.LAZY) @JoinColumn( name = "sender_id", - nullable = false, insertable = false, updatable = false, ) - lateinit var sender: UserEntity + var sender: UserEntity? = null @Column(name = "receiver_id") var receiverId: String? = receiverId diff --git a/Infrastructure-Module/Persistence/src/main/resources/db/V1_20__alter_send_letter_sender_id_to_nullable.sql b/Infrastructure-Module/Persistence/src/main/resources/db/V1_20__alter_send_letter_sender_id_to_nullable.sql new file mode 100644 index 0000000..921fa3c --- /dev/null +++ b/Infrastructure-Module/Persistence/src/main/resources/db/V1_20__alter_send_letter_sender_id_to_nullable.sql @@ -0,0 +1 @@ +ALTER TABLE send_letter MODIFY COLUMN sender_id VARCHAR(255) NULL; \ No newline at end of file From 8cbf93809e44fa00566ad645540389ab2f4c777e Mon Sep 17 00:00:00 2001 From: Sim-km Date: Sun, 18 May 2025 15:18:22 +0900 Subject: [PATCH 4/5] =?UTF-8?q?ASAP-451=20=ED=8E=B8=EC=A7=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `send_letter.sender_id` nullable 처리에 따른 조회 로직 수정: 관련 도메인 및 데이터 클래스를 업데이트. - `senderName` 필드를 null 허용하도록 변경. - 테스트 코드에서 null 처리 로직 보완. --- .../letter/port/in/GetVerifiedLetterUsecase.kt | 15 +++++---------- .../letter/service/LetterQueryService.kt | 4 ++-- .../letter/service/LetterQueryServiceTest.kt | 9 +++++---- .../web/letter/dto/VerifiedLetterInfoResponse.kt | 7 +++---- .../web/letter/handler/DraftLetterEventHandler.kt | 2 +- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetVerifiedLetterUsecase.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetVerifiedLetterUsecase.kt index da126c9..f9ec993 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetVerifiedLetterUsecase.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetVerifiedLetterUsecase.kt @@ -3,23 +3,18 @@ package com.asap.application.letter.port.`in` import java.time.LocalDate interface GetVerifiedLetterUsecase { - - fun get( - query: Query - ): Response + fun get(query: Query): Response data class Query( val letterId: String, - val userId: String + val userId: String, ) data class Response( - val senderName: String, + val senderName: String?, val content: String, val sendDate: LocalDate, val templateType: Int, - val images: List + val images: List, ) - - -} \ No newline at end of file +} diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterQueryService.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterQueryService.kt index 5d47356..44bf6df 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterQueryService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterQueryService.kt @@ -32,9 +32,9 @@ class LetterQueryService( receiverId = DomainId(query.userId), letterId = DomainId(query.letterId), ).also { - val sender = userManagementPort.getUserNotNull(it.senderId) + val sender = it.senderId?.let { userManagementPort.getUserNotNull(it) } return GetVerifiedLetterUsecase.Response( - senderName = sender.username, + senderName = sender?.username, content = it.content.content, sendDate = it.createdDate, templateType = it.content.templateType, diff --git a/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt b/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt index 18e67b7..6baa76b 100644 --- a/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt +++ b/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt @@ -42,7 +42,7 @@ class LetterQueryServiceTest : userId = user.id.value, ) val mockSendLetter = LetterFixture.generateSendLetter(user.id) - val mockSender = UserFixture.createUser(mockSendLetter.senderId, "sender-name") + val mockSender = UserFixture.createUser(mockSendLetter.senderId!!, "sender-name") every { mockSendLetterManagementPort.getReadLetterNotNull( receiverId = DomainId(query.userId), @@ -96,9 +96,10 @@ class LetterQueryServiceTest : letterId = "letter-id", userId = "user-id", ) - val space = SpaceFixture.createSpace( - userId = DomainId(query.userId), - ) + val space = + SpaceFixture.createSpace( + userId = DomainId(query.userId), + ) val spaceLetter = LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id) val prevSpaceLetter = LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id) diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/VerifiedLetterInfoResponse.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/VerifiedLetterInfoResponse.kt index e8f7435..2fe53fe 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/VerifiedLetterInfoResponse.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/dto/VerifiedLetterInfoResponse.kt @@ -3,10 +3,9 @@ package com.asap.bootstrap.web.letter.dto import java.time.LocalDate data class VerifiedLetterInfoResponse( - val senderName: String, + val senderName: String?, val content: String, val date: LocalDate, val templateType: Int, - val images: List -) { -} \ No newline at end of file + val images: List, +) diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/handler/DraftLetterEventHandler.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/handler/DraftLetterEventHandler.kt index 670b495..ccf79eb 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/handler/DraftLetterEventHandler.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/handler/DraftLetterEventHandler.kt @@ -16,7 +16,7 @@ class DraftLetterEventHandler( event.draftId?.let { removeDraftLetterUsecase.deleteBy( RemoveDraftLetterUsecase.Command.Send( - userId = event.sendLetter.senderId.value, + userId = event.sendLetter.senderId!!.value, draftId = it, ), ) From 5864874c8db8348f4844a3307e5254237c6a7e6b Mon Sep 17 00:00:00 2001 From: Sim-km Date: Sun, 18 May 2025 15:22:32 +0900 Subject: [PATCH 5/5] =?UTF-8?q?ASAP-451=20=ED=8E=B8=EC=A7=80=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=EC=9E=90=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `isSameReceiver` 메서드 수정: 람다를 통한 사용자 객체 생성 대신 직접 `User` 객체를 전달받는 방식으로 변경. - 관련 서비스 로직 리팩토링: 불필요한 람다 호출 제거 및 가독성 향상. - 예외 처리 방식 유지하며 로직 간결화. --- .../letter/service/LetterCommandService.kt | 18 +++++++++--------- .../asap/domain/letter/entity/SendLetter.kt | 5 +---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt index eefa4c7..23e699b 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/service/LetterCommandService.kt @@ -88,15 +88,15 @@ class LetterCommandService( } val sendLetter = sendLetterManagementPort.getLetterByCodeNotNull(command.letterCode) - sendLetter - .isSameReceiver { - userManagementPort.getUserNotNull(DomainId(command.userId)) - }.takeIf { it } - ?.let { - sendLetter.readLetter(DomainId(command.userId)) - sendLetterManagementPort.save(sendLetter) - return VerifyLetterAccessibleUsecase.Response(letterId = sendLetter.id.value) - } ?: throw LetterException.InvalidLetterAccessException() + val receiver = userManagementPort.getUserNotNull(DomainId(command.userId)) + + if (sendLetter.isSameReceiver(receiver)) { + sendLetter.readLetter(DomainId(command.userId)) + sendLetterManagementPort.save(sendLetter) + return VerifyLetterAccessibleUsecase.Response(letterId = sendLetter.id.value) + } + + throw LetterException.InvalidLetterAccessException() } override fun addVerifiedLetter(command: AddLetterUsecase.Command.VerifyLetter) { diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt index 360f0ce..1796478 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt @@ -69,10 +69,7 @@ class SendLetter( ) } - fun isSameReceiver(receiver: () -> User): Boolean { - val receiverUser = receiver() - return receiverName == receiverUser.username && (receiverId == null || receiverId == receiverUser.id) - } + fun isSameReceiver(receiver: User): Boolean = receiverName == receiver.username && (receiverId == null || receiverId == receiver.id) fun readLetter(receiverId: DomainId) { this.receiverId = receiverId