diff --git a/piikii-application/src/main/kotlin/com/piikii/application/domain/place/OriginPlace.kt b/piikii-application/src/main/kotlin/com/piikii/application/domain/place/OriginPlace.kt index d5fee92e..08217b0d 100644 --- a/piikii-application/src/main/kotlin/com/piikii/application/domain/place/OriginPlace.kt +++ b/piikii-application/src/main/kotlin/com/piikii/application/domain/place/OriginPlace.kt @@ -12,8 +12,8 @@ data class OriginPlace( val address: String? = null, val phoneNumber: String? = null, val starGrade: Double? = null, - val longitude: Double?, - val latitude: Double?, + var longitude: Double?, + var latitude: Double?, val reviewCount: Int, val category: String?, val openingHours: String?, diff --git a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceAutoCompleteAdapter.kt b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceAutoCompleteAdapter.kt index b4eb8c1e..045b4beb 100644 --- a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceAutoCompleteAdapter.kt +++ b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceAutoCompleteAdapter.kt @@ -14,28 +14,41 @@ import org.springframework.web.client.body class LemonPlaceAutoCompleteAdapter( private val lemonOriginMapIdParserStrategy: LemonOriginMapIdParserStrategy, private val lemonApiClient: RestClient, + private val lemonCoordinateApiClient: RestClient, ) : OriginPlaceAutoCompletePort { - override fun isAutoCompleteSupportedUrl(url: String): Boolean { - return lemonOriginMapIdParserStrategy.getParserBySupportedUrl(url) != null - } + override fun isAutoCompleteSupportedUrl(url: String): Boolean = + lemonOriginMapIdParserStrategy.getParserBySupportedUrl(url) != null - override fun extractOriginMapId(url: String): OriginMapId { - return lemonOriginMapIdParserStrategy.getParserBySupportedUrl(url)?.parseOriginMapId(url) + override fun extractOriginMapId(url: String): OriginMapId = + lemonOriginMapIdParserStrategy.getParserBySupportedUrl(url)?.parseOriginMapId(url) ?: throw PiikiiException(ExceptionCode.NOT_SUPPORT_AUTO_COMPLETE_URL) - } override fun getAutoCompletedPlace( url: String, originMapId: OriginMapId, ): OriginPlace { - return lemonApiClient.get() - .uri("/${originMapId.toId()}") - .retrieve() - .body() - ?.toOriginPlace(url) - ?: throw PiikiiException( - exceptionCode = ExceptionCode.URL_PROCESS_ERROR, - detailMessage = "origin: lemon, url : $url", - ) + val originPlace = + lemonApiClient.get() + .uri("/${originMapId.toId()}") + .retrieve() + .body() + ?.toOriginPlace(url) + ?: throw PiikiiException( + exceptionCode = ExceptionCode.URL_PROCESS_ERROR, + detailMessage = "origin: lemon, url: $url", + ) + + val lemonCoordinateResponse = + lemonCoordinateApiClient.get() + .uri { it.queryParam("query", originPlace.address).build() } + .retrieve() + .body() + + lemonCoordinateResponse?.documents?.let { document -> + originPlace.longitude = document.firstOrNull()?.x?.toDouble() + originPlace.latitude = document.firstOrNull()?.y?.toDouble() + } + + return originPlace } } diff --git a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceInfoResponse.kt b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceInfoResponse.kt index 1df4b344..6f3ae57a 100644 --- a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceInfoResponse.kt +++ b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/adapter/LemonPlaceInfoResponse.kt @@ -167,3 +167,53 @@ data class LemonPlaceInfoResponse( val orgurl: String?, ) } + +data class LemonCoordinateResponse( + val documents: List, + val meta: Meta, +) + +data class Document( + val address: Address, + @JsonProperty("address_name") val addressName: String, + @JsonProperty("address_type") val addressType: String, + @JsonProperty("road_address") val roadAddress: RoadAddress, + val x: String, + val y: String, +) + +data class Address( + @JsonProperty("address_name") val addressName: String, + @JsonProperty("b_code") val bCode: String, + @JsonProperty("h_code") val hCode: String, + @JsonProperty("main_address_no") val mainAddressNo: String, + @JsonProperty("mountain_yn") val mountainYn: String, + @JsonProperty("region_1depth_name") val region1depthName: String, + @JsonProperty("region_2depth_name") val region2depthName: String, + @JsonProperty("region_3depth_h_name") val region3depthHName: String, + @JsonProperty("region_3depth_name") val region3depthName: String, + @JsonProperty("sub_address_no") val subAddressNo: String, + val x: String, + val y: String, +) + +data class RoadAddress( + @JsonProperty("address_name") val addressName: String, + @JsonProperty("building_name") val buildingName: String, + @JsonProperty("main_building_no") val mainBuildingNo: String, + @JsonProperty("region_1depth_name") val region1depthName: String, + @JsonProperty("region_2depth_name") val region2depthName: String, + @JsonProperty("region_3depth_name") val region3depthName: String, + @JsonProperty("road_name") val roadName: String, + @JsonProperty("sub_building_no") val subBuildingNo: String, + @JsonProperty("underground_yn") val undergroundYn: String, + val x: String, + val y: String, + @JsonProperty("zone_no") val zoneNo: String, +) + +data class Meta( + @JsonProperty("is_end") val isEnd: Boolean, + @JsonProperty("pageable_count") val pageableCount: Int, + @JsonProperty("total_count") val totalCount: Int, +) diff --git a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/config/LemonConfig.kt b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/config/LemonConfig.kt index 9c4848db..50ec6cfc 100644 --- a/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/config/LemonConfig.kt +++ b/piikii-output-web/lemon/src/main/kotlin/com/piikii/output/web/lemon/config/LemonConfig.kt @@ -4,17 +4,26 @@ import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpHeaders import org.springframework.web.client.RestClient @Configuration -@EnableConfigurationProperties(LemonProperties::class) -class LemonConfig { +@EnableConfigurationProperties(LemonProperties::class, LemonCoordinateProperties::class) +open class LemonConfig { @Bean - fun lemonApiClient(lemonProperties: LemonProperties): RestClient { + open fun lemonApiClient(lemonProperties: LemonProperties): RestClient { return RestClient.builder() .baseUrl(lemonProperties.url.api) .build() } + + @Bean + open fun lemonCoordinateApiClient(lemonCoordinateProperties: LemonCoordinateProperties): RestClient { + return RestClient.builder() + .defaultHeader(HttpHeaders.AUTHORIZATION, lemonCoordinateProperties.auth) + .baseUrl(lemonCoordinateProperties.url) + .build() + } } @ConfigurationProperties(prefix = "lemon") @@ -32,3 +41,9 @@ data class LemonUrl( val mobileApp: String, ) } + +@ConfigurationProperties(prefix = "coordinate-api") +data class LemonCoordinateProperties( + val url: String, + val auth: String, +) diff --git a/piikii-output-web/lemon/src/main/resources/lemon-config/application.yml b/piikii-output-web/lemon/src/main/resources/lemon-config/application.yml index dff594fa..2f7a8e31 100644 --- a/piikii-output-web/lemon/src/main/resources/lemon-config/application.yml +++ b/piikii-output-web/lemon/src/main/resources/lemon-config/application.yml @@ -5,3 +5,7 @@ lemon: mobile-web: ${LEMON_MOBILE_WEB_URL_REGEX} mobile-app: ${LEMON_MOBILE_APP_URL_REGEX} api: ${LEMON_API_URL} + +coordinate-api: + url: ${LEMON_COORDINATE_API_URL} + auth: ${LEMON_API_KEY}