feat(gift): 선물 받을 주소 관리자 API를 추가한다

This commit is contained in:
2026-10-01 22:57:39 +09:00
parent 33b6662cb4
commit 8a95dc171d
4 changed files with 90 additions and 0 deletions
@@ -5,6 +5,8 @@ import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftCategoryRequest
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftCategoryResponse
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftDetailResponse
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftListResponse
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftMailboxRequest
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftMailboxResponse
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftMarkUndeliverableRequest
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftOperationStatusResponse
import kr.co.vividnext.sodalive.v2.api.admin.gift.dto.AdminGiftSizePriceRequest
@@ -45,6 +47,14 @@ class AdminGiftController(
AdminGiftDetailResponse.from(queryService.getGiftDetail(applicationNo))
)
@GetMapping("/gift-mailbox")
fun getMailbox() = ApiResponse.ok(service.getMailbox()?.let { AdminGiftMailboxResponse.from(it) })
@PutMapping("/gift-mailbox")
fun updateMailbox(@RequestBody request: AdminGiftMailboxRequest) = ApiResponse.ok(
AdminGiftMailboxResponse.from(service.updateMailbox(request.toCommand()))
)
@GetMapping("/gift-categories")
fun getCategories() = ApiResponse.ok(service.getCategories().map { AdminGiftCategoryResponse.from(it) })
@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.api.admin.gift.dto
import kr.co.vividnext.sodalive.v2.gift.application.GiftCategoryCommand
import kr.co.vividnext.sodalive.v2.gift.application.GiftMailboxCommand
import kr.co.vividnext.sodalive.v2.gift.application.GiftSizePriceCommand
data class AdminGiftCategoryRequest(
@@ -35,6 +36,22 @@ data class AdminGiftSizePriceRequest(
)
}
data class AdminGiftMailboxRequest(
val name: String,
val phoneNumber: String,
val zipCode: String,
val address: String,
val addressDetail: String?
) {
fun toCommand() = GiftMailboxCommand(
name = name,
phoneNumber = phoneNumber,
zipCode = zipCode,
address = address,
addressDetail = addressDetail
)
}
data class AdminGiftMarkUndeliverableRequest(
val reason: String
)
@@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.v2.gift.application.AdminGiftListResult
import kr.co.vividnext.sodalive.v2.gift.application.AdminGiftMemberInfoResult
import kr.co.vividnext.sodalive.v2.gift.application.AdminGiftProductInfoResult
import kr.co.vividnext.sodalive.v2.gift.application.GiftCategoryResult
import kr.co.vividnext.sodalive.v2.gift.application.GiftMailboxResult
import kr.co.vividnext.sodalive.v2.gift.application.GiftOperationStatusResult
import kr.co.vividnext.sodalive.v2.gift.application.GiftSizePriceResult
import kr.co.vividnext.sodalive.v2.gift.domain.GiftStatus
@@ -70,6 +71,20 @@ data class AdminGiftOperationStatusResponse(
}
}
data class AdminGiftMailboxResponse(
val name: String,
val address: String,
val phoneNumber: String
) {
companion object {
fun from(result: GiftMailboxResult) = AdminGiftMailboxResponse(
name = result.name,
address = result.address,
phoneNumber = result.phoneNumber
)
}
}
data class AdminGiftListResponse(
val totalCount: Long,
val items: List<AdminGiftListItemResponse>,
@@ -59,6 +59,54 @@ class AdminGiftControllerTest @Autowired constructor(
categoryRepository.deleteAll()
}
@Test
@DisplayName("관리자는 받을 주소를 조회하고 저장한다")
fun shouldManageGiftMailbox() {
mockMvc.perform(get("/api/v2/admin/gift-mailbox").with(user("admin").roles("ADMIN")))
.andExpect(status().isOk)
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.data").isEmpty)
mockMvc.perform(
put("/api/v2/admin/gift-mailbox")
.with(user("admin").roles("ADMIN"))
.contentType(MediaType.APPLICATION_JSON)
.content(
"""
{
"name":"소다라이브 선물 담당자",
"phoneNumber":"01012345678",
"zipCode":"06234",
"address":"서울시 강남구",
"addressDetail":"3층 선물 접수처"
}
""".trimIndent()
)
)
.andExpect(status().isOk)
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.data.name").value("소다라이브 선물 담당자"))
.andExpect(jsonPath("$.data.phoneNumber").value("01012345678"))
.andExpect(jsonPath("$.data.address").value("(06234) 서울시 강남구, 3층 선물 접수처"))
mockMvc.perform(get("/api/v2/admin/gift-mailbox").with(user("admin").roles("ADMIN")))
.andExpect(status().isOk)
.andExpect(jsonPath("$.data.name").value("소다라이브 선물 담당자"))
}
@Test
@DisplayName("관리자는 공백 받을 주소를 저장할 수 없다")
fun shouldRejectInvalidGiftMailbox() {
mockMvc.perform(
put("/api/v2/admin/gift-mailbox")
.with(user("admin").roles("ADMIN"))
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":" ","phoneNumber":"01012345678","zipCode":"06234","address":"서울시 강남구"}""")
)
.andExpect(status().isOk)
.andExpect(jsonPath("$.success").value(false))
}
@Test
@DisplayName("관리자는 전체 선물함 목록을 필터링해 조회한다")
fun shouldListAdminGifts() {