diff --git a/feature/trip-planner/network/api/build.gradle.kts b/feature/trip-planner/network/api/build.gradle.kts index a8cab0a7..00fdc31e 100644 --- a/feature/trip-planner/network/api/build.gradle.kts +++ b/feature/trip-planner/network/api/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.krail.android.library) alias(libs.plugins.krail.android.hilt) + alias(libs.plugins.kotlin.serialization) } android { @@ -12,4 +13,5 @@ dependencies { implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp) implementation(libs.retrofit) + implementation(libs.kotlinx.serialization.json) } diff --git a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/model/StopFinderResponse.kt b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/model/StopFinderResponse.kt index e69de29b..8a3fa3bd 100644 --- a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/model/StopFinderResponse.kt +++ b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/model/StopFinderResponse.kt @@ -0,0 +1,97 @@ +package xyz.ksharma.krail.trip_planner.network.api.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class StopFinderResponse( + @SerialName("version") + val version: String, + + @SerialName("locations") + val locations: List +) + +@Serializable +data class Location( + @SerialName("id") + val id: String, + + @SerialName("isGlobalId") + val isGlobalId: Boolean, + + @SerialName("name") + val name: String, + + @SerialName("disassembledName") + val disassembledName: String? = null, + + @SerialName("coord") + val coord: List, + + @SerialName("type") + val type: String, + + @SerialName("matchQuality") + val matchQuality: Int, + + @SerialName("isBest") + val isBest: Boolean, + + @SerialName("parent") + val parent: Parent? = null, + + @SerialName("assignedStops") + val assignedStops: List? = null, + + @SerialName("properties") + val properties: Properties? = null +) + +@Serializable +data class Parent( + @SerialName("id") + val id: String? = null, + + @SerialName("name") + val name: String, + + @SerialName("type") + val type: String +) + +@Serializable +data class AssignedStop( + @SerialName("id") + val id: String, + + @SerialName("isGlobalId") + val isGlobalId: Boolean, + + @SerialName("name") + val name: String, + + @SerialName("type") + val type: String, + + @SerialName("coord") + val coord: List, + + @SerialName("parent") + val parent: Parent, + + @SerialName("productClasses") + val productClasses: List, + + @SerialName("connectingMode") + val connectingMode: Int, + + @SerialName("properties") + val properties: Properties +) + +@Serializable +data class Properties( + @SerialName("stopId") + val stopId: String +) diff --git a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/repository/TripPlanningRepository.kt b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/repository/TripPlanningRepository.kt index 8bc025d9..e6f81029 100644 --- a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/repository/TripPlanningRepository.kt +++ b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/repository/TripPlanningRepository.kt @@ -1,10 +1,11 @@ package xyz.ksharma.krail.trip_planner.network.api.repository +import xyz.ksharma.krail.trip_planner.network.api.model.StopFinderResponse import xyz.ksharma.krail.trip_planner.network.api.model.StopType interface TripPlanningRepository { - suspend fun stopFinder(stopType: StopType, stopSearchQuery: String) + suspend fun stopFinder(stopType: StopType, stopSearchQuery: String): Result fun trip() } diff --git a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/service/TripPlanningService.kt b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/service/TripPlanningService.kt index 73a69172..0107d845 100644 --- a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/service/TripPlanningService.kt +++ b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/api/service/TripPlanningService.kt @@ -1,7 +1,9 @@ package xyz.ksharma.krail.trip_planner.network.api.service +import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Query +import xyz.ksharma.krail.trip_planner.network.api.model.StopFinderResponse /** * https://opendata.transport.nsw.gov.au/dataset/trip-planner-apis/resource/917c66c3-8123-4a0f-b1b1-b4220f32585d @@ -74,7 +76,7 @@ interface TripPlanningService { * Default value : 10.2.1.42 */ @Query("version") version: String = "10.2.1.42", - ) + ): Response /** * This endpoint is used to find a list of journeys between two locations at the specified diff --git a/feature/trip-planner/network/real/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/real/repository/RealTripPlanningRepository.kt b/feature/trip-planner/network/real/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/real/repository/RealTripPlanningRepository.kt index e924a152..c293f7d3 100644 --- a/feature/trip-planner/network/real/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/real/repository/RealTripPlanningRepository.kt +++ b/feature/trip-planner/network/real/src/main/kotlin/xyz/ksharma/krail/trip_planner/network/real/repository/RealTripPlanningRepository.kt @@ -1,5 +1,11 @@ package xyz.ksharma.krail.trip_planner.network.real.repository +import kotlinx.coroutines.CoroutineDispatcher +import xyz.ksharma.krail.coroutines.ext.suspendSafeResult +import xyz.ksharma.krail.di.AppDispatchers +import xyz.ksharma.krail.di.Dispatcher +import xyz.ksharma.krail.network.toSafeResult +import xyz.ksharma.krail.trip_planner.network.api.model.StopFinderResponse import xyz.ksharma.krail.trip_planner.network.api.model.StopType import xyz.ksharma.krail.trip_planner.network.api.repository.TripPlanningRepository import xyz.ksharma.krail.trip_planner.network.api.service.TripPlanningService @@ -9,10 +15,15 @@ import javax.inject.Singleton @Singleton class RealTripPlanningRepository @Inject constructor( private val tripPlanningService: TripPlanningService, + @Dispatcher(AppDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : TripPlanningRepository { - override suspend fun stopFinder(stopType: StopType, stopSearchQuery: String) { + override suspend fun stopFinder( + stopType: StopType, + stopSearchQuery: String, + ): Result = suspendSafeResult(ioDispatcher) { tripPlanningService.stopFinder(typeSf = stopType.type, nameSf = stopSearchQuery) + .toSafeResult() } override fun trip() {