wip departures + refactor
This commit is contained in:
parent
b31067992d
commit
41f3523a5a
43 changed files with 596 additions and 204 deletions
|
|
@ -0,0 +1,11 @@
|
|||
package moe.lava.banksia.core.data
|
||||
|
||||
import moe.lava.banksia.core.data.repositories.StopTimeRepository
|
||||
import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
import org.koin.dsl.module
|
||||
|
||||
internal actual val platformModule = module {
|
||||
singleOf(::StopTimeRepository)
|
||||
singleOf(::StopTimeRemoteDataSource)
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package moe.lava.banksia.core.data.repositories
|
||||
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.datetime.LocalDate
|
||||
import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
|
||||
import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource
|
||||
|
||||
actual class StopTimeRepository internal constructor(
|
||||
private val local: StopTimeLocalDataSource,
|
||||
private val remote: StopTimeRemoteDataSource,
|
||||
) {
|
||||
actual suspend fun getForStop(id: String, date: LocalDate) = flow {
|
||||
emit(local.getAtStop(id, date))
|
||||
|
||||
remote.getAtStop(id, date)
|
||||
.takeIf { it.isNotEmpty() }
|
||||
?.let { emit(it) }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package moe.lava.banksia.core.data.sources.stoptime
|
||||
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.call.body
|
||||
import io.ktor.client.request.get
|
||||
import io.ktor.client.request.parameter
|
||||
import kotlinx.datetime.LocalDate
|
||||
import kotlinx.datetime.TimeZone
|
||||
import kotlinx.datetime.todayIn
|
||||
import moe.lava.banksia.core.data.dto.ExtendedStopTime
|
||||
import moe.lava.banksia.core.endpoints.Endpoint
|
||||
import moe.lava.banksia.core.endpoints.stopTimeByStop
|
||||
import kotlin.time.Clock
|
||||
|
||||
internal class StopTimeRemoteDataSource(
|
||||
private val client: HttpClient,
|
||||
) {
|
||||
suspend fun getAtStop(
|
||||
stopId: String,
|
||||
date: LocalDate? = Clock.System.todayIn(TimeZone.currentSystemDefault()),
|
||||
): List<ExtendedStopTime> {
|
||||
return client.get(Endpoint.stopTimeByStop(stopId)) {
|
||||
parameter("date", date)
|
||||
}.body<List<ExtendedStopTime>>()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package moe.lava.banksia.core.data
|
||||
|
||||
import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
|
||||
import org.koin.core.module.Module
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
import org.koin.dsl.module
|
||||
|
||||
internal expect val platformModule: Module;
|
||||
|
||||
val stopTimeDataDiModule = module {
|
||||
includes(platformModule)
|
||||
singleOf(::StopTimeLocalDataSource)
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package moe.lava.banksia.core.data.dto
|
||||
|
||||
import kotlinx.datetime.LocalDate
|
||||
import kotlinx.serialization.Serializable
|
||||
import moe.lava.banksia.core.model.FutureTime
|
||||
import moe.lava.banksia.core.model.RouteType
|
||||
import moe.lava.banksia.core.model.TimeType
|
||||
import moe.lava.banksia.core.model.atDate
|
||||
import moe.lava.banksia.core.sqld.GetExtendedForStop
|
||||
|
||||
@Serializable
|
||||
data class ExtendedStopTime(
|
||||
val patternId: Long,
|
||||
val stopPlatformCode: String?,
|
||||
val time: TimeType.Dated,
|
||||
val headsign: String?,
|
||||
val routeType: RouteType,
|
||||
val routeNumber: String?,
|
||||
val routeName: String,
|
||||
)
|
||||
|
||||
// TODO: This probably doesn't belong here
|
||||
fun GetExtendedForStop.asModel(date: LocalDate) = ExtendedStopTime(
|
||||
patternId = patternId,
|
||||
stopPlatformCode = stopPlatformCode,
|
||||
time = TimeType.Undated(
|
||||
arrival = FutureTime.fromInt((departureTime + arrivalDelta).toInt()),
|
||||
departure = FutureTime.fromInt(departureTime.toInt()),
|
||||
).atDate(date),
|
||||
headsign = headsign,
|
||||
routeType = RouteType.from(routeType.toInt()),
|
||||
routeNumber = routeNumber,
|
||||
routeName = routeName,
|
||||
)
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package moe.lava.banksia.core.data.repositories
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.datetime.LocalDate
|
||||
import kotlinx.datetime.TimeZone
|
||||
import kotlinx.datetime.todayIn
|
||||
import moe.lava.banksia.core.data.dto.ExtendedStopTime
|
||||
import kotlin.time.Clock
|
||||
|
||||
expect class StopTimeRepository {
|
||||
suspend fun getForStop(
|
||||
id: String,
|
||||
date: LocalDate = Clock.System.todayIn(TimeZone.currentSystemDefault()),
|
||||
): Flow<List<ExtendedStopTime>>
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package moe.lava.banksia.core.data.sources.stoptime
|
||||
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.IO
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.datetime.LocalDate
|
||||
import moe.lava.banksia.core.data.dto.ExtendedStopTime
|
||||
import moe.lava.banksia.core.data.dto.asModel
|
||||
import moe.lava.banksia.core.sqld.StopTimeQueries
|
||||
import moe.lava.banksia.core.util.serialise
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.get
|
||||
|
||||
internal class StopTimeLocalDataSource : KoinComponent {
|
||||
private val queries get() = get<StopTimeQueries>()
|
||||
|
||||
suspend fun getAtStop(stopId: String, date: LocalDate): List<ExtendedStopTime> {
|
||||
return withContext(context = Dispatchers.IO) {
|
||||
queries
|
||||
.getExtendedForStop(
|
||||
listOf(date.dayOfWeek).serialise().toLong(),
|
||||
date.toEpochDays(),
|
||||
stopId,
|
||||
)
|
||||
.executeAsList()
|
||||
.map { it.asModel(date) }
|
||||
.sortedBy { it.time.departure }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
package moe.lava.banksia.core.endpoints
|
||||
|
||||
fun Endpoint.stopTimeByStop(stopId: String) = "stoptimes/by_stop/${stopId}"
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package moe.lava.banksia.core.data
|
||||
|
||||
import moe.lava.banksia.core.data.repositories.StopTimeRepository
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
import org.koin.dsl.module
|
||||
|
||||
internal actual val platformModule = module {
|
||||
singleOf(::StopTimeRepository)
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package moe.lava.banksia.core.data.repositories
|
||||
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.datetime.LocalDate
|
||||
import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
|
||||
|
||||
actual class StopTimeRepository internal constructor(
|
||||
private val local: StopTimeLocalDataSource,
|
||||
) {
|
||||
actual suspend fun getForStop(id: String, date: LocalDate) = flow {
|
||||
emit(local.getAtStop(id, date))
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package moe.lava.banksia.server.routes
|
||||
|
||||
import io.ktor.server.response.respond
|
||||
import io.ktor.server.routing.Route
|
||||
import io.ktor.server.routing.get
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.datetime.LocalDate
|
||||
import kotlinx.datetime.TimeZone
|
||||
import kotlinx.datetime.todayIn
|
||||
import moe.lava.banksia.core.data.repositories.StopTimeRepository
|
||||
import moe.lava.banksia.core.endpoints.Endpoint
|
||||
import moe.lava.banksia.core.endpoints.stopTimeByStop
|
||||
import org.koin.ktor.ext.inject
|
||||
import kotlin.time.Clock
|
||||
|
||||
fun Route.stopTimeRoutes() {
|
||||
val repo by inject<StopTimeRepository>()
|
||||
|
||||
get(Endpoint.stopTimeByStop("{stop_id}")) {
|
||||
val stopId = call.parameters["stop_id"]!!
|
||||
val date = call.queryParameters["date"]
|
||||
?.let { LocalDate.parse(it, LocalDate.Formats.ISO) }
|
||||
?: Clock.System.todayIn(TimeZone.currentSystemDefault())
|
||||
val data = repo.getForStop(stopId, date).first()
|
||||
call.respond(data)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue