Skip to content

Commit

Permalink
Merge pull request #85 from ASAP-Lettering/ASAP-198
Browse files Browse the repository at this point in the history
ASAP-198 feat: 전체 편지 수 조회 api 추가
  • Loading branch information
tlarbals824 authored Oct 12, 2024
2 parents 1bfbabb + 9f5489a commit 42d71e2
Show file tree
Hide file tree
Showing 15 changed files with 249 additions and 40 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.asap.application.letter.port.`in`

interface GetAllLetterCountUsecase {
fun get(query: Query): Response

data class Query(
val userId: String,
)

data class Response(
val count: Long,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ interface IndependentLetterManagementPort {
userId: DomainId,
): IndependentLetter

fun countIndependentLetterByReceiverId(receiverId: DomainId): Int
fun countIndependentLetterByReceiverId(receiverId: DomainId): Long

fun getNearbyLetter(
userId: DomainId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,37 @@ import com.asap.domain.letter.entity.IndependentLetter
import com.asap.domain.letter.entity.SpaceLetter

interface SpaceLetterManagementPort {


fun save(letter: SpaceLetter)

fun saveByIndependentLetter(
letter: IndependentLetter,
spaceId: DomainId,
userId: DomainId
userId: DomainId,
): SpaceLetter

fun getSpaceLetterNotNull(id: DomainId, userId: DomainId): SpaceLetter
fun getSpaceLetterNotNull(
id: DomainId,
userId: DomainId,
): SpaceLetter

fun getNearbyLetter(spaceId: DomainId, userId: DomainId, letterId: DomainId): Pair<SpaceLetter?, SpaceLetter?>
fun getNearbyLetter(
spaceId: DomainId,
userId: DomainId,
letterId: DomainId,
): Pair<SpaceLetter?, SpaceLetter?>

fun countLetterBySpaceId(spaceId: DomainId): Long
fun countSpaceLetterBy(
spaceId: DomainId,
receiverId: DomainId,
): Long

fun countAllSpaceLetterBy(receiverId: DomainId): Long

fun getAllBySpaceId(spaceId: DomainId, userId: DomainId, pageRequest: PageRequest): Page<SpaceLetter>
fun getAllBy(
spaceId: DomainId,
userId: DomainId,
pageRequest: PageRequest,
): Page<SpaceLetter>

fun delete(letter: SpaceLetter)

}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.asap.application.letter.service

import com.asap.application.letter.port.`in`.GetIndependentLettersUsecase
import com.asap.application.letter.port.`in`.GetSpaceLetterDetailUsecase
import com.asap.application.letter.port.`in`.GetSpaceLettersUsecase
import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase
import com.asap.application.letter.port.`in`.*
import com.asap.application.letter.port.out.IndependentLetterManagementPort
import com.asap.application.letter.port.out.SendLetterManagementPort
import com.asap.application.letter.port.out.SpaceLetterManagementPort
Expand All @@ -25,7 +22,8 @@ class LetterQueryService(
) : GetVerifiedLetterUsecase,
GetIndependentLettersUsecase,
GetSpaceLettersUsecase,
GetSpaceLetterDetailUsecase {
GetSpaceLetterDetailUsecase,
GetAllLetterCountUsecase {
override fun get(query: GetVerifiedLetterUsecase.Query): GetVerifiedLetterUsecase.Response {
sendLetterManagementPort
.getReadLetterNotNull(
Expand Down Expand Up @@ -60,10 +58,14 @@ class LetterQueryService(
@Transactional
override fun get(query: GetIndependentLettersUsecase.Query): GetIndependentLettersUsecase.Response.One {
val letter =
independentLetterManagementPort.getIndependentLetterByIdNotNull(DomainId(query.letterId), DomainId(query.userId)).apply {
read()
independentLetterManagementPort.save(this)
}
independentLetterManagementPort
.getIndependentLetterByIdNotNull(
DomainId(query.letterId),
DomainId(query.userId),
).apply {
read()
independentLetterManagementPort.save(this)
}
val letterCount = independentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId))
val (prevLetter, nextLetter) =
independentLetterManagementPort.getNearbyLetter(DomainId(query.userId), DomainId(query.letterId))
Expand Down Expand Up @@ -93,7 +95,7 @@ class LetterQueryService(

override fun get(query: GetSpaceLettersUsecase.Query): GetSpaceLettersUsecase.Response {
val letters =
spaceLetterManagementPort.getAllBySpaceId(
spaceLetterManagementPort.getAllBy(
spaceId = DomainId(query.spaceId),
userId = DomainId(query.userId),
pageRequest =
Expand Down Expand Up @@ -123,10 +125,14 @@ class LetterQueryService(
spaceLetterManagementPort.getSpaceLetterNotNull(DomainId(query.letterId), DomainId(query.userId))
val space =
spaceManagementPort.getSpaceNotNull(
spaceLetter.receiver.receiverId,
spaceLetter.spaceId,
userId = spaceLetter.receiver.receiverId,
spaceId = spaceLetter.spaceId,
)
val letterCount =
spaceLetterManagementPort.countSpaceLetterBy(
spaceId = spaceLetter.spaceId,
receiverId = spaceLetter.receiver.receiverId,
)
val letterCount = spaceLetterManagementPort.countLetterBySpaceId(spaceLetter.spaceId)
val (prevLetter, nextLetter) =
spaceLetterManagementPort.getNearbyLetter(
spaceId = spaceLetter.spaceId,
Expand Down Expand Up @@ -157,4 +163,12 @@ class LetterQueryService(
},
)
}

override fun get(query: GetAllLetterCountUsecase.Query): GetAllLetterCountUsecase.Response {
val independentLetterCount = independentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId))
val spaceLetterCount = spaceLetterManagementPort.countAllSpaceLetterBy(DomainId(query.userId))
return GetAllLetterCountUsecase.Response(
count = independentLetterCount + spaceLetterCount,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class SpaceQueryService(
spaces.map {
SpaceGetUsecase.SpaceDetail(
spaceName = it.name,
letterCount = spaceLetterManagementPort.countLetterBySpaceId(it.id),
letterCount = spaceLetterManagementPort.countSpaceLetterBy(it.id, DomainId(query.userId)),
isMainSpace = it.isMain(),
spaceIndex = it.index,
spaceId = it.id.value,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.asap.application.letter.service

import com.asap.application.letter.port.`in`.GetAllLetterCountUsecase
import com.asap.application.letter.port.`in`.GetIndependentLettersUsecase
import com.asap.application.letter.port.`in`.GetSpaceLetterDetailUsecase
import com.asap.application.letter.port.`in`.GetVerifiedLetterUsecase
Expand Down Expand Up @@ -212,7 +213,10 @@ class LetterQueryServiceTest :
)
} returns space
every {
mockSpaceLetterManagementPort.countLetterBySpaceId(spaceLetter.spaceId)
mockSpaceLetterManagementPort.countSpaceLetterBy(
spaceLetter.spaceId,
spaceLetter.receiver.receiverId,
)
} returns 3
every {
mockSpaceLetterManagementPort.getNearbyLetter(
Expand Down Expand Up @@ -346,4 +350,19 @@ class LetterQueryServiceTest :
}
}
}

given("전체 편지 조회 요청이 들어올 떄") {
val independentLetterCount = 10L
val spaceLetterCount = 20L
val query = GetAllLetterCountUsecase.Query("userId")
every { mockIndependentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId)) } returns
independentLetterCount
every { mockSpaceLetterManagementPort.countAllSpaceLetterBy(DomainId(query.userId)) } returns spaceLetterCount
`when`("유저 아이디가 주어진다면") {
val response = letterQueryService.get(query)
then("전체 편지 개수를 반환한다") {
response.count shouldBe independentLetterCount + spaceLetterCount
}
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class SpaceQueryServiceTest :
userId = "userId",
)
every { spaceManagementPort.getAllIndexedSpace(DomainId(query.userId)) } returns indexedSpaces
every { spaceLetterManagementPort.countLetterBySpaceId(any()) } returns 0
every { spaceLetterManagementPort.countSpaceLetterBy(any(), any()) } returns 0
`when`("유저 아이디가 주어진다면") {
val response = spaceQueryService.getAll(query)
then("모든 스페이스를 반환한다") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,31 @@ interface LetterApi {
@AccessUser userId: String,
): GetIndependentLetterDetailResponse

@Operation(summary = "궤도 편지 삭제")
@DeleteMapping("/independent/{letterId}")
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "궤도 편지 삭제 성공",
),
],
)
fun deleteIndependentLetter(
@PathVariable letterId: String,
@AccessUser userId: String,
)

@Operation(summary = "편지 수정")
@PutMapping("/independent/{letterId}/content")
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "편지 수정 성공",
),
],
)
fun updateIndependentLetter(
@PathVariable letterId: String,
@RequestBody request: ModifyLetterRequest,
Expand Down Expand Up @@ -217,4 +234,24 @@ interface LetterApi {
@RequestBody request: SendLetterRequest,
@AccessUser userId: String,
): SendLetterResponse

@Operation(summary = "모든 편지 수 조회")
@GetMapping("/count")
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "모든 편지 수 조회 성공",
content = [
Content(
mediaType = "application/json",
schema = Schema(implementation = AllLetterCountResponse::class),
),
],
),
],
)
fun getLetterCount(
@AccessUser userId: String,
): AllLetterCountResponse
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class LetterController(
private val getIndependentLettersUsecase: GetIndependentLettersUsecase,
private val removeLetterUsecase: RemoveLetterUsecase,
private val updateLetterUsecase: UpdateLetterUsecase,
private val getAllLetterCountUsecase: GetAllLetterCountUsecase,
) : LetterApi {
override fun verifyLetter(
request: LetterVerifyRequest,
Expand Down Expand Up @@ -183,4 +184,16 @@ class LetterController(
letterCode = response.letterCode,
)
}

override fun getLetterCount(userId: String): AllLetterCountResponse {
val response =
getAllLetterCountUsecase.get(
GetAllLetterCountUsecase.Query(
userId = userId,
),
)
return AllLetterCountResponse(
count = response.count,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.asap.bootstrap.letter.dto

data class AllLetterCountResponse(
val count: Long,
)
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,7 @@ abstract class LetterAcceptanceSupporter : AcceptanceSupporter() {

@MockBean
lateinit var updateLetterUsecase: UpdateLetterUsecase

@MockBean
lateinit var getAllLetterCountUsecase: GetAllLetterCountUsecase
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.asap.bootstrap.acceptance.letter.controller

import com.asap.application.letter.port.`in`.GetIndependentLettersUsecase
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.acceptance.letter.LetterAcceptanceSupporter
import com.asap.bootstrap.letter.dto.*
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -379,4 +376,34 @@ class LetterControllerTest : LetterAcceptanceSupporter() {
status { isOk() }
}
}

@Test
fun getAllLetterCount() {
// given
val accessToken = jwtMockManager.generateAccessToken()
val response = GetAllLetterCountUsecase.Response(5)
BDDMockito
.given(
getAllLetterCountUsecase.get(
GetAllLetterCountUsecase.Query(
userId = "userId",
),
),
).willReturn(response)
// when
val result =
mockMvc.get("/api/v1/letters/count") {
contentType = MediaType.APPLICATION_JSON
header("Authorization", "Bearer $accessToken")
}
// then
result.andExpect {
status { isOk() }
jsonPath("$.count") {
exists()
isNumber()
value(5)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -628,4 +628,34 @@ class LetterApiIntegrationTest : IntegrationSupporter() {
status { isOk() }
}
}

@Test
fun getAllLetterCount() {
// given
val senderId = userMockManager.settingUser()
val receiverId = userMockManager.settingUser()
val accessToken = jwtMockManager.generateAccessToken(receiverId)
(0..3).forEach {
letterMockManager.generateMockIndependentLetter(
senderId = senderId,
receiverId = receiverId,
senderName = "senderUsername",
)
}
// when
val response =
mockMvc.get("/api/v1/letters/count") {
contentType = MediaType.APPLICATION_JSON
header("Authorization", "Bearer $accessToken")
}
// then
response.andExpect {
status { isOk() }
jsonPath("$.count") {
exists()
isNumber()
value(4)
}
}
}
}
Loading

0 comments on commit 42d71e2

Please sign in to comment.