From 892a5f4eb4a60cc8d164c414dd22785d674fbcc4 Mon Sep 17 00:00:00 2001 From: Sim-km Date: Fri, 13 Sep 2024 18:55:22 +0900 Subject: [PATCH 1/2] =?UTF-8?q?ASAP-122=20feat:=20=EA=B6=A4=EB=8F=84=20?= =?UTF-8?q?=ED=8E=B8=EC=A7=80=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=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 --- .../port/in/GetIndependentLettersUsecase.kt | 20 +++ .../port/in/GetVerifiedLetterUsecase.kt | 2 +- .../out/IndependentLetterManagementPort.kt | 3 + ...emoryIndependentLetterManagementAdapter.kt | 52 +++++++- .../letter/service/LetterQueryService.kt | 22 +++- .../letter/service/LetterQueryServiceTest.kt | 116 ++++++++++++++++++ .../letter/LetterApplicationConfig.kt | 6 +- .../application/letter/LetterMockManager.kt | 25 +++- .../asap/bootstrap/letter/api/LetterApi.kt | 6 +- .../letter/controller/LetterController.kt | 33 +++-- .../dto/GetIndependentLetterSimpleInfo.kt | 8 ++ .../letter/controller/LetterControllerTest.kt | 59 ++++++++- .../letter/LetterApiIntegrationTest.kt | 43 +++++++ .../com/asap/common/page/SliceResponse.kt | 15 +++ .../security/jwt/user/UserJwtProperties.kt | 2 +- 15 files changed, 386 insertions(+), 26 deletions(-) create mode 100644 Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetIndependentLettersUsecase.kt create mode 100644 Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt create mode 100644 Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/GetIndependentLetterSimpleInfo.kt create mode 100644 Common-Module/src/main/kotlin/com/asap/common/page/SliceResponse.kt diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetIndependentLettersUsecase.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetIndependentLettersUsecase.kt new file mode 100644 index 0000000..5cb2e46 --- /dev/null +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/port/in/GetIndependentLettersUsecase.kt @@ -0,0 +1,20 @@ +package com.asap.application.letter.port.`in` + +interface GetIndependentLettersUsecase { + + fun get(query: Query): Response + + data class Query( + val userId: String + ) + + data class Response( + val letters: List + ) + + data class LetterInfo( + val letterId: String, + val senderName: String, + val isNew: Boolean + ) +} \ No newline at end of file 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 edd3ab4..da126c9 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 @@ -4,7 +4,7 @@ import java.time.LocalDate interface GetVerifiedLetterUsecase { - fun receive( + fun get( query: Query ): Response diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/IndependentLetterManagementPort.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/IndependentLetterManagementPort.kt index 84deedf..5308cbb 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/IndependentLetterManagementPort.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/IndependentLetterManagementPort.kt @@ -1,8 +1,11 @@ package com.asap.application.letter.port.out +import com.asap.domain.common.DomainId import com.asap.domain.letter.entity.IndependentLetter interface IndependentLetterManagementPort { fun save(letter: IndependentLetter) + + fun getAllByReceiverId(receiverId: DomainId): List } \ No newline at end of file diff --git a/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/memory/MemoryIndependentLetterManagementAdapter.kt b/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/memory/MemoryIndependentLetterManagementAdapter.kt index 3e844d0..147d7a3 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/memory/MemoryIndependentLetterManagementAdapter.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/letter/port/out/memory/MemoryIndependentLetterManagementAdapter.kt @@ -1,17 +1,65 @@ package com.asap.application.letter.port.out.memory import com.asap.application.letter.port.out.IndependentLetterManagementPort +import com.asap.domain.common.DomainId import com.asap.domain.letter.entity.IndependentLetter import org.springframework.stereotype.Component +import java.time.LocalDate +import java.time.LocalDateTime @Component class MemoryIndependentLetterManagementAdapter( ): IndependentLetterManagementPort { - private val independentLetters = mutableListOf() + private val independentLetters = mutableListOf() override fun save(letter: IndependentLetter) { - independentLetters.add(letter) + independentLetters.add(IndependentLetterEntity.fromDomain(letter)) + } + + override fun getAllByReceiverId(receiverId: DomainId): List { + return independentLetters.filter { it.receiverId == receiverId.value }.map { it.toDomain() } + } + + + data class IndependentLetterEntity( + val id: String, + val senderId: String, + val receiverId: String, + val content: String, + val createdDate: LocalDate, + val templateType: Int, + val images: List, + val isNew: Boolean, + val createdAt: LocalDateTime = LocalDateTime.now() + ){ + fun toDomain(): IndependentLetter { + return IndependentLetter( + id = DomainId(id), + senderId = DomainId(senderId), + receiverId = DomainId(receiverId), + content = content, + receiveDate = createdDate, + templateType = templateType, + images = images, + isNew = isNew + ) + } + + companion object{ + fun fromDomain(letter: IndependentLetter): IndependentLetterEntity { + return IndependentLetterEntity( + id = letter.id.value, + senderId = letter.senderId.value, + receiverId = letter.receiverId.value, + content = letter.content, + createdDate = letter.receiveDate, + templateType = letter.templateType, + images = letter.images, + isNew = letter.isNew + ) + } + } } } \ 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 42b2af0..49d8c90 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 @@ -1,6 +1,8 @@ package com.asap.application.letter.service +import com.asap.application.letter.port.`in`.GetIndependentLettersUsecase import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase +import com.asap.application.letter.port.out.IndependentLetterManagementPort import com.asap.application.letter.port.out.SendLetterManagementPort import com.asap.application.user.port.out.UserManagementPort import com.asap.domain.common.DomainId @@ -9,10 +11,11 @@ import org.springframework.stereotype.Service @Service class LetterQueryService( private val sendLetterManagementPort: SendLetterManagementPort, - private val userManagementPort: UserManagementPort -) : GetVerifiedLetterUsecase { + private val userManagementPort: UserManagementPort, + private val independentLetterManagementPort: IndependentLetterManagementPort +) : GetVerifiedLetterUsecase, GetIndependentLettersUsecase { - override fun receive(query: GetVerifiedLetterUsecase.Query): GetVerifiedLetterUsecase.Response { + override fun get(query: GetVerifiedLetterUsecase.Query): GetVerifiedLetterUsecase.Response { sendLetterManagementPort.getExpiredLetterNotNull( receiverId = DomainId(query.userId), letterId = DomainId(query.letterId) @@ -27,4 +30,17 @@ class LetterQueryService( ) } } + + override fun get(query: GetIndependentLettersUsecase.Query): GetIndependentLettersUsecase.Response { + val letters = independentLetterManagementPort.getAllByReceiverId(DomainId(query.userId)) + return GetIndependentLettersUsecase.Response( + letters = letters.map { + GetIndependentLettersUsecase.LetterInfo( + letterId = it.id.value, + senderName = userManagementPort.getUserNotNull(it.senderId).username, // TODO: N+1 문제발생함(해결 필요) + isNew = it.isNew + ) + } + ) + } } \ No newline at end of file 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 new file mode 100644 index 0000000..9090730 --- /dev/null +++ b/Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt @@ -0,0 +1,116 @@ +package com.asap.application.letter.service + +import com.asap.application.letter.port.`in`.GetIndependentLettersUsecase +import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase +import com.asap.application.letter.port.out.IndependentLetterManagementPort +import com.asap.application.letter.port.out.SendLetterManagementPort +import com.asap.application.user.port.out.UserManagementPort +import com.asap.domain.common.DomainId +import com.asap.domain.letter.entity.IndependentLetter +import com.asap.domain.letter.entity.SendLetter +import com.asap.domain.user.entity.User +import com.asap.domain.user.vo.UserPermission +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.mockk +import java.time.LocalDate + +class LetterQueryServiceTest:BehaviorSpec({ + + val mockSendLetterManagementPort = mockk(relaxed = true) + val mockUserManagementPort = mockk(relaxed = true) + val mockIndependentLetterManagementPort = mockk(relaxed = true) + + val letterQueryService = LetterQueryService( + mockSendLetterManagementPort, + mockUserManagementPort, + mockIndependentLetterManagementPort + ) + + + given("검증된 편지를 가져올 때") { + val query = GetVerifiedLetterUsecase.Query( + letterId = "letter-id", + userId = "user-id" + ) + val mockSendLetter = SendLetter( + id = DomainId(query.letterId), + receiverName = "receiver-name", + content = "content", + images = listOf("image1", "image2"), + templateType = 1, + senderId = DomainId.generate(), + letterCode = "letter-code" + ) + val mockSender = User( + id = mockSendLetter.senderId, + username = "sender-name", + profileImage = "profile-image", + permission = UserPermission(true, true, true), + birthday = null + ) + every { + mockSendLetterManagementPort.getExpiredLetterNotNull( + receiverId = DomainId(query.userId), + letterId = DomainId(query.letterId) + ) + } returns mockSendLetter + every { + mockUserManagementPort.getUserNotNull(mockSender.id) + } returns mockSender + `when`("편지가 존재하면") { + val response = letterQueryService.get(query) + then("편지 정보를 가져와야 한다") { + response.senderName shouldBe mockSender.username + response.content shouldBe mockSendLetter.content + response.sendDate shouldBe mockSendLetter.createdDate + response.templateType shouldBe mockSendLetter.templateType + response.images shouldBe mockSendLetter.images + } + } + } + + + given("모든 무소속 편지를 조회할 떄"){ + val query = GetIndependentLettersUsecase.Query( + userId = "user-id" + ) + val mockLetters = listOf( + IndependentLetter( + id = DomainId.generate(), + senderId = DomainId.generate(), + receiverId = DomainId(query.userId), + isNew = true, + content = "content", + receiveDate = LocalDate.now(), + images = listOf("image1", "image2"), + templateType = 1 + ) + ) + val mockSenders = listOf( + User( + id = mockLetters[0].senderId, + username = "sender-name", + profileImage = "profile-image", + permission = UserPermission(true, true, true), + birthday = null + ) + ) + every { + mockIndependentLetterManagementPort.getAllByReceiverId(DomainId(query.userId)) + } returns mockLetters + every { + mockUserManagementPort.getUserNotNull(mockSenders[0].id) + } returns mockSenders[0] + `when`("편지가 존재하면"){ + val response = letterQueryService.get(query) + then("편지 정보를 가져와야 한다"){ + response.letters[0].letterId shouldBe mockLetters[0].id.value + response.letters[0].senderName shouldBe mockSenders[0].username + response.letters[0].isNew shouldBe mockLetters[0].isNew + } + } + } +}) { +} \ No newline at end of file diff --git a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterApplicationConfig.kt b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterApplicationConfig.kt index 975e7b2..a448f5c 100644 --- a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterApplicationConfig.kt +++ b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterApplicationConfig.kt @@ -1,16 +1,18 @@ package com.asap.application.letter +import com.asap.application.letter.port.out.IndependentLetterManagementPort import com.asap.application.letter.port.out.SendLetterManagementPort import org.springframework.boot.test.context.TestConfiguration import org.springframework.context.annotation.Bean @TestConfiguration class LetterApplicationConfig( - private val sendLetterManagementPort: SendLetterManagementPort + private val sendLetterManagementPort: SendLetterManagementPort, + private val independentLetterManagementPort: IndependentLetterManagementPort ) { @Bean fun letterMockManager(): LetterMockManager { - return LetterMockManager(sendLetterManagementPort) + return LetterMockManager(sendLetterManagementPort,independentLetterManagementPort) } } \ No newline at end of file diff --git a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt index 75832e9..1622e0a 100644 --- a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt +++ b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt @@ -1,12 +1,16 @@ package com.asap.application.letter +import com.asap.application.letter.port.out.IndependentLetterManagementPort import com.asap.application.letter.port.out.SendLetterManagementPort import com.asap.domain.common.DomainId +import com.asap.domain.letter.entity.IndependentLetter import com.asap.domain.letter.entity.SendLetter import com.asap.domain.letter.service.LetterCodeGenerator +import java.time.LocalDate class LetterMockManager( - private val sendLetterManagementPort: SendLetterManagementPort + private val sendLetterManagementPort: SendLetterManagementPort, + private val independentLetterManagementPort: IndependentLetterManagementPort ) { private val letterCodeGenerator = LetterCodeGenerator() @@ -64,4 +68,23 @@ class LetterMockManager( return false } } + + fun generateMockIndependentLetter( + senderId: String, + receiverId: String + ): Map{ + val independentLetter = IndependentLetter( + senderId = DomainId(senderId), + receiverId = DomainId(receiverId), + content = "content", + receiveDate = LocalDate.now(), + templateType = 1, + images = listOf("image1", "image2"), + isNew = true + ) + independentLetterManagementPort.save(independentLetter) + return mapOf( + "letterId" to independentLetter.id.value, + ) + } } \ No newline at end of file diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt index ec7a183..6948f6b 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt @@ -3,6 +3,7 @@ package com.asap.bootstrap.letter.api import com.asap.bootstrap.common.exception.ExceptionResponse import com.asap.bootstrap.common.security.annotation.AccessUser import com.asap.bootstrap.letter.dto.* +import com.asap.common.page.SliceResponse import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.media.Content import io.swagger.v3.oas.annotations.media.Schema @@ -135,9 +136,8 @@ interface LetterApi { @GetMapping("/independent") fun getIndependentLetters( - @RequestParam page: Int, - @RequestParam size: Int - ) + @AccessUser userId: String, + ): SliceResponse @GetMapping("/{letterId}") diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt index 1174294..36224b6 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt @@ -1,11 +1,9 @@ package com.asap.bootstrap.letter.controller -import com.asap.application.letter.port.`in`.AddLetterUsecase -import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase -import com.asap.application.letter.port.`in`.SendLetterUsecase -import com.asap.application.letter.port.`in`.VerifyLetterAccessibleUsecase +import com.asap.application.letter.port.`in`.* import com.asap.bootstrap.letter.api.LetterApi import com.asap.bootstrap.letter.dto.* +import com.asap.common.page.SliceResponse import org.springframework.web.bind.annotation.RestController @RestController @@ -13,7 +11,8 @@ class LetterController( private val sendLetterUsecase: SendLetterUsecase, private val verifyLetterAccessibleUsecase: VerifyLetterAccessibleUsecase, private val getVerifiedLetterUsecase: GetVerifiedLetterUsecase, - private val addLetterUsecase: AddLetterUsecase + private val addLetterUsecase: AddLetterUsecase, + private val getIndependentLettersUsecase: GetIndependentLettersUsecase ) : LetterApi { override fun verifyLetter( request: LetterVerifyRequest, @@ -34,7 +33,7 @@ class LetterController( letterId: String, userId: String ): VerifiedLetterInfoResponse { - val response = getVerifiedLetterUsecase.receive( + val response = getVerifiedLetterUsecase.get( GetVerifiedLetterUsecase.Query( userId = userId, letterId = letterId @@ -65,8 +64,26 @@ class LetterController( TODO("Not yet implemented") } - override fun getIndependentLetters(page: Int, size: Int) { - TODO("Not yet implemented") + override fun getIndependentLetters( + userId: String + ): SliceResponse { + val response = getIndependentLettersUsecase.get( + GetIndependentLettersUsecase.Query( + userId = userId + ) + ) + return SliceResponse.of( + content = response.letters.map { + GetIndependentLetterSimpleInfo( + letterId = it.letterId, + senderName = it.senderName, + isNew = it.isNew + ) + }, + size = response.letters.size, + number = 0, + hasNext = false + ) } override fun getLetter(letterId: String) { diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/GetIndependentLetterSimpleInfo.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/GetIndependentLetterSimpleInfo.kt new file mode 100644 index 0000000..ca14e75 --- /dev/null +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/GetIndependentLetterSimpleInfo.kt @@ -0,0 +1,8 @@ +package com.asap.bootstrap.letter.dto + +data class GetIndependentLetterSimpleInfo( + val letterId: String, + val senderName: String, + val isNew: Boolean +) { +} \ No newline at end of file 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 3b7eb8b..8b8600a 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 @@ -1,9 +1,6 @@ package com.asap.bootstrap.acceptance.letter.controller -import com.asap.application.letter.port.`in`.AddLetterUsecase -import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase -import com.asap.application.letter.port.`in`.SendLetterUsecase -import com.asap.application.letter.port.`in`.VerifyLetterAccessibleUsecase +import com.asap.application.letter.port.`in`.* import com.asap.bootstrap.AcceptanceSupporter import com.asap.bootstrap.letter.controller.LetterController import com.asap.bootstrap.letter.dto.AddVerifiedLetterRequest @@ -34,6 +31,9 @@ class LetterControllerTest: AcceptanceSupporter() { @MockBean lateinit var addLetterUsecase: AddLetterUsecase + @MockBean + lateinit var getIndependentLettersUsecase: GetIndependentLettersUsecase + @Test fun verifyLetter() { @@ -118,7 +118,7 @@ class LetterControllerTest: AcceptanceSupporter() { images = listOf("images") ) BDDMockito.given( - getVerifiedLetterUsecase.receive( + getVerifiedLetterUsecase.get( GetVerifiedLetterUsecase.Query( letterId = "letterId", userId = "userId" @@ -177,4 +177,53 @@ class LetterControllerTest: AcceptanceSupporter() { status { isOk() } } } + + + @Test + fun getIndependentLetters() { + //given + val accessToken = testJwtDataGenerator.generateAccessToken() + val letterInfo = GetIndependentLettersUsecase.LetterInfo( + letterId = "letterId", + senderName = "senderName", + isNew = true + ) + val response = GetIndependentLettersUsecase.Response( + letters = listOf(letterInfo) + ) + BDDMockito.given( + getIndependentLettersUsecase.get( + GetIndependentLettersUsecase.Query( + userId = "userId" + ) + ) + ).willReturn(response) + //when + val result = mockMvc.get("/api/v1/letters/independent") { + contentType = MediaType.APPLICATION_JSON + header("Authorization", "Bearer $accessToken") + } + //then + result.andExpect { + status { isOk() } + jsonPath("$.content") { + exists() + isArray() + jsonPath("$.content[0].letterId") { + exists() + isString() + isNotEmpty() + } + jsonPath("$.content[0].senderName") { + exists() + isString() + isNotEmpty() + } + jsonPath("$.content[0].isNew") { + exists() + isBoolean() + } + } + } + } } \ No newline at end of file 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 564df4c..7fd607c 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 @@ -295,4 +295,47 @@ class LetterApiIntegrationTest : IntegrationSupporter() { } } } + + + @Test + fun getIndependentLetters() { + //given + val receiverId = userMockManager.settingUser() + val senderId = userMockManager.settingUser(username = "senderUsername") + val accessToken = testJwtDataGenerator.generateAccessToken(receiverId) + val independentLetter = letterMockManager.generateMockIndependentLetter( + senderId = senderId, + receiverId = receiverId + ) + val letterId = independentLetter["letterId"] as String + //when + val result = mockMvc.get("/api/v1/letters/independent") { + contentType = MediaType.APPLICATION_JSON + header("Authorization", "Bearer $accessToken") + } + //then + result.andExpect { + status { isOk() } + jsonPath("$.content") { + exists() + isArray() + jsonPath("$.content[0].letterId") { + exists() + isString() + isNotEmpty() + value(letterId) + } + jsonPath("$.content[0].senderName") { + exists() + isString() + isNotEmpty() + value("senderUsername") + } + jsonPath("$.content[0].isNew") { + exists() + isBoolean() + } + } + } + } } \ No newline at end of file diff --git a/Common-Module/src/main/kotlin/com/asap/common/page/SliceResponse.kt b/Common-Module/src/main/kotlin/com/asap/common/page/SliceResponse.kt new file mode 100644 index 0000000..c889fe1 --- /dev/null +++ b/Common-Module/src/main/kotlin/com/asap/common/page/SliceResponse.kt @@ -0,0 +1,15 @@ +package com.asap.common.page + +data class SliceResponse internal constructor( + val content: List, + val size: Int, + val number: Int, + val hasNext: Boolean +) { + + companion object{ + fun of(content: List, size: Int, number: Int, hasNext: Boolean): SliceResponse { + return SliceResponse(content, size, number, hasNext) + } + } +} \ No newline at end of file diff --git a/Infrastructure-Module/Security/src/main/kotlin/com/asap/security/jwt/user/UserJwtProperties.kt b/Infrastructure-Module/Security/src/main/kotlin/com/asap/security/jwt/user/UserJwtProperties.kt index 29a03bc..28a529a 100644 --- a/Infrastructure-Module/Security/src/main/kotlin/com/asap/security/jwt/user/UserJwtProperties.kt +++ b/Infrastructure-Module/Security/src/main/kotlin/com/asap/security/jwt/user/UserJwtProperties.kt @@ -10,7 +10,7 @@ class UserJwtProperties( companion object{ const val ISSUER = "asap" const val SUBJECT = "asap-auth" - const val ACCESS_TOKEN_EXPIRE_TIME: Long = 1000 * 60 // 1시간 + const val ACCESS_TOKEN_EXPIRE_TIME: Long = 1000 * 60 * 30 // 30분 const val REFRESH_TOKEN_EXPIRE_TIME: Long = 1000 * 60 * 60 * 24 // 1일 const val REGISTER_TOKEN_EXPIRE_TIME: Long = 1000 * 60 * 10 // 10분 } From 1b33ab76617ef2dd7550e40934436c485dabbc46 Mon Sep 17 00:00:00 2001 From: Sim-km Date: Fri, 13 Sep 2024 19:01:04 +0900 Subject: [PATCH 2/2] =?UTF-8?q?ASAP-122=20refactor:=20=EA=B6=A4=EB=8F=84?= =?UTF-8?q?=20=ED=8E=B8=EC=A7=80=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=99=B8=EB=B6=80=20=ED=8E=B8=EC=A7=80?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20url=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asap/bootstrap/letter/api/LetterApi.kt | 19 +++++++++++++++++-- .../letter/controller/LetterController.kt | 2 +- ...Request.kt => AddPhysicalLetterRequest.kt} | 5 ++--- 3 files changed, 20 insertions(+), 6 deletions(-) rename Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/{AddDirectLetterRequest.kt => AddPhysicalLetterRequest.kt} (58%) diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt index 6948f6b..7311d96 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/api/LetterApi.kt @@ -128,13 +128,28 @@ interface LetterApi { ) @Operation(summary = "실물 편지 내용 추가") - @PostMapping("/receive/direct") + @PostMapping("/physical/receive") fun addAnonymousLetter( - @RequestBody request: AddDirectLetterRequest + @RequestBody request: AddPhysicalLetterRequest ) + @Operation(summary = "궤도 편지 목록 조회") @GetMapping("/independent") + @ApiResponses( + value = [ + ApiResponse( + responseCode = "200", + description = "궤도 편지 목록 조회 성공", + content = [ + Content( + mediaType = "application/json", + schema = Schema(implementation = SliceResponse::class) + ) + ] + ) + ] + ) fun getIndependentLetters( @AccessUser userId: String, ): SliceResponse diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt index 36224b6..f90bedc 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/controller/LetterController.kt @@ -60,7 +60,7 @@ class LetterController( ) } - override fun addAnonymousLetter(request: AddDirectLetterRequest) { + override fun addAnonymousLetter(request: AddPhysicalLetterRequest) { TODO("Not yet implemented") } diff --git a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddDirectLetterRequest.kt b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddPhysicalLetterRequest.kt similarity index 58% rename from Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddDirectLetterRequest.kt rename to Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddPhysicalLetterRequest.kt index 82ab225..3df640a 100644 --- a/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddDirectLetterRequest.kt +++ b/Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/dto/AddPhysicalLetterRequest.kt @@ -1,12 +1,11 @@ package com.asap.bootstrap.letter.dto -import org.springframework.web.multipart.MultipartRequest import java.time.LocalDate -class AddDirectLetterRequest( +class AddPhysicalLetterRequest( val sender: String, val content: String, - val images: List, + val images: List, val receiveDate: LocalDate, val templateType: Int ) {