Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.

Commit 6c437f4

Browse files
authored
Merge pull request #111 from ASAP-Lettering/ASAP-389
ASAP-389 실물 편지 임시 저장한 내용을 수정하기 위한 api 추가
2 parents 7f5159a + 7a6b632 commit 6c437f4

File tree

15 files changed

+277
-39
lines changed

15 files changed

+277
-39
lines changed

Application-Module/src/main/kotlin/com/asap/application/letter/exception/LetterException.kt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,34 @@ sealed class LetterException(
1111
class SendLetterNotFoundException(
1212
message: String = "존재하지 않는 편지입니다.",
1313
) : LetterException(
14-
errorCode = 1,
15-
message = message,
16-
httpStatus = 404,
17-
)
14+
errorCode = 1,
15+
message = message,
16+
httpStatus = 404,
17+
)
1818

1919
class InvalidLetterAccessException(
2020
message: String = "편지에 대한 접근 권한이 없습니다.",
2121
) : LetterException(
22-
errorCode = 2,
23-
message = message,
24-
httpStatus = 403,
25-
)
22+
errorCode = 2,
23+
message = message,
24+
httpStatus = 403,
25+
)
2626

2727
class ReceiveLetterNotFoundException(
2828
message: String = "존재하지 않는 편지입니다.",
2929
) : LetterException(
30-
errorCode = 3,
31-
message = message,
32-
httpStatus = 404,
33-
)
30+
errorCode = 3,
31+
message = message,
32+
httpStatus = 404,
33+
)
3434

3535
class DraftLetterNotFoundException(
3636
message: String = "존재하지 않는 임시 편지입니다.",
3737
) : LetterException(
38-
errorCode = 4,
39-
message = message,
40-
httpStatus = 404,
41-
)
38+
errorCode = 4,
39+
message = message,
40+
httpStatus = 404,
41+
)
4242

4343
companion object {
4444
const val CODE_PREFIX = "LETTER"
Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
package com.asap.application.letter.port.`in`
22

33
interface UpdateDraftLetterUsecase {
4-
fun command(command: Command)
5-
6-
data class Command(
7-
val draftId: String,
8-
val userId: String,
9-
val content: String,
10-
val receiverName: String,
11-
val images: List<String>,
12-
)
4+
fun command(command: Command.Send)
5+
6+
fun command(command: Command.Physical)
7+
8+
sealed class Command {
9+
data class Send(
10+
val draftId: String,
11+
val userId: String,
12+
val content: String,
13+
val images: List<String>,
14+
val receiverName: String,
15+
) : Command()
16+
17+
data class Physical(
18+
val draftId: String,
19+
val userId: String,
20+
val content: String,
21+
val images: List<String>,
22+
val senderName: String,
23+
) : Command()
24+
}
1325
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.asap.application.letter.port.out
22

3+
import com.asap.domain.common.DomainId
34
import com.asap.domain.letter.entity.ReceiveDraftLetter
45

56
interface ReceiveDraftLetterManagementPort {
67
fun save(receiveDraftLetter: ReceiveDraftLetter): ReceiveDraftLetter
8+
9+
fun getDraftLetterNotNull(draftId: DomainId, ownerId: DomainId): ReceiveDraftLetter
710
}

Application-Module/src/main/kotlin/com/asap/application/letter/service/DraftLetterCommandService.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class DraftLetterCommandService(
3131
return GenerateDraftKeyUsecase.Response(receiveDraftLetter.id.value)
3232
}
3333

34-
override fun command(command: UpdateDraftLetterUsecase.Command) {
34+
override fun command(command: UpdateDraftLetterUsecase.Command.Send) {
3535
val draftLetter =
3636
draftLetterManagementPort.getDraftLetterNotNull(
3737
draftId = DomainId(command.draftId),
@@ -63,4 +63,19 @@ class DraftLetterCommandService(
6363
draftLetterManagementPort.remove(it)
6464
}
6565
}
66+
67+
override fun command(command: UpdateDraftLetterUsecase.Command.Physical) {
68+
val receiveDraftLetter =
69+
receiveDraftLetterManagementPort.getDraftLetterNotNull(
70+
draftId = DomainId(command.draftId),
71+
ownerId = DomainId(command.userId),
72+
)
73+
74+
receiveDraftLetter.update(
75+
content = command.content,
76+
senderName = command.senderName,
77+
images = command.images,
78+
)
79+
receiveDraftLetterManagementPort.save(receiveDraftLetter)
80+
}
6681
}

Application-Module/src/test/kotlin/com/asap/application/letter/service/DraftLetterCommandServiceTest.kt

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.asap.application.letter.service
22

3+
import com.asap.application.letter.exception.LetterException
34
import com.asap.application.letter.port.`in`.GenerateDraftKeyUsecase
45
import com.asap.application.letter.port.`in`.RemoveDraftLetterUsecase
56
import com.asap.application.letter.port.`in`.UpdateDraftLetterUsecase
@@ -8,6 +9,7 @@ import com.asap.application.letter.port.out.ReceiveDraftLetterManagementPort
89
import com.asap.domain.common.DomainId
910
import com.asap.domain.letter.entity.DraftLetter
1011
import com.asap.domain.letter.entity.ReceiveDraftLetter
12+
import io.kotest.core.spec.IsolationMode
1113
import io.kotest.core.spec.style.BehaviorSpec
1214
import io.kotest.matchers.nulls.shouldNotBeNull
1315
import io.mockk.every
@@ -16,6 +18,7 @@ import io.mockk.verify
1618

1719
class DraftLetterCommandServiceTest :
1820
BehaviorSpec({
21+
isolationMode = IsolationMode.InstancePerLeaf
1922

2023
val mockGenerateDraftKeyUsecase = mockk<DraftLetterManagementPort>(relaxed = true)
2124
val mockReceiveDraftLetterManagementPort = mockk<ReceiveDraftLetterManagementPort>(relaxed = true)
@@ -36,7 +39,7 @@ class DraftLetterCommandServiceTest :
3639

3740
given("임시 저장 편지를 수정할 때") {
3841
val command =
39-
UpdateDraftLetterUsecase.Command(
42+
UpdateDraftLetterUsecase.Command.Send(
4043
draftId = "draftId",
4144
userId = "userId",
4245
content = "content",
@@ -86,4 +89,50 @@ class DraftLetterCommandServiceTest :
8689
}
8790
}
8891
}
92+
93+
given("받은 임시 저장편지를 수저할 때"){
94+
95+
`when`("사용자 아이디와 임시 저장 편지 아이디, 내용, 발신자 이름, 이미지를 입력하면"){
96+
val command = UpdateDraftLetterUsecase.Command.Physical(
97+
draftId = "draftId",
98+
userId = "userId",
99+
content = "content",
100+
images = listOf("image1", "image2"),
101+
senderName = "senderName",
102+
)
103+
val receiveDraftLetter = ReceiveDraftLetter.default(DomainId(command.userId))
104+
every {
105+
mockReceiveDraftLetterManagementPort.getDraftLetterNotNull(
106+
draftId = receiveDraftLetter.id,
107+
ownerId = receiveDraftLetter.ownerId,
108+
)
109+
} returns receiveDraftLetter
110+
draftLetterCommandService.command(command)
111+
then("받은 임시 저장편지를 수정한다"){
112+
verify { mockReceiveDraftLetterManagementPort.save(any()) }
113+
}
114+
}
115+
116+
`when`("임시 저장 편지가 없으면"){
117+
118+
val command = UpdateDraftLetterUsecase.Command.Physical(
119+
draftId = "draftId",
120+
userId = "userId",
121+
content = "content",
122+
images = listOf("image1", "image2"),
123+
senderName = "senderName",
124+
)
125+
every {
126+
mockReceiveDraftLetterManagementPort.getDraftLetterNotNull(
127+
draftId = DomainId(command.draftId),
128+
ownerId = DomainId(command.userId),
129+
)
130+
} throws LetterException.DraftLetterNotFoundException()
131+
then("임시 저장 편지가 수정되지 않는다"){
132+
verify(exactly = 0) {
133+
mockReceiveDraftLetterManagementPort.save(any())
134+
}
135+
}
136+
}
137+
}
89138
})

Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterApplicationConfig.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.asap.application.letter
22

33
import com.asap.application.letter.port.out.DraftLetterManagementPort
44
import com.asap.application.letter.port.out.IndependentLetterManagementPort
5+
import com.asap.application.letter.port.out.ReceiveDraftLetterManagementPort
56
import com.asap.application.letter.port.out.SendLetterManagementPort
67
import com.asap.application.letter.port.out.SpaceLetterManagementPort
78
import org.springframework.boot.test.context.TestConfiguration
@@ -13,6 +14,7 @@ class LetterApplicationConfig(
1314
private val independentLetterManagementPort: IndependentLetterManagementPort,
1415
private val spaceLetterManagementPort: SpaceLetterManagementPort,
1516
private val draftLetterManagementPort: DraftLetterManagementPort,
17+
private val receiveDraftLetterManagementPort: ReceiveDraftLetterManagementPort,
1618
) {
1719
@Bean
1820
fun letterMockManager(): LetterMockManager =
@@ -21,5 +23,6 @@ class LetterApplicationConfig(
2123
independentLetterManagementPort,
2224
spaceLetterManagementPort,
2325
draftLetterManagementPort,
26+
receiveDraftLetterManagementPort
2427
)
2528
}

Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
package com.asap.application.letter
22

3-
import com.asap.application.letter.port.out.DraftLetterManagementPort
4-
import com.asap.application.letter.port.out.IndependentLetterManagementPort
5-
import com.asap.application.letter.port.out.SendLetterManagementPort
6-
import com.asap.application.letter.port.out.SpaceLetterManagementPort
3+
import com.asap.application.letter.port.out.*
74
import com.asap.domain.common.DomainId
8-
import com.asap.domain.letter.entity.DraftLetter
9-
import com.asap.domain.letter.entity.IndependentLetter
10-
import com.asap.domain.letter.entity.SendLetter
11-
import com.asap.domain.letter.entity.SpaceLetter
5+
import com.asap.domain.letter.entity.*
126
import com.asap.domain.letter.service.LetterCodeGenerator
137
import com.asap.domain.letter.vo.LetterContent
148
import com.asap.domain.letter.vo.ReceiverInfo
@@ -21,6 +15,7 @@ class LetterMockManager(
2115
private val independentLetterManagementPort: IndependentLetterManagementPort,
2216
private val spaceLetterManagementPort: SpaceLetterManagementPort,
2317
private val draftLetterManagementPort: DraftLetterManagementPort,
18+
private val receiveDraftLetterManagementPort: ReceiveDraftLetterManagementPort,
2419
) {
2520
private val letterCodeGenerator = LetterCodeGenerator()
2621

@@ -158,4 +153,10 @@ class LetterMockManager(
158153
draftLetterManagementPort.save(draftLetter)
159154
return draftLetter.id.value
160155
}
156+
157+
fun generateMockReceiveDraftLetter(userId: String): String {
158+
val receiveDraftLetter = ReceiveDraftLetter.default(DomainId(userId))
159+
receiveDraftLetterManagementPort.save(receiveDraftLetter)
160+
return receiveDraftLetter.id.value
161+
}
161162
}

Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/api/DraftLetterApi.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ interface DraftLetterApi {
6464
@RequestBody request: UpdateDraftLetterRequest,
6565
)
6666

67+
@Operation(summary = "실물 편지 임시 저장하기")
68+
@PostMapping("/physical/{draftId}")
69+
@ApiResponses(
70+
value = [
71+
ApiResponse(responseCode = "200", description = "임시 저장 성공"),
72+
],
73+
)
74+
fun updatePhysicalDraft(
75+
@PathVariable draftId: String,
76+
@AccessUser userId: String,
77+
@RequestBody request: UpdatePhysicalDraftLetterRequest,
78+
)
79+
6780
@Operation(summary = "임시 저장 목록 조회")
6881
@GetMapping()
6982
@ApiResponses(

Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/web/letter/controller/DraftLetterController.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class DraftLetterController(
3131
request: UpdateDraftLetterRequest,
3232
) {
3333
updateDraftLetterUsecase.command(
34-
UpdateDraftLetterUsecase.Command(
34+
UpdateDraftLetterUsecase.Command.Send(
3535
draftId = draftId,
3636
userId = userId,
3737
content = request.content,
@@ -41,6 +41,22 @@ class DraftLetterController(
4141
)
4242
}
4343

44+
override fun updatePhysicalDraft(
45+
draftId: String,
46+
userId: String,
47+
request: UpdatePhysicalDraftLetterRequest
48+
) {
49+
updateDraftLetterUsecase.command(
50+
UpdateDraftLetterUsecase.Command.Physical(
51+
draftId = draftId,
52+
userId = userId,
53+
content = request.content,
54+
images = request.images,
55+
senderName = request.senderName,
56+
),
57+
)
58+
}
59+
4460
override fun getAllDrafts(userId: String): GetAllDraftLetterResponse =
4561
getDraftLetterUsecase
4662
.getAll(GetDraftLetterUsecase.Query.All(userId))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.asap.bootstrap.web.letter.dto
2+
3+
data class UpdatePhysicalDraftLetterRequest(
4+
val senderName: String,
5+
val content: String,
6+
val images: List<String>
7+
) {
8+
}

0 commit comments

Comments
 (0)