diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftController.kt index 564b91d5..be9c88d1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftController.kt @@ -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) }) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftRequest.kt index a53b906f..842dd9d7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftRequest.kt @@ -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 ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftResponse.kt index 32c9a606..9edfdcae 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/dto/AdminGiftResponse.kt @@ -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, diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftControllerTest.kt index db7dcb0e..da1787e5 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftControllerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/admin/gift/adapter/in/web/AdminGiftControllerTest.kt @@ -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() {