From e7caeca356764f7d1efe9d07f96f4a7bfd2d5b86 Mon Sep 17 00:00:00 2001 From: Cilly Leang Date: Thu, 2 Apr 2026 21:55:45 +1100 Subject: [PATCH] refactor: core:data -> core:data:client --- core/data/build.gradle.kts | 20 ------- core/data/client/build.gradle.kts | 54 +++++++++++++++++++ .../banksia/core/data/ClientDataDiModule.kt} | 12 +++-- .../repositories/ClientRouteRepository.kt | 25 +++++++++ .../data/repositories/ClientStopRepository.kt | 22 ++++++++ .../repositories/ClientStopTimeRepository.kt | 16 ++++++ .../sources/route/RouteLocalDataSource.kt | 0 .../sources/route/RouteRemoteDataSource.kt | 0 .../data/sources/stop/StopLocalDataSource.kt | 0 .../data/sources/stop/StopRemoteDataSource.kt | 0 .../stoptime/StopTimeLocalDataSource.kt | 0 .../stoptime/StopTimeRemoteDataSource.kt | 0 .../data/sources/trip/TripRemoteDataSource.kt | 0 core/data/server/build.gradle.kts | 21 ++++++++ .../core/data/repositories/RouteRepository.kt | 25 ++------- .../core/data/repositories/StopRepository.kt | 22 ++------ .../data/repositories/StopTimeRepository.kt | 13 +---- server/build.gradle.kts | 2 +- settings.gradle.kts | 2 + ui/build.gradle.kts | 2 +- .../moe/lava/banksia/ui/di/AppModule.kt | 4 +- 21 files changed, 162 insertions(+), 78 deletions(-) create mode 100644 core/data/client/build.gradle.kts rename core/data/{src/commonMain/kotlin/moe/lava/banksia/core/data/DataDiModule.kt => client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt} (81%) create mode 100644 core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt create mode 100644 core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt create mode 100644 core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopTimeRepository.kt rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteRemoteDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopRemoteDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeRemoteDataSource.kt (100%) rename core/data/{ => client}/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/trip/TripRemoteDataSource.kt (100%) create mode 100644 core/data/server/build.gradle.kts diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index e0fea0c..6f78b5c 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -2,9 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.kotlinSerialization) alias(libs.plugins.androidMultiplatformLibrary) - alias(libs.plugins.ksp) } kotlin { @@ -27,26 +25,8 @@ kotlin { jvm() sourceSets { - androidMain.dependencies { - implementation(libs.koin.compose) - implementation(libs.ktor.client.okhttp) - } commonMain.dependencies { - implementation(libs.okio) - implementation(libs.koin.core) - implementation(libs.ktor.client.core) - implementation(libs.ktor.client.contentnegotiation) - implementation(libs.ktor.serialization.kotlinx.json) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.serialization.protobuf) - implementation(projects.core) - implementation(projects.core.room) - } - iosMain.dependencies { - implementation(libs.ktor.client.darwin) } } } diff --git a/core/data/client/build.gradle.kts b/core/data/client/build.gradle.kts new file mode 100644 index 0000000..e9848f3 --- /dev/null +++ b/core/data/client/build.gradle.kts @@ -0,0 +1,54 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.androidMultiplatformLibrary) + alias(libs.plugins.ksp) +} + +kotlin { + android { + namespace = "moe.lava.banksia.core.data.client" + compileSdk = libs.versions.android.compileSdk.get().toInt() + + compilerOptions { + jvmTarget.set(JvmTarget.JVM_11) + } + } + + compilerOptions { + freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") + } + + iosArm64() + iosSimulatorArm64() + + jvm() + + sourceSets { + androidMain.dependencies { + implementation(libs.koin.compose) + implementation(libs.ktor.client.okhttp) + } + commonMain.dependencies { + api(projects.core.data) + + implementation(libs.okio) + implementation(libs.koin.core) + implementation(libs.ktor.client.core) + implementation(libs.ktor.client.contentnegotiation) + implementation(libs.ktor.serialization.kotlinx.json) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.datetime) + implementation(libs.kotlinx.serialization.json) + implementation(libs.kotlinx.serialization.protobuf) + + implementation(projects.core) + implementation(projects.core.room) + } + iosMain.dependencies { + implementation(libs.ktor.client.darwin) + } + } +} diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/DataDiModule.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt similarity index 81% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/DataDiModule.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt index 6529a92..01e961c 100644 --- a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/DataDiModule.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt @@ -8,6 +8,9 @@ import io.ktor.client.plugins.plugin import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json import moe.lava.banksia.core.Constants +import moe.lava.banksia.core.data.repositories.ClientRouteRepository +import moe.lava.banksia.core.data.repositories.ClientStopRepository +import moe.lava.banksia.core.data.repositories.ClientStopTimeRepository import moe.lava.banksia.core.data.repositories.RouteRepository import moe.lava.banksia.core.data.repositories.StopRepository import moe.lava.banksia.core.data.repositories.StopTimeRepository @@ -21,9 +24,10 @@ import moe.lava.banksia.core.room.roomDiModule import moe.lava.banksia.core.util.log import moe.lava.banksia.data.ptv.PtvService import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind import org.koin.dsl.module -val dataDiModule = module { +val clientDataDiModule = module { includes(roomDiModule) // HTTP Clients @@ -56,7 +60,7 @@ val dataDiModule = module { singleOf(::StopTimeRemoteDataSource) // Repositories - singleOf(::RouteRepository) - singleOf(::StopRepository) - singleOf(::StopTimeRepository) + singleOf(::ClientRouteRepository) bind RouteRepository::class + singleOf(::ClientStopRepository) bind StopRepository::class + singleOf(::ClientStopTimeRepository) bind StopTimeRepository::class } diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt new file mode 100644 index 0000000..70a8905 --- /dev/null +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt @@ -0,0 +1,25 @@ +package moe.lava.banksia.core.data.repositories + +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 + +internal class ClientRouteRepository internal constructor( + private val local: RouteLocalDataSource, + private val remote: RouteRemoteDataSource, +) : RouteRepository { + private val mutex = Mutex() + override suspend fun getAll() = mutex.withLock { + local + .getAll() + .map { it.asModel() } + .ifEmpty { + remote + .getAll() + .also { local.save(*it.toTypedArray()) } + } + } + + override suspend fun get(id: String) = mutex.withLock { local.get(id)?.asModel() ?: remote.get(id) } +} diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt new file mode 100644 index 0000000..a5fd300 --- /dev/null +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt @@ -0,0 +1,22 @@ +package moe.lava.banksia.core.data.repositories + +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource +import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource + +internal class ClientStopRepository internal constructor( + private val local: StopLocalDataSource, + private val remote: StopRemoteDataSource, +) : StopRepository { + private val mutex = Mutex() + + override suspend fun get(id: String) = mutex.withLock { local.get(id)?.asModel() ?: remote.get(id) } + override suspend fun getByRoute(id: String) = mutex.withLock { + local + .getByRoute(id) + .map { it.asModel() } + .ifEmpty { null } + ?: remote.getByRoute(id) + } +} diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopTimeRepository.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopTimeRepository.kt new file mode 100644 index 0000000..aea3159 --- /dev/null +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopTimeRepository.kt @@ -0,0 +1,16 @@ +package moe.lava.banksia.core.data.repositories + +import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource +import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource +import moe.lava.banksia.core.model.StopTimeDated + +internal class ClientStopTimeRepository internal constructor( + private val local: StopTimeLocalDataSource, + private val remote: StopTimeRemoteDataSource, +) : StopTimeRepository { + override suspend fun getForStop(id: String): List { + return local + .getAtStop(id) + .ifEmpty { remote.getAtStop(id) } + } +} diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteRemoteDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteRemoteDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteRemoteDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteRemoteDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopRemoteDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopRemoteDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopRemoteDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopRemoteDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeRemoteDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeRemoteDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeRemoteDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeRemoteDataSource.kt diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/trip/TripRemoteDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/trip/TripRemoteDataSource.kt similarity index 100% rename from core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/trip/TripRemoteDataSource.kt rename to core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/trip/TripRemoteDataSource.kt diff --git a/core/data/server/build.gradle.kts b/core/data/server/build.gradle.kts new file mode 100644 index 0000000..eaa309b --- /dev/null +++ b/core/data/server/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinSerialization) +} + +kotlin { + compilerOptions { + freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") + } +} + +dependencies { + implementation(libs.okio) + implementation(libs.koin.core) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.datetime) + + api(projects.core.data) + implementation(projects.core) + implementation(projects.core.room) +} diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/RouteRepository.kt b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/RouteRepository.kt index fdeb95f..fbb663f 100644 --- a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/RouteRepository.kt +++ b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/RouteRepository.kt @@ -1,25 +1,8 @@ package moe.lava.banksia.core.data.repositories -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 -class RouteRepository internal constructor( - private val local: RouteLocalDataSource, - private val remote: RouteRemoteDataSource, -) { - private val mutex = Mutex() - suspend fun getAll() = mutex.withLock { - local - .getAll() - .map { it.asModel() } - .ifEmpty { - remote - .getAll() - .also { local.save(*it.toTypedArray()) } - } - } - - suspend fun get(id: String) = mutex.withLock { local.get(id)?.asModel() ?: remote.get(id) } +interface RouteRepository { + suspend fun get(id: String): Route + suspend fun getAll(): List } diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopRepository.kt b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopRepository.kt index d83a9cd..c663f89 100644 --- a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopRepository.kt +++ b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopRepository.kt @@ -1,22 +1,8 @@ package moe.lava.banksia.core.data.repositories -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource -import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource +import moe.lava.banksia.core.model.Stop -class StopRepository internal constructor( - private val local: StopLocalDataSource, - private val remote: StopRemoteDataSource, -) { - private val mutex = Mutex() - - suspend fun get(id: String) = mutex.withLock { local.get(id)?.asModel() ?: remote.get(id) } - suspend fun getByRoute(id: String) = mutex.withLock { - local - .getByRoute(id) - .map { it.asModel() } - .ifEmpty { null } - ?: remote.getByRoute(id) - } +interface StopRepository { + suspend fun get(id: String): Stop + suspend fun getByRoute(id: String): List } diff --git a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopTimeRepository.kt b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopTimeRepository.kt index 34aa570..87d01ac 100644 --- a/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopTimeRepository.kt +++ b/core/data/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/StopTimeRepository.kt @@ -1,16 +1,7 @@ package moe.lava.banksia.core.data.repositories -import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource -import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource import moe.lava.banksia.core.model.StopTimeDated -class StopTimeRepository internal constructor( - private val local: StopTimeLocalDataSource, - private val remote: StopTimeRemoteDataSource, -) { - suspend fun getForStop(id: String): List { - return local - .getAtStop(id) - .ifEmpty { remote.getAtStop(id) } - } +interface StopTimeRepository { + suspend fun getForStop(id: String): List } diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 0883c85..4150bb2 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application } -group = "moe.lava.banksia" +group = "moe.lava.banksia.server" version = "1.0.0" application { mainClass.set("moe.lava.banksia.server.ApplicationKt") diff --git a/settings.gradle.kts b/settings.gradle.kts index 335422d..9abcf7f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,6 +37,8 @@ include(":server:gtfs") include(":server:gtfs_rt") include(":core") include(":core:data") +include(":core:data:client") +include(":core:data:server") include(":core:room") include(":ui") include(":ui:maps") diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index 018c8e6..9c5c7bd 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -68,7 +68,7 @@ kotlin { implementation(libs.ui.backhandler) implementation(projects.core) - implementation(projects.core.data) + implementation(projects.core.data.client) implementation(projects.ui.maps) implementation(projects.ui.shared) } diff --git a/ui/src/commonMain/kotlin/moe/lava/banksia/ui/di/AppModule.kt b/ui/src/commonMain/kotlin/moe/lava/banksia/ui/di/AppModule.kt index cff36fb..a2b4d7e 100644 --- a/ui/src/commonMain/kotlin/moe/lava/banksia/ui/di/AppModule.kt +++ b/ui/src/commonMain/kotlin/moe/lava/banksia/ui/di/AppModule.kt @@ -1,12 +1,12 @@ package moe.lava.banksia.ui.di -import moe.lava.banksia.core.data.dataDiModule +import moe.lava.banksia.core.data.clientDataDiModule import moe.lava.banksia.ui.screens.map.MapScreenViewModel import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val AppModule = module { - includes(dataDiModule) + includes(clientDataDiModule) // ViewModel viewModelOf(::MapScreenViewModel)