Skip to content

Commit

Permalink
검색 요청 DTO 추가 및 쿼리 파리미터 DTO 매핑 (#21)
Browse files Browse the repository at this point in the history
* [#18] Feat: 검색 요청 DTO 추가

SearchQueryRequestDto 추가.

* [#18] Refactor: 쿼리 파라미터를 SearchQueryRequestDto로 매핑

@ModelAttribute를 사용해 검색 시 들어오는 쿼리 파라미터를 Dto로 바로 매핑.
이전에 Map<String, String>으로 받아 자료형 변환하던 코드를 삭제함.

* [#18] Feat: 리퀘스트 DTO 추가에 따른 SearchQueryResponseDto 변경

of() 메서드를 추가해 서비스에서 Accommodation을 응답 DTO로 변환할 수 있도록 함.
  • Loading branch information
street62 committed May 25, 2022
1 parent 8acd9a8 commit 1a671a0
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,8 +22,8 @@ public class AccommodationController {
private final AccommodationService accommodationService;

@GetMapping("/search/{query}")
public ResponseEntity<List<SearchQueryResponseDto>> getSearchResult(@RequestParam Map<String, String> searchConditions) {
List<SearchQueryResponseDto> result = accommodationService.search(searchConditions);
public ResponseEntity<List<SearchQueryResponseDto>> getSearchResult(@ModelAttribute SearchQueryRequestDto requestDto) {
List<SearchQueryResponseDto> result = accommodationService.search(requestDto);
return ResponseEntity.ok(Collections.singletonList(new SearchQueryResponseDto()));
}

Expand Down
31 changes: 9 additions & 22 deletions be/src/main/java/kr/codesquad/airbnb/domain/Accommodation.java
Original file line number Diff line number Diff line change
@@ -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<LocalDate, Boolean> nonAvailableDate = new HashMap<>();
private int feePerOneNight;
private Map<String, Integer> maxPeople;
Expand All @@ -17,31 +22,13 @@ public Accommodation(int feePerOneNight, Map<String, Integer> 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;
}


}
Original file line number Diff line number Diff line change
@@ -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;

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kr.codesquad.airbnb.dto;

import kr.codesquad.airbnb.domain.Accommodation;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,17 +20,12 @@
public class AccommodationService {
private final AccommodationRepository accommodationRepository;

public List<SearchQueryResponseDto> search(Map<String, String> searchConditions) {
List<Accommodation> filteredByCheckinDate = accommodationRepository.findByDateGreaterThanEqual(searchConditions.get("checkinDate"));
public List<SearchQueryResponseDto> search(SearchQueryRequestDto requestDto) {
List<Accommodation> 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<String, Object> parseSearchCondition(Map<String, String> searchConditions) {
Map<String, Object> parsedConditions = new HashMap<>();

}
}

0 comments on commit 1a671a0

Please sign in to comment.