From 17117b3b2651bb653427bb290b32f6dc1034652c Mon Sep 17 00:00:00 2001 From: bum12ark Date: Fri, 4 Mar 2022 18:31:22 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor(store):=20=EB=A7=A4=EC=9E=A5=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20API,=20url=20mapping=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api/customer/store 로 url mapping 변경 - 테스트 url 변경 --- store-service/src/docs/asciidoc/api-docs.adoc | 2 +- .../domain/store/web/StoreController.java | 57 +--------------- .../store/web/StoreCustomerApiController.java | 68 +++++++++++++++++++ ...va => StoreCustomerApiControllerTest.java} | 24 +++---- 4 files changed, 83 insertions(+), 68 deletions(-) create mode 100644 store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiController.java rename store-service/src/test/java/com/justpickup/storeservice/domain/store/web/{StoreControllerTest.java => StoreCustomerApiControllerTest.java} (88%) diff --git a/store-service/src/docs/asciidoc/api-docs.adoc b/store-service/src/docs/asciidoc/api-docs.adoc index c6b070b..d5bab77 100644 --- a/store-service/src/docs/asciidoc/api-docs.adoc +++ b/store-service/src/docs/asciidoc/api-docs.adoc @@ -79,6 +79,6 @@ operation::put-categoryList[snippets='curl-request,http-request,http-response,re == 매장 === 매장 검색 조회 -operation::searchStore-get[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] +operation::api-customer-store-search[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreController.java b/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreController.java index 0ce0651..11854d5 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreController.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreController.java @@ -1,65 +1,12 @@ package com.justpickup.storeservice.domain.store.web; -import com.justpickup.storeservice.domain.store.dto.SearchStoreCondition; -import com.justpickup.storeservice.domain.store.dto.SearchStoreResult; -import com.justpickup.storeservice.domain.store.service.StoreService; -import com.justpickup.storeservice.global.dto.Result; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.SliceImpl; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; -import java.util.List; -import java.util.stream.Collectors; - @RestController @RequiredArgsConstructor +@RequestMapping("/store") public class StoreController { - private final StoreService storeService; - - @GetMapping("/search-store") - public ResponseEntity searchStore(@Valid SearchStoreCondition condition, - @PageableDefault(page = 0, size = 2) Pageable pageable) { - SliceImpl searchStoreScroll = storeService.findSearchStoreScroll(condition, pageable); - - SearchStoreResponse searchStoreResponse = - new SearchStoreResponse(searchStoreScroll.getContent(), searchStoreScroll.hasNext()); - - return ResponseEntity.status(HttpStatus.OK) - .body(Result.createSuccessResult(searchStoreResponse)); - } - - @Data @NoArgsConstructor - static class SearchStoreResponse { - private List stores; - private boolean hasNext; - - @Data @AllArgsConstructor - static class StoreDto { - private Long id; - private String name; - private String distance; - private Long favoriteCounts; - } - - public SearchStoreResponse(List content, boolean hasNext) { - this.stores = content.stream() - .map(result -> - new StoreDto( - result.getStoreId(), result.getStoreName(), - result.convertDistanceToString(), result.getFavoriteCounts()) - ) - .collect(Collectors.toList()); - this.hasNext = hasNext; - } - } } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiController.java b/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiController.java new file mode 100644 index 0000000..04776dc --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiController.java @@ -0,0 +1,68 @@ +package com.justpickup.storeservice.domain.store.web; + +import com.justpickup.storeservice.domain.store.dto.SearchStoreCondition; +import com.justpickup.storeservice.domain.store.dto.SearchStoreResult; +import com.justpickup.storeservice.domain.store.service.StoreService; +import com.justpickup.storeservice.global.dto.Result; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/customer/store") +public class StoreCustomerApiController { + + private final StoreService storeService; + + @GetMapping("/search") + public ResponseEntity searchStore(@Valid SearchStoreCondition condition, + @PageableDefault(page = 0, size = 2) Pageable pageable) { + SliceImpl searchStoreScroll = storeService.findSearchStoreScroll(condition, pageable); + + SearchStoreResponse searchStoreResponse = + new SearchStoreResponse(searchStoreScroll.getContent(), searchStoreScroll.hasNext()); + + return ResponseEntity.status(HttpStatus.OK) + .body(Result.createSuccessResult(searchStoreResponse)); + } + + @Data + @NoArgsConstructor + static class SearchStoreResponse { + private List stores; + private boolean hasNext; + + @Data @AllArgsConstructor + static class StoreDto { + private Long id; + private String name; + private String distance; + private Long favoriteCounts; + } + + public SearchStoreResponse(List content, boolean hasNext) { + this.stores = content.stream() + .map(result -> + new StoreDto( + result.getStoreId(), result.getStoreName(), + result.convertDistanceToString(), result.getFavoriteCounts()) + ) + .collect(Collectors.toList()); + this.hasNext = hasNext; + } + } +} diff --git a/store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreControllerTest.java b/store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiControllerTest.java similarity index 88% rename from store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreControllerTest.java rename to store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiControllerTest.java index 42bfe02..08b4b67 100644 --- a/store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreControllerTest.java +++ b/store-service/src/test/java/com/justpickup/storeservice/domain/store/web/StoreCustomerApiControllerTest.java @@ -20,6 +20,7 @@ import org.springframework.test.web.servlet.ResultActions; import java.util.List; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -31,10 +32,12 @@ import static org.springframework.restdocs.request.RequestDocumentation.requestP import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(StoreController.class) +@WebMvcTest(StoreCustomerApiController.class) @Import(TestConfig.class) -@AutoConfigureRestDocs(uriHost = "127.0.0.1", uriPort = 8000) -class StoreControllerTest { +@AutoConfigureRestDocs(uriHost = "just-pickup.com", uriPort = 8000) +class StoreCustomerApiControllerTest { + + private final String url = "/api/customer/store"; @Autowired MockMvc mockMvc; @@ -58,7 +61,7 @@ class StoreControllerTest { .willReturn(getWillReturnSearchStore(pageable)); // WHEN - ResultActions actions = mockMvc.perform(get("/search-store") + ResultActions actions = mockMvc.perform(get(url + "/search") .param("latitude", String.valueOf(condition.getLatitude())) .param("longitude", String.valueOf(condition.getLongitude())) .param("page", String.valueOf(pageable.getPageNumber())) @@ -68,7 +71,7 @@ class StoreControllerTest { // THEN actions.andExpect(status().isOk()) .andDo(print()) - .andDo(document("searchStore-get", + .andDo(document("api-customer-store-search", requestParameters( parameterWithName("latitude").description("고객의 위도 [필수]"), parameterWithName("longitude").description("고객의 경도 [필수]"), @@ -84,16 +87,13 @@ class StoreControllerTest { fieldWithPath("data.stores[*].favoriteCounts").description("매장 즐겨찾기 수"), fieldWithPath("data.hasNext").description("더보기 버튼 유무") ) - )) + )) ; } private SliceImpl getWillReturnSearchStore(Pageable pageable) { - SearchStoreResult result_1 = new SearchStoreResult(1L, "이디야커피 마포오벨리스크점", 145.11980562222007); - SearchStoreResult result_2 = new SearchStoreResult(2L, "만랩커피 마포점", 150.97181089895466); - SearchStoreResult result_3 = new SearchStoreResult(3L, "커피온리 마포역점", 341.25696860337655); - return new SliceImpl<>(List.of(result_1, result_2, result_3), pageable,true); + SearchStoreResult result_1 = new SearchStoreResult(1L, "이디야커피 마포오벨리스크점", 145.11980562222007, 10L); + SearchStoreResult result_2 = new SearchStoreResult(2L, "만랩커피 마포점", 150.97181089895466, 5L); + return new SliceImpl<>(List.of(result_1, result_2), pageable,true); } - - } \ No newline at end of file From c798e44cb265373281b4c0ea88fa4dab71adb5c3 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Fri, 4 Mar 2022 18:43:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor(customer-vue):=20=EB=A7=A4?= =?UTF-8?q?=EC=9E=A5=20=EA=B2=80=EC=83=89=20url=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- customer-vue/.env | 3 ++- customer-vue/src/api/store.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/customer-vue/.env b/customer-vue/.env index e05beaf..8f9f97c 100644 --- a/customer-vue/.env +++ b/customer-vue/.env @@ -1,3 +1,4 @@ VUE_APP_BASEURL=https://just-pickup.com:8080 VUE_APP_OWNER_SERVICE_BASEURL=https://just-pickup.com:8001 -VUE_APP_CUSTOMER_SERVICE_BASEURL=https://just-pickup.com:8000 \ No newline at end of file +VUE_APP_CUSTOMER_SERVICE_BASEURL=https://just-pickup.com:8000 +VUE_APP_STORE_API_URL=https://just-pickup.com:8000/store-service/api/customer \ No newline at end of file diff --git a/customer-vue/src/api/store.js b/customer-vue/src/api/store.js index c1a8b8b..931515c 100644 --- a/customer-vue/src/api/store.js +++ b/customer-vue/src/api/store.js @@ -10,7 +10,7 @@ export default { page: page } } - return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL+"/store-service/search-store", options); + return axios.get(process.env.VUE_APP_STORE_API_URL + '/store/search', options); }, getCategoryList(){ return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL+'/store-service/category/'); From 27e6a2c3a21945d8c592f27491ae6caae8d1dca5 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 7 Mar 2022 11:16:17 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(owner-vue):=20url=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EB=B6=80=EB=B6=84=20=EB=B3=80=EA=B2=BD=20-=20?= =?UTF-8?q?=EC=A7=80=EB=82=9C=EC=A3=BC=EB=AC=B8,=20=EC=A3=BC=EB=AC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- owner-vue/.env | 6 +++++- owner-vue/package.json | 2 +- owner-vue/src/api/auth.js | 4 ++-- owner-vue/src/api/order.js | 4 ++-- owner-vue/src/api/user.js | 4 ++-- owner-vue/src/main.js | 4 ++-- owner-vue/src/views/LoginUser.vue | 4 ++-- owner-vue/vue.config.js | 3 +++ 8 files changed, 19 insertions(+), 12 deletions(-) diff --git a/owner-vue/.env b/owner-vue/.env index c7f7a1a..2596d51 100644 --- a/owner-vue/.env +++ b/owner-vue/.env @@ -1 +1,5 @@ -VUE_APP_OWNER_SERVICE_BASEURL=http://localhost:8001 \ No newline at end of file +VUE_APP_OWNER_SERVICE_BASEURL=http://just-pickup.com:8001 +VUE_APP_USER_URL=http://just-pickup.com:8001/user-service + +VUE_APP_USER_AUTH_URL=http://just-pickup.com:8001/user-service/auth +VUE_APP_API_URL=http://just-pickup.com:8001/order-service/api/owner \ No newline at end of file diff --git a/owner-vue/package.json b/owner-vue/package.json index 2b4a234..92af693 100644 --- a/owner-vue/package.json +++ b/owner-vue/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "serve": "vue-cli-service serve", + "serve": "vue-cli-service serve --port 8081", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, diff --git a/owner-vue/src/api/auth.js b/owner-vue/src/api/auth.js index 87c772b..2b10db7 100644 --- a/owner-vue/src/api/auth.js +++ b/owner-vue/src/api/auth.js @@ -9,7 +9,7 @@ export default { } } - const res = await axios.get("http://localhost:8001/user-service/auth/reissue", config); + const res = await axios.get(process.env.VUE_APP_USER_AUTH_URL + "/reissue", config); const accessToken = res.data.data.accessToken; jwt.saveToken(accessToken); @@ -21,6 +21,6 @@ export default { requestCheckAccessToken() { axios.defaults.headers.common['Authorization'] = "Bearer " + jwt.getToken(); - return axios.get("http://localhost:8001/user-service/auth/check/access-token"); + return axios.get( process.env.VUE_APP_USER_AUTH_URL +"/check/access-token"); } } \ No newline at end of file diff --git a/owner-vue/src/api/order.js b/owner-vue/src/api/order.js index fb44238..aaee3b7 100644 --- a/owner-vue/src/api/order.js +++ b/owner-vue/src/api/order.js @@ -9,7 +9,7 @@ export default { page: page } } - return axios.get("http://localhost:8001/order-service/prevOrder", options); + return axios.get( process.env.VUE_APP_ORDER_URL + "/order/prev-order", options); }, requestOrder(orderDate, lastOrderId) { const options = { @@ -18,6 +18,6 @@ export default { lastOrderId: lastOrderId } } - return axios.get("http://localhost:8001/order-service/orderMain", options); + return axios.get(process.env.VUE_APP_ORDER_URL + "/order/order-main", options); } } \ No newline at end of file diff --git a/owner-vue/src/api/user.js b/owner-vue/src/api/user.js index 622da40..7dd8da4 100644 --- a/owner-vue/src/api/user.js +++ b/owner-vue/src/api/user.js @@ -2,7 +2,7 @@ import jwt from '../common/jwt.js'; export default { requestRegisterUser(user) { - return axios.post("http://localhost:8001/user-service/store-owner", user); + return axios.post(process.env.VUE_APP_USER_URL + "/store-owner", user); }, async requestLoginUser(email, password) { @@ -12,7 +12,7 @@ export default { } try { - const response = await axios.post("http://localhost:8001/user-service/login", user); + const response = await axios.post( process.env.VUE_APP_USER_URL +"/login", user); const data = response.data.data; jwt.saveToken(data.accessToken); diff --git a/owner-vue/src/main.js b/owner-vue/src/main.js index a459994..b2cbbf0 100644 --- a/owner-vue/src/main.js +++ b/owner-vue/src/main.js @@ -30,11 +30,11 @@ axios.interceptors.response.use( originalRequest.headers.Authorization = "Bearer " + accessToken; return axios(originalRequest); } catch (reissueError) { - window.location.href = "http://localhost:8080"; + window.location.href = "/"; alert("권한이 없습니다. 다시 로그인 해주세요"); } } - window.location.href = "http://localhost:8080"; + window.location.href = "/"; alert("권한이 없습니다. 다시 로그인해주세요."); } return Promise.reject(error); diff --git a/owner-vue/src/views/LoginUser.vue b/owner-vue/src/views/LoginUser.vue index 2496b06..f257c4c 100644 --- a/owner-vue/src/views/LoginUser.vue +++ b/owner-vue/src/views/LoginUser.vue @@ -37,8 +37,8 @@ export default { name: "LoginUser", data: function() { return { - email: 'owner@gmail.com', - password: '1234' + email: '', + password: '' } }, methods: { diff --git a/owner-vue/vue.config.js b/owner-vue/vue.config.js index 167eb2e..7169597 100644 --- a/owner-vue/vue.config.js +++ b/owner-vue/vue.config.js @@ -2,4 +2,7 @@ module.exports = { transpileDependencies: [ 'vuetify' ], + devServer: { + disableHostCheck: true + } } From c05f5e571889bd908a07071622d39decb640581c Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 7 Mar 2022 11:17:58 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor(owner-apigateway-service):=20cors?= =?UTF-8?q?=20allowedOrigins=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - localhost -> 명시적 url --- .../filter/AuthorizationHeaderFilter.java | 2 ++ owner-apigateway-service/src/main/resources/application.yml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/filter/AuthorizationHeaderFilter.java b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/filter/AuthorizationHeaderFilter.java index c723899..d2947c6 100644 --- a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/filter/AuthorizationHeaderFilter.java +++ b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/filter/AuthorizationHeaderFilter.java @@ -33,6 +33,7 @@ public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory { ServerHttpRequest request = exchange.getRequest(); + log.info("AuthorizationHeaderFilter Start: request -> {}", exchange.getRequest()); HttpHeaders headers = request.getHeaders(); if (!headers.containsKey(HttpHeaders.AUTHORIZATION)) { @@ -55,6 +56,7 @@ public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory Date: Mon, 7 Mar 2022 11:19:17 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor(order-service):=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8,=20=EC=A7=80=EB=82=9C=20=EC=A3=BC=EB=AC=B8=20url=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api controller 추가 - 테스트 클래스 이관 --- .../domain/order/web/OrderController.java | 147 ------------------ ....java => OrderOwnerApiControllerTest.java} | 86 +++++----- 2 files changed, 47 insertions(+), 186 deletions(-) rename order-service/src/test/java/com/justpickup/orderservice/domain/order/web/{OrderControllerTest.java => OrderOwnerApiControllerTest.java} (81%) diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java index 1ce5ff5..a626a48 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java @@ -1,159 +1,12 @@ package com.justpickup.orderservice.domain.order.web; -import com.justpickup.orderservice.domain.order.dto.OrderDto; -import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; -import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; -import com.justpickup.orderservice.domain.order.entity.OrderStatus; -import com.justpickup.orderservice.domain.order.service.OrderService; -import com.justpickup.orderservice.domain.order.validator.PrevOrderSearchValidator; -import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; -import com.justpickup.orderservice.global.dto.Result; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindException; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.stream.Collectors; - @RestController @RequiredArgsConstructor @Slf4j public class OrderController { - private final OrderService orderService; - private final PrevOrderSearchValidator prevOrderSearchValidator; - - @GetMapping("/orderMain") - public ResponseEntity orderMain(@Valid OrderSearchCondition condition) { - // TODO: 2022/02/04 JWT 구현 시 변경 요망 - Long userId = 1L; - Long storeId = 1L; - - List orderDto = orderService.findOrderMain(condition, storeId); - - List orderMainResponses = orderDto.stream() - .map(OrderMainResponse::new) - .collect(Collectors.toList()); - - return ResponseEntity.status(HttpStatus.OK) - .body(Result.createSuccessResult(orderMainResponses)); - } - - @Data @NoArgsConstructor @AllArgsConstructor - static class OrderMainResponse { - private Long orderId; - private Long userId; - private String userName; - private List orderItemResponses; - private OrderStatus orderStatus; - private String orderTime; - - public OrderMainResponse(OrderDto orderDto) { - List orderItemDtoList = orderDto.getOrderItemDtoList() - .stream() - .map(OrderItemResponse::new) - .collect(Collectors.toList()); - - this.orderId = orderDto.getId(); - this.userId = orderDto.getUserId(); - this.userName = orderDto.getUserName(); - this.orderItemResponses = orderItemDtoList; - this.orderStatus = orderDto.getOrderStatus(); - this.orderTime = orderDto.getOrderTime() - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - } - } - - @Data - static class OrderItemResponse { - private Long orderItemId; - private Long itemId; - private String itemName; - - public OrderItemResponse(OrderItemDto orderItemDto) { - this.orderItemId = orderItemDto.getId(); - this.itemId = orderItemDto.getItemId(); - this.itemName = orderItemDto.getItemName(); - } - } - - @GetMapping("/prevOrder") - public ResponseEntity findPrevOrder(@Valid PrevOrderSearch prevOrderSearch, - @PageableDefault(page = 0, size = 10) Pageable pageable, - BindingResult bindingResult) throws BindException { - // validation - if (bindingResult.hasErrors()) throw new BindException(bindingResult); - prevOrderSearchValidator.validate(prevOrderSearch, bindingResult); - if (bindingResult.hasErrors()) throw new BindException(bindingResult); - - // get data - Page prevOrderMain = orderService.findPrevOrderMain(prevOrderSearch, pageable, 1L); - - // format data - ResponsePrevOrder responsePrevOrder = - new ResponsePrevOrder(prevOrderMain.getContent(), prevOrderMain.getNumber(), prevOrderMain.getTotalPages()); - return ResponseEntity.ok(Result.createSuccessResult(responsePrevOrder)); - } - - @Data @AllArgsConstructor @NoArgsConstructor - static class ResponsePrevOrder { - private List orders; - private Page page; - - public ResponsePrevOrder(List orderDtoList, int startPage, int totalPage) { - orders = orderDtoList.stream().map(OrderVo::new).collect(Collectors.toList()); - page = new Page(startPage, totalPage); - } - - @Data - static class OrderVo { - private Long orderId; - private OrderStatus orderStatus; - private String orderTime; - private Long orderPrice; - private String userName; - private List orderItems; - - public OrderVo(OrderDto orderDto) { - this.orderId = orderDto.getId(); - this.orderStatus = orderDto.getOrderStatus(); - this.orderTime = orderDto.getOrderTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - this.orderPrice = orderDto.getOrderPrice(); - this.userName = orderDto.getUserName(); - this.orderItems = orderDto.getOrderItemDtoList() - .stream().map(OrderItemVo::new).collect(Collectors.toList()); - } - } - - @Data - static class OrderItemVo { - private Long orderItemId; - private String orderItemName; - - public OrderItemVo(OrderItemDto orderItemDto) { - this.orderItemId = orderItemDto.getId(); - this.orderItemName = orderItemDto.getItemName(); - } - } - - @Data @AllArgsConstructor - static class Page { - int startPage; - int totalPage; - } - } } diff --git a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderOwnerApiControllerTest.java similarity index 81% rename from order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java rename to order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderOwnerApiControllerTest.java index fb8f713..043c467 100644 --- a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java +++ b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderOwnerApiControllerTest.java @@ -6,6 +6,7 @@ import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.OrderStatus; +import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.service.OrderService; import com.justpickup.orderservice.domain.order.validator.PrevOrderSearchValidator; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; @@ -28,6 +29,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.given; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; @@ -39,10 +41,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(OrderController.class) +@WebMvcTest(OrderOwnerApiController.class) @Import(TestConfig.class) -@AutoConfigureRestDocs(uriHost = "127.0.0.1", uriPort = 8001) -class OrderControllerTest { +@AutoConfigureRestDocs(uriHost = "http://just-pickup.com", uriPort = 8001) +class OrderOwnerApiControllerTest { @Autowired ObjectMapper objectMapper; @@ -56,8 +58,13 @@ class OrderControllerTest { @SpyBean PrevOrderSearchValidator prevOrderSearchValidator; + @MockBean + OrderRepository orderRepository; + + private final String url = "/api/owner/order"; + @Test - @DisplayName("점주 서비스 - 주문 페이지") + @DisplayName("[API] [GET] 점주 서비스 - 주문 페이지") void getOrderMain() throws Exception { // GIVEN String orderDate = "2022-02-03"; @@ -70,7 +77,8 @@ class OrderControllerTest { .willReturn(getOrderMainDtoList()); // WHEN - ResultActions actions = mockMvc.perform(get("/orderMain") + + ResultActions actions = mockMvc.perform(get(url + "/order-main") .param("orderDate", orderDate) .param("lastOrderId", String.valueOf(lastOrderId)) ); @@ -85,35 +93,35 @@ class OrderControllerTest { .andExpect(jsonPath("data[*].orderTime").exists()) .andDo(print()) .andDo(document("orderMain-get", - requestParameters( - parameterWithName("orderDate").description("주문 날짜 YYYY-MM-DD"), - parameterWithName("lastOrderId").optional().description("페이지의 마지막 주문 고유 번호") - ), - responseFields( - fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), - fieldWithPath("message").description("메시지"), - fieldWithPath("data[*].orderId").description("주문 고유 번호"), - fieldWithPath("data[*].userId").description("고객 고유 번호"), - fieldWithPath("data[*].userName").description("고객 이름"), - fieldWithPath("data[*].orderItemResponses[*].orderItemId").description("장바구니 고유번호"), - fieldWithPath("data[*].orderItemResponses[*].itemId").description("상품 고유번호"), - fieldWithPath("data[*].orderItemResponses[*].itemName").description("상품 이름"), - fieldWithPath("data[*].orderStatus").description("주문 상태"), - fieldWithPath("data[*].orderTime").description("주문 시간") - ) - )) + requestParameters( + parameterWithName("orderDate").description("주문 날짜 YYYY-MM-DD"), + parameterWithName("lastOrderId").optional().description("페이지의 마지막 주문 고유 번호") + ), + responseFields( + fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data[*].orderId").description("주문 고유 번호"), + fieldWithPath("data[*].userId").description("고객 고유 번호"), + fieldWithPath("data[*].userName").description("고객 이름"), + fieldWithPath("data[*].orderItemResponses[*].orderItemId").description("장바구니 고유번호"), + fieldWithPath("data[*].orderItemResponses[*].itemId").description("상품 고유번호"), + fieldWithPath("data[*].orderItemResponses[*].itemName").description("상품 이름"), + fieldWithPath("data[*].orderStatus").description("주문 상태"), + fieldWithPath("data[*].orderTime").description("주문 시간") + ) + )) ; } @Test - @DisplayName("점주 서비스 - 주문 페이지 (잘못된 파라미터 형식)") + @DisplayName("[API] [GET] 점주 서비스 - 주문 페이지 (잘못된 파라미터 형식)") void getOrderMainBadRequestException() throws Exception { // GIVEN String orderDate = "20220203"; Long lastOrderId = 7L; // WHEN - ResultActions actions = mockMvc.perform(get("/orderMain") + ResultActions actions = mockMvc.perform(get(url + "/order-main") .param("orderDate", orderDate) .param("lastOrderId", String.valueOf(lastOrderId)) ); @@ -125,15 +133,15 @@ class OrderControllerTest { .andExpect(jsonPath("data").isEmpty()) .andDo(print()) .andDo(document("orderMain-get-badParameterException", - requestParameters( - parameterWithName("orderDate").description("주문 날짜 YYYY-MM-DD"), - parameterWithName("lastOrderId").optional().description("페이지의 마지막 주문 고유 번호") - ), - responseFields( - fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), - fieldWithPath("message").description("메시지"), - fieldWithPath("data").description("데이터") - ) + requestParameters( + parameterWithName("orderDate").description("주문 날짜 YYYY-MM-DD"), + parameterWithName("lastOrderId").optional().description("페이지의 마지막 주문 고유 번호") + ), + responseFields( + fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data").description("데이터") + ) ) ) ; @@ -182,7 +190,7 @@ class OrderControllerTest { } @Test - @DisplayName("점주 서비스 - 지난 주문 페이지") + @DisplayName("[API] [GET] 점주 서비스 - 지난 주문 페이지") void getPrevOrder() throws Exception { // GIVEN LocalDate startDate = LocalDate.of(2022, 2, 3); @@ -197,7 +205,7 @@ class OrderControllerTest { ); // WHEN - ResultActions actions = mockMvc.perform(get("/prevOrder") + ResultActions actions = mockMvc.perform(get(url + "/prev-order") .param("startDate", startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) .param("endDate", endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) .param("page", page) @@ -236,12 +244,12 @@ class OrderControllerTest { fieldWithPath("data.page.startPage").description("현재 페이지 (0부터 시작)"), fieldWithPath("data.page.totalPage").description("총 페이지 개수") ) - )) + )) ; } @Test - @DisplayName("점주 서비스 - 지난 주문 페이지 (파라미터 오류)") + @DisplayName("[API] [GET] 점주 서비스 - 지난 주문 페이지 (파라미터 오류)") void getPrevOrderBindException() throws Exception { // GIVEN LocalDate startDate = LocalDate.of(2023, 2, 3); @@ -251,7 +259,7 @@ class OrderControllerTest { PrevOrderSearch search = new PrevOrderSearch(startDate, endDate); // THEN - ResultActions actions = mockMvc.perform(get("/prevOrder") + ResultActions actions = mockMvc.perform(get(url + "/prev-order") .param("startDate", startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) .param("endDate", endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) .param("page", page) @@ -274,7 +282,7 @@ class OrderControllerTest { fieldWithPath("message").description("메시지"), fieldWithPath("data").description("데이터") ) - )) + )) ; } } \ No newline at end of file