Skip to content

Commit 728298f

Browse files
committed
feat: 서울 버스 막차 시간 구하기
1 parent 5552972 commit 728298f

File tree

9 files changed

+117
-9
lines changed

9 files changed

+117
-9
lines changed

data/src/main/java/com/stop/data/remote/network/WsBusApiService.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.stop.data.remote.network
22

33
import com.stop.data.remote.model.NetworkResult
4+
import com.stop.domain.model.route.seoul.bus.GetBusLastTimeResponse
45
import com.stop.domain.model.route.seoul.bus.GetBusLineResponse
56
import com.stop.domain.model.route.seoul.bus.GetBusStationArsIdResponse
67
import retrofit2.http.GET
@@ -17,10 +18,19 @@ internal interface WsBusApiService {
1718
@GET(GET_BUS_LINE_URL)
1819
suspend fun getBusLine(
1920
@Query("arsId") stationId: String,
21+
@Query("resultType") resultType: String = "json",
2022
): NetworkResult<GetBusLineResponse>
2123

24+
@GET(GET_BUS_LAST_TIME_URL)
25+
suspend fun getBusLastTime(
26+
@Query("arsId") stationId: String,
27+
@Query("busRouteId") lineId: String,
28+
@Query("resultType") resultType: String = "json",
29+
): NetworkResult<GetBusLastTimeResponse>
30+
2231
companion object {
2332
private const val GET_BUS_ARS_URL = "stationinfo/getStationByName"
2433
private const val GET_BUS_LINE_URL = "stationinfo/getRouteByStation"
34+
private const val GET_BUS_LAST_TIME_URL = "stationinfo/getBustimeByStation"
2535
}
2636
}

data/src/main/java/com/stop/data/remote/source/route/RouteRemoteDataSource.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.stop.data.remote.source.route
22

33
import com.stop.domain.model.geoLocation.AddressType
44
import com.stop.domain.model.route.gyeonggi.GetGyeonggiBusStationIdResponse
5+
import com.stop.domain.model.route.seoul.bus.GetBusLastTimeResponse
56
import com.stop.domain.model.route.seoul.bus.GetBusLineResponse
67
import com.stop.domain.model.route.seoul.bus.GetBusStationArsIdResponse
78
import com.stop.domain.model.route.tmap.RouteRequest
@@ -21,5 +22,7 @@ internal interface RouteRemoteDataSource {
2122

2223
suspend fun getSeoulBusLine(stationId: String): GetBusLineResponse
2324

25+
suspend fun getSeoulBusLastTime(stationId: String, lineId: String): GetBusLastTimeResponse
26+
2427
suspend fun getGyeonggiBusStationId(stationName: String): GetGyeonggiBusStationIdResponse
2528
}

data/src/main/java/com/stop/data/remote/source/route/RouteRemoteDataSourceImpl.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.stop.data.remote.network.TmapApiService
77
import com.stop.data.remote.network.WsBusApiService
88
import com.stop.domain.model.geoLocation.AddressType
99
import com.stop.domain.model.route.gyeonggi.GetGyeonggiBusStationIdResponse
10+
import com.stop.domain.model.route.seoul.bus.GetBusLastTimeResponse
1011
import com.stop.domain.model.route.seoul.bus.GetBusLineResponse
1112
import com.stop.domain.model.route.seoul.bus.GetBusStationArsIdResponse
1213
import com.stop.domain.model.route.seoul.subway.SubwayStationResponse
@@ -89,6 +90,17 @@ internal class RouteRemoteDataSourceImpl @Inject constructor(
8990
}
9091
}
9192

93+
override suspend fun getSeoulBusLastTime(stationId: String, lineId: String): GetBusLastTimeResponse {
94+
with(wsBusApiService.getBusLastTime(stationId, lineId)) {
95+
return when(this) {
96+
is NetworkResult.Success -> this.data
97+
is NetworkResult.Failure -> throw IllegalArgumentException(this.message)
98+
is NetworkResult.NetworkError -> throw this.exception
99+
is NetworkResult.Unexpected -> throw this.exception
100+
}
101+
}
102+
}
103+
92104
override suspend fun getGyeonggiBusStationId(stationName: String): GetGyeonggiBusStationIdResponse {
93105
with(apisDataService.getBusStationId(stationName)) {
94106
return when (this) {

data/src/main/java/com/stop/data/repository/RouteRepositoryImpl.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ import javax.inject.Inject
1414

1515
internal class RouteRepositoryImpl @Inject constructor(
1616
private val remoteDataSource: RouteRemoteDataSource
17-
): RouteRepository {
17+
) : RouteRepository {
1818

1919
override suspend fun getRoute(routeRequest: RouteRequest): RouteResponse {
2020
return remoteDataSource.getRoute(routeRequest)
2121
}
2222

23-
override suspend fun reverseGeocoding(coordinate: Coordinate, addressType: AddressType): ReverseGeocodingResponse {
23+
override suspend fun reverseGeocoding(
24+
coordinate: Coordinate,
25+
addressType: AddressType
26+
): ReverseGeocodingResponse {
2427
return remoteDataSource.reverseGeocoding(coordinate, addressType)
2528
}
2629

@@ -36,6 +39,14 @@ internal class RouteRepositoryImpl @Inject constructor(
3639
return remoteDataSource.getSeoulBusLine(stationId)
3740
}
3841

42+
override suspend fun getSeoulBusLastTime(stationId: String, lineId: String): String {
43+
return remoteDataSource.getSeoulBusLastTime(stationId, lineId)
44+
.lastTimeMsgBody
45+
.lastTimes
46+
.first()
47+
.lastTime
48+
}
49+
3950
override suspend fun getGyeonggiBusStationId(stationName: String): GetGyeonggiBusStationIdResponse {
4051
return remoteDataSource.getGyeonggiBusStationId(stationName)
4152
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.stop.domain.model.route.seoul.bus
2+
3+
import com.squareup.moshi.Json
4+
import com.squareup.moshi.JsonClass
5+
6+
@JsonClass(generateAdapter = true)
7+
data class GetBusLastTimeResponse(
8+
@Json(name = "msgBody")
9+
val lastTimeMsgBody: LastTimeMsgBody,
10+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.stop.domain.model.route.seoul.bus
2+
3+
import com.squareup.moshi.Json
4+
import com.squareup.moshi.JsonClass
5+
6+
@JsonClass(generateAdapter = true)
7+
data class LastTimeInfo(
8+
@Json(name = "lastBusTm")
9+
val lastTime: String
10+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.stop.domain.model.route.seoul.bus
2+
3+
import com.squareup.moshi.Json
4+
import com.squareup.moshi.JsonClass
5+
6+
@JsonClass(generateAdapter = true)
7+
data class LastTimeMsgBody(
8+
@Json(name = "itemList")
9+
val lastTimes: List<LastTimeInfo>
10+
)

domain/src/main/java/com/stop/domain/repository/RouteRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface RouteRepository {
1818

1919
suspend fun getSeoulBusStationArsId(stationName: String): GetBusStationArsIdResponse
2020
suspend fun getSeoulBusLine(stationId: String): GetBusLineResponse
21+
suspend fun getSeoulBusLastTime(stationId: String, lineId: String): String
2122

2223
suspend fun getGyeonggiBusStationId(stationName: String): GetGyeonggiBusStationIdResponse
2324
}

domain/src/main/java/com/stop/domain/usecase/route/GetLastTransportTimeUseCaseImpl.kt

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
3939
stationType = route.routeType,
4040
area = getArea(startStation.coordinate),
4141
lineName = route.routeInfo,
42-
lineId = UNKNOWN_ID
42+
lineId = UNKNOWN_ID,
43+
term = NOT_YET_CALCULATED,
4344
)
4445
}
4546
else -> transportIdRequests
@@ -77,27 +78,66 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
7778

7879

7980
// 고유 번호로 승차지의 막차 시간 모두 알아내기
80-
// val dataWithLastTime: List<Unit>
81+
val dataWithLastTime: List<String> = transportIdRequests.map { transportIdRequest ->
82+
when (transportIdRequest.transportMoveType) {
83+
TransportMoveType.BUS -> getBusLastTransportTime(transportIdRequest)
84+
TransportMoveType.SUBWAY -> getSubwayLastTransportTime(transportIdRequest)
85+
}
86+
}
8187

8288
// 막차 시간 중 가장 빠른 시간과 dataWithLastTime을 가지는 데이터 클래스 반환하기
8389
// return ReturnData(fastestTime, dataWithLastTime)
8490
return null
8591
}
8692

87-
private suspend fun getId(
88-
transportIdRequest: TransportIdRequest,
89-
): String {
93+
private fun getSubwayLastTransportTime(transportIdRequest: TransportIdRequest): String {
94+
TODO()
95+
}
96+
97+
private suspend fun getBusLastTransportTime(transportIdRequest: TransportIdRequest): String {
98+
when (transportIdRequest.area) {
99+
Area.GYEONGGI -> {
100+
TODO()
101+
}
102+
Area.SEOUL -> {
103+
return routeRepository.getSeoulBusLastTime(
104+
transportIdRequest.stationId,
105+
transportIdRequest.lineId
106+
)
107+
}
108+
Area.UN_SUPPORT_AREA -> {
109+
TODO()
110+
}
111+
}
112+
}
113+
114+
115+
private suspend fun getSeoulBusLineId(transportIdRequest: TransportIdRequest): TransportIdRequest {
116+
val busName = transportIdRequest.lineName.split(":")[1]
117+
val line =
118+
routeRepository.getSeoulBusLine(transportIdRequest.stationId).lineIdMsgBody.busLines.firstOrNull {
119+
it.busLineName == busName
120+
} ?: throw NoAppropriateDataException(NO_BUS_LINE_ID)
121+
122+
return transportIdRequest.changeLineId(line.lineId, line.term)
123+
}
124+
125+
private suspend fun getStationId(transportIdRequest: TransportIdRequest): String {
90126
return when (transportIdRequest.transportMoveType) {
91127
TransportMoveType.SUBWAY -> {
92128
if (allowedSubwayLineForUse.contains(transportIdRequest.stationType).not()) {
93129
throw NoAppropriateDataException(NOT_REGISTERED_STATION)
94130
}
95-
routeRepository.getSubwayStationCd(transportIdRequest.id, transportIdRequest.stationName)
131+
routeRepository.getSubwayStationCd(
132+
transportIdRequest.stationId,
133+
transportIdRequest.stationName
134+
)
96135
}
97136
TransportMoveType.BUS -> {
98137
getBusIdUsedAtPublicApi(transportIdRequest)
99138
}
100139
}
140+
}
101141

102142
private suspend fun getArea(coordinate: Coordinate): Area {
103143
val areaName =
@@ -173,7 +213,7 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
173213
}
174214
}
175215

176-
return closestStation?.arsId ?: UNKNOWN_ARS_ID
216+
return closestStation?.arsId ?: UNKNOWN_ID
177217
}
178218

179219
private fun findClosestGyeonggiBusStation(
@@ -225,6 +265,7 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
225265
private const val GYEONGGI_REGION_BUS_NOT_SUPPORT = "경기도 마을 버스 정보는 API에서 제공하지 않습니다."
226266

227267
private const val UNKNOWN_ID = "0"
268+
private const val NOT_YET_CALCULATED = 0
228269
private const val KOREA_LONGITUDE = 127
229270
private const val KOREA_LATITUDE = 37
230271
private const val CORRECTION_VALUE = 10_000

0 commit comments

Comments
 (0)