-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* finish fetcher * on test only * remove test code * fix lint
- Loading branch information
Showing
12 changed files
with
204 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
...staircrusher/external_accessibility/application/port/in/ToiletAccessibilitySyncUseCase.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package club.staircrusher.external_accessibility.application.port.`in` | ||
|
||
import club.staircrusher.external_accessibility.application.port.out.web.ToiletInfoFetcher | ||
import club.staircrusher.external_accessibility.domain.model.ExternalAccessibility | ||
import club.staircrusher.external_accessibility.domain.model.ToiletAccessibilityDetails | ||
import club.staircrusher.stdlib.di.annotation.Component | ||
import club.staircrusher.stdlib.external_accessibility.ExternalAccessibilityCategory | ||
import club.staircrusher.stdlib.geography.Location | ||
import java.time.Instant | ||
|
||
@Component | ||
class ToiletAccessibilitySyncUseCase( | ||
private val externalAccessibilityService: ExternalAccessibilityService, | ||
private val toiletInfoFetcher: ToiletInfoFetcher, | ||
) { | ||
|
||
fun load() { | ||
val records = toiletInfoFetcher.fetchRecords() | ||
externalAccessibilityService.upsert( | ||
records.map { | ||
ExternalAccessibility( | ||
id = it.toiletId, | ||
name = it.toiletName, | ||
location = Location(it.longitude, it.latitude), | ||
address = it.addressNew ?: it.addressOld ?: "", | ||
createdAt = Instant.now(), | ||
updatedAt = Instant.now(), | ||
category = ExternalAccessibilityCategory.TOILET, | ||
toiletDetails = ToiletAccessibilityDetails( | ||
imageUrl = it.imageUrl, | ||
gender = it.이용성별, | ||
accessDesc = it.추천접근로, | ||
availableDesc = it.사용가능여부, | ||
entranceDesc = it.화장실입구구조, | ||
stallWidth = it.내부가로너비, | ||
stallDepth = it.내부세로너비, | ||
doorDesc = it.대변기출입문, | ||
doorSideRoom = it.대변기옆공간, | ||
washStandBelowRoom = it.세면대아래공간, | ||
washStandHandle = it.세면대손잡이, | ||
extraDesc = it.기타참고사항, | ||
) | ||
) | ||
} | ||
) | ||
|
||
} | ||
} |
File renamed without changes.
28 changes: 28 additions & 0 deletions
28
...in/club/staircrusher/external_accessibility/application/port/out/web/ToiletInfoFetcher.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package club.staircrusher.external_accessibility.application.port.out.web | ||
|
||
interface ToiletInfoFetcher { | ||
fun fetchRecords(): List<ToiletRow> | ||
|
||
@Suppress("NonAsciiCharacters") | ||
data class ToiletRow( | ||
val toiletId: String, | ||
val toiletName: String, | ||
val imageUrl: String, | ||
val addressOld: String?, | ||
val addressNew: String?, | ||
val 이용성별: String?, | ||
val 추천접근로: String?, | ||
val 사용가능여부: String?, | ||
val 화장실입구구조: String?, | ||
val 내부가로너비: String?, | ||
val 내부세로너비: String?, | ||
val 대변기출입문: String?, | ||
val 대변기옆공간: String?, | ||
val 세면대아래공간: String?, | ||
val 세면대손잡이: String?, | ||
val 기타참고사항: String?, | ||
val 상세주소: String?, | ||
val latitude: Double, | ||
val longitude: Double, | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
72 changes: 72 additions & 0 deletions
72
...n/club/staircrusher/external_accessibility/infra/adapter/out/web/ToiletInfoFetcherImpl.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
package club.staircrusher.external_accessibility.infra.adapter.out.web | ||
|
||
import club.staircrusher.external_accessibility.application.port.out.web.ToiletInfoFetcher | ||
import club.staircrusher.stdlib.di.annotation.Component | ||
import club.staircrusher.stdlib.util.string.emptyToNull | ||
import org.apache.commons.csv.CSVFormat | ||
import org.apache.commons.csv.CSVParser | ||
import org.springframework.core.io.buffer.DataBuffer | ||
import org.springframework.core.io.buffer.DataBufferUtils | ||
import org.springframework.http.MediaType | ||
import org.springframework.web.reactive.function.client.WebClient | ||
import reactor.core.publisher.Mono | ||
import java.nio.charset.Charset | ||
|
||
@Component | ||
class ToiletInfoFetcherImpl : ToiletInfoFetcher { | ||
override fun fetchRecords(): List<ToiletInfoFetcher.ToiletRow> { | ||
val client = WebClient.builder() | ||
.codecs { it.defaultCodecs().maxInMemorySize(4 * 1024 * 1024) } | ||
.build() | ||
return client.get() | ||
.uri(CSV_BASE_URL) | ||
.accept(MediaType.valueOf("text/csv")) | ||
.exchangeToMono { response -> | ||
if (response.statusCode().is2xxSuccessful) { | ||
DataBufferUtils.join(response.bodyToFlux(DataBuffer::class.java)) | ||
} else { | ||
Mono.error(RuntimeException("Failed to fetch ${response.statusCode()}")) | ||
} | ||
} | ||
.map { dataBuffer -> | ||
val parser = CSVParser.parse( | ||
dataBuffer.asInputStream(), | ||
Charset.forName("UTF-8"), | ||
CSVFormat.DEFAULT.withFirstRecordAsHeader() | ||
) | ||
parser.stream() | ||
.map { | ||
ToiletInfoFetcher.ToiletRow( | ||
it.get("cot_conts_id").emptyToNull()!!, | ||
it.get("cot_conts_name").emptyToNull()!!, | ||
IMAGE_BASE_URL + (it.get("cot_img_main_url").emptyToNull() ?: return@map null), | ||
it.get("cot_addr_full_old").emptyToNull() ?: return@map null, | ||
it.get("cot_addr_full_new").emptyToNull() ?: return@map null, | ||
it.get("cot_value_01").emptyToNull(), | ||
it.get("cot_value_02").emptyToNull(), | ||
it.get("cot_value_03").emptyToNull(), | ||
it.get("cot_value_04").emptyToNull(), | ||
it.get("cot_value_05").emptyToNull(), | ||
it.get("cot_value_06").emptyToNull(), | ||
it.get("cot_value_07").emptyToNull(), | ||
it.get("cot_value_08").emptyToNull(), | ||
it.get("cot_value_09").emptyToNull(), | ||
it.get("cot_value_10").emptyToNull(), | ||
it.get("cot_value_11").emptyToNull(), | ||
it.get("cot_value_12").emptyToNull(), | ||
it.get("lat").toDoubleOrNull() ?: return@map null, | ||
it.get("lng").toDoubleOrNull() ?: return@map null, | ||
|
||
) | ||
} | ||
.toList() | ||
.mapNotNull { it } | ||
} | ||
.block() ?: emptyList() | ||
} | ||
|
||
companion object { | ||
const val CSV_BASE_URL = "https://bucket-cxcjy2.s3.ap-northeast-2.amazonaws.com/toilet_info_with_latlng.csv" | ||
const val IMAGE_BASE_URL = "https://map.seoul.go.kr" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters