From b870c30557a3e8a7a92fb22e071444de0aa843c8 Mon Sep 17 00:00:00 2001 From: eunbin00 Date: Tue, 20 Jun 2023 09:28:26 +0900 Subject: [PATCH] #2 - Feat: Add Stay Search basic MVCs --- .../controller/StaySearchRestController.java | 42 +++++++++++++++ .../service/AttractionSearchService.java | 11 +++- .../impl/DefaultAttractionSearchService.java | 53 ++++++++++++++++++- .../infra/tourapi/vo/AttractionSearchVO.java | 16 ++++++ .../infra/tourapi/vo/StayAttractionVO.java | 21 ++++++++ 5 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/routemaster/api/total/domain/attraction/controller/StaySearchRestController.java create mode 100644 src/main/java/org/routemaster/api/total/infra/tourapi/vo/StayAttractionVO.java diff --git a/src/main/java/org/routemaster/api/total/domain/attraction/controller/StaySearchRestController.java b/src/main/java/org/routemaster/api/total/domain/attraction/controller/StaySearchRestController.java new file mode 100644 index 0000000..3e8f793 --- /dev/null +++ b/src/main/java/org/routemaster/api/total/domain/attraction/controller/StaySearchRestController.java @@ -0,0 +1,42 @@ +package org.routemaster.api.total.domain.attraction.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.routemaster.api.total.domain.attraction.service.AttractionSearchService; +import org.routemaster.api.total.infra.tourapi.vo.AttractionSearchVO; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +@Slf4j +@RestController +@RequestMapping("/attraction-search") +@RequiredArgsConstructor +public class StaySearchRestController { + + private final AttractionSearchService attractionSearchService; + + @GetMapping("/stay") + public ResponseEntity> stay( + @RequestParam(required = false) Integer numOfRows, + @RequestParam(required = false) Integer pageNo, + @RequestParam(required = false) String arrange, + @RequestParam(required = false) Integer areaCode, + @RequestParam(required = false) Integer sigunguCode, + @RequestParam(required = false) String modifiedTime + ) { + Mono result = attractionSearchService.searchStay( + numOfRows, + pageNo, + arrange, + areaCode, + sigunguCode, + modifiedTime + ); + return ResponseEntity.ok(result); + } + +} diff --git a/src/main/java/org/routemaster/api/total/domain/attraction/service/AttractionSearchService.java b/src/main/java/org/routemaster/api/total/domain/attraction/service/AttractionSearchService.java index 1ff57f8..23f8f12 100644 --- a/src/main/java/org/routemaster/api/total/domain/attraction/service/AttractionSearchService.java +++ b/src/main/java/org/routemaster/api/total/domain/attraction/service/AttractionSearchService.java @@ -13,7 +13,7 @@ Mono searchLocationBasedAttraction( Double mapY, Integer radius, Integer contentTypeId, - String modifiedtime + String modifiedTime ); Mono searchAreaBasedAttraction( @@ -53,4 +53,13 @@ Mono searchFestival( String modifiedTime ); + Mono searchStay( + Integer numOfRows, + Integer pageNo, + String arrange, + Integer areaCode, + Integer sigunguCode, + String modifiedTime + ); + } diff --git a/src/main/java/org/routemaster/api/total/domain/attraction/service/impl/DefaultAttractionSearchService.java b/src/main/java/org/routemaster/api/total/domain/attraction/service/impl/DefaultAttractionSearchService.java index 35b28c0..1c82cc1 100644 --- a/src/main/java/org/routemaster/api/total/domain/attraction/service/impl/DefaultAttractionSearchService.java +++ b/src/main/java/org/routemaster/api/total/domain/attraction/service/impl/DefaultAttractionSearchService.java @@ -15,7 +15,6 @@ import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.Date; @Slf4j @@ -266,4 +265,56 @@ public Mono searchFestival( ); return result; } + + @Override + public Mono searchStay( + Integer numOfRows, + Integer pageNo, + String arrange, + Integer areaCode, + Integer sigunguCode, + String modifiedTime + ) { + ObjectMapper mapper = new ObjectMapper(); + DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(TourAPI.baseUrl); + factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); + WebClient webClient = WebClient.builder() + .uriBuilderFactory(factory) + .baseUrl(TourAPI.baseUrl) + .build(); + Mono result = webClient.get() + .uri(uriBuilder -> uriBuilder + .path("/searchStay1") + .queryParam("serviceKey", TourAPI.encodingKey) + .queryParam("MobileOS", MOBILEOS) + .queryParam("MobileApp", MOBILEAPP) + .queryParam("_type", TYPE) + .queryParam("numOfRows", numOfRows) + .queryParam("pageNo", pageNo) + .queryParam("listYN", LISTNY) + .queryParam("arrange", arrange) + .queryParam("areaCode", areaCode) + .queryParam("sigunguCode", sigunguCode) + .queryParam("modifiedtime", modifiedTime) + .build() + ).accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(String.class) + .map(str -> { + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonNode = mapper.readTree(str); + AttractionSearchVO attractionSearchVO = AttractionSearchVO.builder() + .resultCode(jsonNode.get("response").get("header").get("resultCode").asText()) + .resultMessage(jsonNode.get("response").get("header").get("resultMsg").asText()) + .stayItems(jsonNode.get("response").get("body")) + .build(); + return attractionSearchVO; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + ); + return result; + } } diff --git a/src/main/java/org/routemaster/api/total/infra/tourapi/vo/AttractionSearchVO.java b/src/main/java/org/routemaster/api/total/infra/tourapi/vo/AttractionSearchVO.java index eaae074..68c8bdd 100644 --- a/src/main/java/org/routemaster/api/total/infra/tourapi/vo/AttractionSearchVO.java +++ b/src/main/java/org/routemaster/api/total/infra/tourapi/vo/AttractionSearchVO.java @@ -105,6 +105,22 @@ public AttractionSearchVOBuilder festivalItems(JsonNode jsonNode) { this.totalCount = jsonNode.get("totalCount").asInt(); return this; } + + public AttractionSearchVOBuilder stayItems(JsonNode jsonNode) { + this.attractions = new ArrayList<>(); + jsonNode.get("items").get("item").forEach(item -> { + try { + AttractionVO attractionVO = new StayAttractionVO(item); + this.attractions.add(attractionVO); + } catch (Exception e) { + e.printStackTrace(); + } + }); + this.numOfRows = jsonNode.get("numOfRows").asInt(); + this.pageNo = jsonNode.get("pageNo").asInt(); + this.totalCount = jsonNode.get("totalCount").asInt(); + return this; + } } } diff --git a/src/main/java/org/routemaster/api/total/infra/tourapi/vo/StayAttractionVO.java b/src/main/java/org/routemaster/api/total/infra/tourapi/vo/StayAttractionVO.java new file mode 100644 index 0000000..2e945c8 --- /dev/null +++ b/src/main/java/org/routemaster/api/total/infra/tourapi/vo/StayAttractionVO.java @@ -0,0 +1,21 @@ +package org.routemaster.api.total.infra.tourapi.vo; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.Getter; + +import java.text.ParseException; + +public class StayAttractionVO extends AttractionVO { + + private @Getter Boolean benikia; + private @Getter Boolean goodStay; + private @Getter Boolean hanok; + + public StayAttractionVO(JsonNode item) throws ParseException { + super(item); + this.benikia = !item.get("benikia").asText().isEmpty(); + this.goodStay = !item.get("goodstay").asText().isEmpty(); + this.hanok = !item.get("hanok").asText().isEmpty(); + } + +}