diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClient.java b/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClient.java new file mode 100644 index 0000000..9d1c716 --- /dev/null +++ b/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClient.java @@ -0,0 +1,12 @@ +package com.ch.yourdelivery.external; + +import com.ch.yourdelivery.store.domain.dto.StoreResponse; +import com.ch.yourdelivery.store.domain.model.Menu; +import java.util.List; + +public interface StoreClient { + + List findStoresByCategory(String category, int page, int size); + + List findMenusByStoreId(String storeId, int page, int size); +} diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClientImpl.java b/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClientImpl.java index 41c5b04..b0fe219 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClientImpl.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/external/StoreClientImpl.java @@ -1,63 +1,67 @@ package com.ch.yourdelivery.external; +import com.ch.yourdelivery.external.util.MenuRandomSampleData; +import com.ch.yourdelivery.external.util.StoreRandomSampleData; import com.ch.yourdelivery.store.domain.dto.StoreResponse; -import com.ch.yourdelivery.store.domain.model.DeliveryLocation; import com.ch.yourdelivery.store.domain.model.Menu; -import com.ch.yourdelivery.store.domain.model.OperatingTimeInMonth; -import com.ch.yourdelivery.store.service.StoreClient; -import com.ch.yourdelivery.external.util.StoreRandomSampleData; import jakarta.annotation.PostConstruct; -import org.springframework.stereotype.Service; - import java.util.ArrayList; import java.util.List; +import java.util.Random; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.stereotype.Service; @Service public class StoreClientImpl implements StoreClient { - public static final String CHICKEN = "치킨"; - private List storeResponseList = new ArrayList<>(); - private List operatingTimeInMonthList = new ArrayList<>(); - private List deliveryLocationList = new ArrayList<>(); + private static final Random random = new Random(); + private static final List list = new ArrayList<>(); @PostConstruct - public void init(){ - operatingTimeInMonthList.add(StoreRandomSampleData.generateOperatingTimeInMonth()); - operatingTimeInMonthList.add(StoreRandomSampleData.generateOperatingTimeInMonth()); + public void init() { + for (int i = 0; i < random.nextInt(100, 1000); i++) { + StoreResponse storeResponse = StoreResponse.builder() + .id(random.nextLong()) + .ownerId(random.nextLong()) + .name(UUID.randomUUID().toString()) + .operatingTimeList(StoreRandomSampleData.generateOperatingTimeInMonthList(3)) + .phoneNumber(UUID.randomUUID().toString()) + .deliveryLocation(StoreRandomSampleData.generateDeliveryLocationList(3)) + .descriptionForNotification(UUID.randomUUID().toString()) + .storeLocationXY(StoreRandomSampleData.generateStoreLocationXY()) + .menus(MenuRandomSampleData.generateRandomMenus(5)) + .category(StoreRandomSampleData.generateCategory()) + .build(); - deliveryLocationList.add(StoreRandomSampleData.generateDeliveryLocation()); - deliveryLocationList.add(StoreRandomSampleData.generateDeliveryLocation()); + list.add(storeResponse); + } + } + + @Override + public List findStoresByCategory(String category, int page, int size) { + int start = size * (page - 1); + int end = size * page; - for (int i = 0; i < Math.random() * 10; i++) { - String storeName = StoreRandomSampleData.generateStoreName(); + List storesByCategories = list.stream().filter( + storeResponse -> + storeResponse.getCategory().getName().equals(category)) + .collect(Collectors.toList()); - StoreResponse storeResponse = StoreResponse.builder() - .id(StoreRandomSampleData.generateRandomId()) - .ownerId(StoreRandomSampleData.generateOwnerIndex()) - .name(storeName) - .operatingTimeList(operatingTimeInMonthList) - .phoneNumber(StoreRandomSampleData.generatePhoneNumber()) - .deliveryLocation(deliveryLocationList) - .descriptionForNotification(StoreRandomSampleData.generateDescription()) - .storeLocationXY(StoreRandomSampleData.generateStoreLocationXY()) - .menus(MenuRandomSampleData.generateRandomMenus(5)) - .build(); - - storeResponseList.add(storeResponse); + //end의 사이즈가 끝을 지나는 경우는 마지막 페이지를 리턴(Validation 역할도 함) + if (storesByCategories.size() < end) { + start = (storesByCategories.size() / size) * size; + end = start + storesByCategories.size() % size; + return storesByCategories.subList(start, end); + } else { + return storesByCategories.subList(start, end); } } @Override - public List findAllStores() { - //size 5 - //page 3 - // 11 = size * (page-1) + 1 - // 15 = size * page - //validation 해야함... - //return storeResponseList.subList(size * (page-1) + 1, size * page); - return storeResponseList; + public List findMenusByStoreId(String storeId, int page, int size) { + return null; } - } diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/external/MenuRandomSampleData.java b/your-delivery/src/main/java/com/ch/yourdelivery/external/util/MenuRandomSampleData.java similarity index 51% rename from your-delivery/src/main/java/com/ch/yourdelivery/external/MenuRandomSampleData.java rename to your-delivery/src/main/java/com/ch/yourdelivery/external/util/MenuRandomSampleData.java index 6c29d21..21d141e 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/external/MenuRandomSampleData.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/external/util/MenuRandomSampleData.java @@ -1,8 +1,6 @@ -package com.ch.yourdelivery.external; +package com.ch.yourdelivery.external.util; import com.ch.yourdelivery.store.domain.model.Menu; -import org.springframework.stereotype.Component; - import java.util.List; import java.util.Random; import java.util.UUID; @@ -10,23 +8,24 @@ public class MenuRandomSampleData { + private static final Random random = new Random(); public static Menu generateRandomMenu() { return Menu.builder() - .id(random.nextLong()) - .name(UUID.randomUUID().toString()) - .price(random.nextInt()%10000) - .reviewScore(random.nextInt()%5) - .deliveryTip(random.nextInt()%5000) - .build(); + .id(random.nextLong()) + .name(UUID.randomUUID().toString()) + .price(random.nextInt() % 10000) + .reviewScore(random.nextInt() % 5) + .deliveryTip(random.nextInt() % 5000) + .build(); } public static List generateRandomMenus(Integer count) { return IntStream.range(0, count) - .mapToObj(i -> generateRandomMenu()) - .toList(); + .mapToObj(i -> generateRandomMenu()) + .toList(); } } diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/external/util/StoreRandomSampleData.java b/your-delivery/src/main/java/com/ch/yourdelivery/external/util/StoreRandomSampleData.java index 84c23bc..9891c5d 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/external/util/StoreRandomSampleData.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/external/util/StoreRandomSampleData.java @@ -1,73 +1,58 @@ package com.ch.yourdelivery.external.util; +import com.ch.yourdelivery.store.domain.model.Category; import com.ch.yourdelivery.store.domain.model.DeliveryLocation; import com.ch.yourdelivery.store.domain.model.OperatingTimeInMonth; import com.ch.yourdelivery.store.domain.model.StoreLocationXY; +import java.util.List; +import java.util.Random; +import java.util.UUID; +import java.util.stream.IntStream; public class StoreRandomSampleData { - //Sample Data - private static final String DESCRIPTION = "리뷰 이벤트 중입니다. 캔 음료 1캔 증정"; - private static final String NUMBER_010 = "010"; - private static final String WEEKS_DAYS = "Weekdays"; - private static final String STORE_POST_FIX = "호점"; - private static final String[] START_TIMES = {"08:00:00", "09:00:00", "10:00:00"}; - private static final String[] END_TIMES = {"21:00:00", "22:00:00", "23:00:00"}; - private static final String[] DONG_NAMES = {" 대치동", " 논현동", " 개포동", " 도곡동", " 삼성동"}; - private static final String[] GIL_NAMES = {" 선릉로", " 역삼로", " 교대로", " 서초로", " 테헤란로"}; - private static final String[] STORE_NAMES = {"치킨은요리다", "바베큐치킨", "라면떡볶이", "맛있는떡볶이", "김밥라라"}; - private static final String PAST_ADDRESS_PREFIX = "서울특별시 강남구"; + private static final String[] categories = {"치킨", "일식", "중식", "한식", "양식", "초밥"}; + private static final Random random = new Random(); public static StoreLocationXY generateStoreLocationXY() { return StoreLocationXY.builder() - .mapX(Double.toString(Math.random())) - .mapY(Double.toString(Math.random())) + .mapX(Double.toString(random.nextDouble())) + .mapY(Double.toString(random.nextDouble())) .build(); } - public static String generateDescription() { - return DESCRIPTION; - } - - public static String generatePhoneNumber() { - return NUMBER_010 + (int) ((Math.random() * 10000) + 1) + (int) ((Math.random() * 10000) - + 1); - } - - public static Long generateOwnerIndex() { - return (long) (Math.random() * 100) + 1L; - } - - public static String generateStoreName() { - return STORE_NAMES[(int) (Math.random() * 5)] + generateRandomId() + STORE_POST_FIX; + private static OperatingTimeInMonth generateOperatingTimeInMonth() { + return OperatingTimeInMonth.builder() + .dayOfTheWeek(UUID.randomUUID().toString()) + .startTime(Integer.toString(random.nextInt(8, 11))) + .endTime(Integer.toString(random.nextInt(19, 23))) + .build(); } - public static long generateRandomId() { - return (long) (Math.random() * 100) + 1L; + public static List generateOperatingTimeInMonthList(int count) { + return IntStream.range(0, count) + .mapToObj(i -> generateOperatingTimeInMonth()) + .toList(); } - public static OperatingTimeInMonth generateOperatingTimeInMonth() { - return OperatingTimeInMonth.builder() - .dayOfTheWeek(WEEKS_DAYS) - .startTime(START_TIMES[(int) (Math.random() * 3)])//HH:mm:ss - .endTime(END_TIMES[(int) (Math.random() * 3)]) + public static DeliveryLocation generateDeliveryLocation() { + return DeliveryLocation.builder() + .name(UUID.randomUUID().toString()) + .pastAddress(UUID.randomUUID().toString()) + .roadNameAddress(UUID.randomUUID().toString()) .build(); } + public static List generateDeliveryLocationList(int count) { + return IntStream.range(0, count) + .mapToObj(i -> generateDeliveryLocation()) + .toList(); + } - public static DeliveryLocation generateDeliveryLocation() { - String dongName = DONG_NAMES[(int) (Math.random() * 5)]; - return DeliveryLocation.builder() - .name(DONG_NAMES[(int) (Math.random() * 5)]) - .pastAddress( - PAST_ADDRESS_PREFIX - + dongName - + (int) (Math.random() * 100)) - .roadNameAddress( - PAST_ADDRESS_PREFIX - + dongName - + GIL_NAMES[(int) (Math.random() * 5)] - ) + public static Category generateCategory() { + return Category.builder() + .id(random.nextInt(6)) + .name(categories[random.nextInt(6)]) .build(); } } diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/controller/StoreController.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/controller/StoreController.java index 4f0ad1f..d80f3f3 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/store/controller/StoreController.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/store/controller/StoreController.java @@ -1,11 +1,15 @@ package com.ch.yourdelivery.store.controller; import com.ch.yourdelivery.store.domain.dto.StoreResponse; +import com.ch.yourdelivery.store.domain.model.Menu; import com.ch.yourdelivery.store.service.StoreService; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @@ -15,8 +19,17 @@ public class StoreController { //가게정보 다건조회 @GetMapping("/stores") - public List findStores(@RequestParam String category, Pageable pageable) { - return storeService.findAllStores(); + public List findStoresByCategory(@RequestParam String category, + Pageable pageable) { + return storeService.findStoresByCategory(category, pageable.getPageNumber(), + pageable.getPageSize()); + } + + //가게정보 다건조회 + @GetMapping("/stores/{storeId}/menus") + public List findMenusByStoreId(@PathVariable String storeId, Pageable pageable) { + return storeService.findMenusByStoreId(storeId, pageable.getPageNumber(), + pageable.getPageSize()); } } diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreLocationRequest.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreLocationRequest.java deleted file mode 100644 index 1db10d8..0000000 --- a/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreLocationRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ch.yourdelivery.store.domain.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class StoreLocationRequest { - - private String pastAddress;//지번 - private String roadNameAddress;//도로명 주소 -} diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreResponse.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreResponse.java index a9f2e69..b218a0e 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreResponse.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/dto/StoreResponse.java @@ -3,12 +3,12 @@ import com.ch.yourdelivery.store.domain.model.DeliveryLocation; import com.ch.yourdelivery.store.domain.model.Menu; import com.ch.yourdelivery.store.domain.model.OperatingTimeInMonth; +import com.ch.yourdelivery.store.domain.model.Category; import com.ch.yourdelivery.store.domain.model.StoreLocationXY; +import java.util.List; import lombok.Builder; import lombok.Getter; -import java.util.List; - @Getter @Builder public class StoreResponse { @@ -22,5 +22,6 @@ public class StoreResponse { private String descriptionForNotification; //이벤트나, 공지사항등의 설명란 private StoreLocationXY storeLocationXY; //가게 위치 private List menus; + private Category category; } diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/model/Category.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/model/Category.java new file mode 100644 index 0000000..d253e7a --- /dev/null +++ b/your-delivery/src/main/java/com/ch/yourdelivery/store/domain/model/Category.java @@ -0,0 +1,13 @@ +package com.ch.yourdelivery.store.domain.model; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Category { + + private long id; // 카테고리 id + private String name; // 카테고리 이름 + +} diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreClient.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreClient.java deleted file mode 100644 index 8875895..0000000 --- a/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreClient.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ch.yourdelivery.store.service; - -import com.ch.yourdelivery.store.domain.dto.StoreResponse; - -import java.util.List; - -public interface StoreClient { - List findAllStores(); -} diff --git a/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreService.java b/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreService.java index 507c1e1..3ee64d7 100644 --- a/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreService.java +++ b/your-delivery/src/main/java/com/ch/yourdelivery/store/service/StoreService.java @@ -1,6 +1,8 @@ package com.ch.yourdelivery.store.service; +import com.ch.yourdelivery.external.StoreClient; import com.ch.yourdelivery.store.domain.dto.StoreResponse; +import com.ch.yourdelivery.store.domain.model.Menu; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,8 +14,11 @@ public class StoreService { private final StoreClient storeClient; - public List findAllStores() { - return storeClient.findAllStores(); + public List findStoresByCategory(String category, int page, int size) { + return storeClient.findStoresByCategory(category, page, size); } + public List findMenusByStoreId(String storeId, int page, int size) { + return storeClient.findMenusByStoreId(storeId, page, size); + } }