featwip: pretty departures

This commit is contained in:
Cilly Leang 2026-04-13 03:58:00 +10:00
parent ef630b6d58
commit 4e1e05495d
Signed by: cilly
GPG key ID: 6500251E087653C9
13 changed files with 264 additions and 37 deletions

View file

@ -4,6 +4,7 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource
import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource
import moe.lava.banksia.core.model.Route
internal class ClientRouteRepository internal constructor(
private val local: RouteLocalDataSource,
@ -21,5 +22,14 @@ internal class ClientRouteRepository internal constructor(
}
}
private val tripRouteMap = mutableMapOf<String, Route>()
override suspend fun get(id: String) = mutex.withLock { local.get(id)?.asModel() ?: remote.get(id) }
override suspend fun getByTrip(tripId: String) = mutex.withLock {
tripRouteMap[tripId]
?: remote.getByTrip(tripId).also {
local.save(it)
tripRouteMap[tripId] = it
}
}
}

View file

@ -7,5 +7,6 @@ import moe.lava.banksia.core.room.entity.asEntity
internal class RouteLocalDataSource(private val dao: RouteDao) {
suspend fun get(id: String) = dao.get(id)
suspend fun getAll() = dao.getAll()
suspend fun getByTrip(tripId: String) = dao.getByTrip(tripId)
suspend fun save(vararg routes: Route) = dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray())
}

View file

@ -7,5 +7,6 @@ import moe.lava.banksia.core.model.Route
internal class RouteRemoteDataSource(val client: HttpClient) {
suspend fun get(id: String) = client.get("routes/${id}").body<Route>()
suspend fun getByTrip(tripId: String) = client.get("routes/by_trip/${tripId}").body<Route>()
suspend fun getAll() = client.get("routes").body<List<Route>>()
}

View file

@ -3,6 +3,7 @@ package moe.lava.banksia.core.data.repositories
import moe.lava.banksia.core.model.Route
interface RouteRepository {
suspend fun get(id: String): Route
suspend fun get(id: String): Route?
suspend fun getByTrip(tripId: String): Route?
suspend fun getAll(): List<Route>
}

View file

@ -28,6 +28,9 @@ interface RouteDao {
@Query("DELETE FROM Route")
suspend fun deleteAll()
@Query("SELECT * FROM Route INNER JOIN Trip on Route.id == Trip.routeId WHERE Trip.id == :tripId")
suspend fun getByTrip(tripId: String): RouteEntity?
@Query("""
SELECT Stop.* FROM Stop
INNER JOIN StopTime ON StopTime.stopId == Stop.id