From 1a671a0583bdc50475639b6614086e8ebf420c68 Mon Sep 17 00:00:00 2001 From: Senglee Choi Date: Wed, 25 May 2022 16:22:54 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=80=EC=83=89=20=EC=9A=94=EC=B2=AD=20DTO?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=ED=8C=8C=EB=A6=AC=EB=AF=B8=ED=84=B0=20DTO=20=EB=A7=A4=ED=95=91?= =?UTF-8?q?=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [#18] Feat: 검색 요청 DTO 추가 SearchQueryRequestDto 추가. * [#18] Refactor: 쿼리 파라미터를 SearchQueryRequestDto로 매핑 @ModelAttribute를 사용해 검색 시 들어오는 쿼리 파라미터를 Dto로 바로 매핑. 이전에 Map으로 받아 자료형 변환하던 코드를 삭제함. * [#18] Feat: 리퀘스트 DTO 추가에 따른 SearchQueryResponseDto 변경 of() 메서드를 추가해 서비스에서 Accommodation을 응답 DTO로 변환할 수 있도록 함. --- .../controller/AccommodationController.java | 5 +-- .../airbnb/domain/Accommodation.java | 31 ++++++------------- .../airbnb/dto/SearchQueryRequestDto.java | 19 ++++++++++++ .../airbnb/dto/SearchQueryResponseDto.java | 8 +++++ .../airbnb/service/AccommodationService.java | 19 ++++++------ 5 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryRequestDto.java diff --git a/be/src/main/java/kr/codesquad/airbnb/controller/AccommodationController.java b/be/src/main/java/kr/codesquad/airbnb/controller/AccommodationController.java index 6bf4c341d..747107e95 100644 --- a/be/src/main/java/kr/codesquad/airbnb/controller/AccommodationController.java +++ b/be/src/main/java/kr/codesquad/airbnb/controller/AccommodationController.java @@ -6,6 +6,7 @@ import kr.codesquad.airbnb.dto.ReserveFormResponseDto; import kr.codesquad.airbnb.dto.ReserveRequestDto; +import kr.codesquad.airbnb.dto.SearchQueryRequestDto; import kr.codesquad.airbnb.dto.SearchQueryResponseDto; import kr.codesquad.airbnb.service.AccommodationService; import lombok.RequiredArgsConstructor; @@ -21,8 +22,8 @@ public class AccommodationController { private final AccommodationService accommodationService; @GetMapping("/search/{query}") - public ResponseEntity> getSearchResult(@RequestParam Map searchConditions) { - List result = accommodationService.search(searchConditions); + public ResponseEntity> getSearchResult(@ModelAttribute SearchQueryRequestDto requestDto) { + List result = accommodationService.search(requestDto); return ResponseEntity.ok(Collections.singletonList(new SearchQueryResponseDto())); } diff --git a/be/src/main/java/kr/codesquad/airbnb/domain/Accommodation.java b/be/src/main/java/kr/codesquad/airbnb/domain/Accommodation.java index fe712470c..e6c028c5d 100644 --- a/be/src/main/java/kr/codesquad/airbnb/domain/Accommodation.java +++ b/be/src/main/java/kr/codesquad/airbnb/domain/Accommodation.java @@ -1,12 +1,17 @@ package kr.codesquad.airbnb.domain; +import lombok.Getter; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; +@Getter public class Accommodation { + private String name; + private String imgUrl; private Map nonAvailableDate = new HashMap<>(); private int feePerOneNight; private Map maxPeople; @@ -17,31 +22,13 @@ public Accommodation(int feePerOneNight, Map maxPeople) { this.maxPeople = maxPeople; } - public boolean isAvailableInDate(String checkinDateString, String checkoutDateString) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - LocalDate checkinDate = LocalDate.parse(checkinDateString, formatter); - LocalDate checkoutDate = LocalDate.parse(checkinDateString, formatter); - - for (LocalDate date = checkinDate; date.compareTo(checkoutDate) <= 0; date.plusDays(1)) { - if (nonAvailableDate.containsKey(date)) { - return false; - } - } - return true; - } - - public boolean isAvailableByPrice(String minimumPriceString, String maximumPriceString) { - int minimumPrice = Integer.parseInt(minimumPriceString); - int maximumPrice = Integer.parseInt(maximumPriceString); - + public boolean isAvailableByPrice(int minimumPrice, int maximumPrice) { return minimumPrice <= feePerOneNight && feePerOneNight <= maximumPrice; } - public boolean isAvailableByPeople(String adultCountString, String childCountString, String infantCountString) { - int adultCount = Integer.parseInt(adultCountString); - int childCount = Integer.parseInt(childCountString); - int infantCount = Integer.parseInt(infantCountString); - + public boolean isAvailableByPeople(int adultCount, int childCount, int infantCount) { return maxPeople.get("adult") >= adultCount && maxPeople.get("child") >= childCount && maxPeople.get("infant") >= infantCount; } + + } diff --git a/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryRequestDto.java b/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryRequestDto.java new file mode 100644 index 000000000..151167efe --- /dev/null +++ b/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryRequestDto.java @@ -0,0 +1,19 @@ +package kr.codesquad.airbnb.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDate; + +@AllArgsConstructor +@Getter +public class SearchQueryRequestDto { + private LocalDate checkinDate; + private LocalDate checkoutDate; + private int minimumPrice; + private int maximumPrice; + private int adultCount; + private int childCount; + private int infantCount; + +} diff --git a/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryResponseDto.java b/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryResponseDto.java index 989be2a4e..1224fc43d 100644 --- a/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryResponseDto.java +++ b/be/src/main/java/kr/codesquad/airbnb/dto/SearchQueryResponseDto.java @@ -1,5 +1,6 @@ package kr.codesquad.airbnb.dto; +import kr.codesquad.airbnb.domain.Accommodation; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,4 +13,11 @@ public class SearchQueryResponseDto { private int maxPeople; private int feePerOneNight; + public static SearchQueryResponseDto of(Accommodation accommodation) { + SearchQueryResponseDto responseDto = new SearchQueryResponseDto(); + responseDto.name = accommodation.getName(); + responseDto.imgUrl = accommodation.getImgUrl(); + responseDto.maxPeople = accomodation.getMaxPeople(); + responseDto.feePerOneNight = accommodation.getFeePerOneNight(); + } } diff --git a/be/src/main/java/kr/codesquad/airbnb/service/AccommodationService.java b/be/src/main/java/kr/codesquad/airbnb/service/AccommodationService.java index 7af10c470..db1725edf 100644 --- a/be/src/main/java/kr/codesquad/airbnb/service/AccommodationService.java +++ b/be/src/main/java/kr/codesquad/airbnb/service/AccommodationService.java @@ -1,11 +1,15 @@ package kr.codesquad.airbnb.service; import kr.codesquad.airbnb.domain.Accommodation; +import kr.codesquad.airbnb.dto.SearchQueryRequestDto; import kr.codesquad.airbnb.dto.SearchQueryResponseDto; import kr.codesquad.airbnb.repository.AccommodationRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestParam; +import java.time.LocalDate; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,17 +20,12 @@ public class AccommodationService { private final AccommodationRepository accommodationRepository; - public List search(Map searchConditions) { - List filteredByCheckinDate = accommodationRepository.findByDateGreaterThanEqual(searchConditions.get("checkinDate")); + public List search(SearchQueryRequestDto requestDto) { + List filteredByCheckinDate = accommodationRepository.findByDateBetween(requestDto.getCheckinDate(), requestDto.getCheckoutDate()); return filteredByCheckinDate.stream() - .filter(ac -> ac.isAvailableInDate(searchConditions.get("checkinDate"), searchConditions.get("checkoutDate"))) - .filter(ac -> ac.isAvailableByPrice(searchConditions.get("minimumPrice"), searchConditions.get("maximumPrice"))) - .filter(ac -> ac.isAvailableByPeople(searchConditions.get("adultCount"), searchConditions.get("childCount"), searchConditions.get("infantCount"))) + .filter(ac -> ac.isAvailableByPrice(requestDto.getMinimumPrice(), requestDto.getMaximumPrice())) + .filter(ac -> ac.isAvailableByPeople(requestDto.getAdultCount(), requestDto.getAdultCount(), requestDto.getAdultCount())) + .map(SearchQueryResponseDto::of) .collect(Collectors.toList()); } - - private Map parseSearchCondition(Map searchConditions) { - Map parsedConditions = new HashMap<>(); - - } }