refactor: split up room into a module, and move client module

This commit is contained in:
Cilly Leang 2026-04-01 22:48:04 +11:00
parent c55e3a3232
commit 104a77b27e
Signed by: cilly
GPG key ID: 6500251E087653C9
60 changed files with 220 additions and 170 deletions

View file

@ -1,12 +0,0 @@
package moe.lava.banksia.client.data.stop
import moe.lava.banksia.model.Stop
import moe.lava.banksia.room.dao.RouteDao
import moe.lava.banksia.room.dao.StopDao
import moe.lava.banksia.room.entity.asEntity
class StopLocalDataSource(private val dao: StopDao, private val routeDao: RouteDao) {
suspend fun get(id: String) = dao.get(id)
suspend fun getByRoute(id: String) = routeDao.stops(id)
suspend fun save(vararg stops: Stop) = dao.insertOrReplaceAll(*stops.map { it.asEntity() }.toTypedArray())
}

View file

@ -39,4 +39,6 @@ dependencies {
implementation(libs.sqlite.bundled) implementation(libs.sqlite.bundled)
testImplementation(libs.ktor.server.tests) testImplementation(libs.ktor.server.tests)
testImplementation(libs.kotlin.test.junit) testImplementation(libs.kotlin.test.junit)
implementation(projects.shared.room)
} }

View file

@ -19,12 +19,11 @@ import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
import kotlinx.datetime.todayIn import kotlinx.datetime.todayIn
import moe.lava.banksia.Constants import moe.lava.banksia.Constants
import moe.lava.banksia.di.CommonModules import moe.lava.banksia.core.room.dao.RouteDao
import moe.lava.banksia.core.room.dao.StopDao
import moe.lava.banksia.core.room.dao.StopTimeDao
import moe.lava.banksia.core.room.dao.VersionMetadataDao
import moe.lava.banksia.model.atDate import moe.lava.banksia.model.atDate
import moe.lava.banksia.room.dao.RouteDao
import moe.lava.banksia.room.dao.StopDao
import moe.lava.banksia.room.dao.StopTimeDao
import moe.lava.banksia.room.dao.VersionMetadataDao
import moe.lava.banksia.server.di.ServerModules import moe.lava.banksia.server.di.ServerModules
import moe.lava.banksia.server.gtfsrt.GtfsrtService import moe.lava.banksia.server.gtfsrt.GtfsrtService
import moe.lava.banksia.util.serialise import moe.lava.banksia.util.serialise
@ -44,14 +43,12 @@ fun Application.module() {
} }
install(Koin) { install(Koin) {
modules(module { single { log } }) modules(module { single { log } })
modules(CommonModules, ServerModules) modules(ServerModules)
} }
@Suppress("KotlinConstantConditions")
if (!Constants.devMode) {
val gtfsr by inject<GtfsrtService>() val gtfsr by inject<GtfsrtService>()
launch { gtfsr.start(this, true) } @Suppress("KotlinConstantConditions")
} launch { gtfsr.start(this, !Constants.devMode) }
routing { routing {
if (Constants.devMode) { if (Constants.devMode) {

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.server package moe.lava.banksia.server
import moe.lava.banksia.room.Database import moe.lava.banksia.core.room.Database
import moe.lava.banksia.room.entity.StopEntity import moe.lava.banksia.core.room.entity.StopEntity
import moe.lava.banksia.util.log import moe.lava.banksia.util.log
import java.security.MessageDigest import java.security.MessageDigest

View file

@ -3,6 +3,8 @@ package moe.lava.banksia.server
import androidx.room.immediateTransaction import androidx.room.immediateTransaction
import androidx.room.useWriterConnection import androidx.room.useWriterConnection
import io.ktor.util.logging.Logger import io.ktor.util.logging.Logger
import moe.lava.banksia.core.room.Database
import moe.lava.banksia.core.room.entity.asEntity
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.model.Service import moe.lava.banksia.model.Service
import moe.lava.banksia.model.ServiceException import moe.lava.banksia.model.ServiceException
@ -10,8 +12,6 @@ import moe.lava.banksia.model.Shape
import moe.lava.banksia.model.Stop import moe.lava.banksia.model.Stop
import moe.lava.banksia.model.StopTime import moe.lava.banksia.model.StopTime
import moe.lava.banksia.model.Trip import moe.lava.banksia.model.Trip
import moe.lava.banksia.room.Database
import moe.lava.banksia.room.entity.asEntity
import moe.lava.banksia.server.gtfs.GtfsData import moe.lava.banksia.server.gtfs.GtfsData
import moe.lava.banksia.server.gtfs.GtfsParser import moe.lava.banksia.server.gtfs.GtfsParser
import kotlin.time.Clock import kotlin.time.Clock

View file

@ -1,6 +1,7 @@
package moe.lava.banksia.server.di package moe.lava.banksia.server.di
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import moe.lava.banksia.core.room.roomDiModule
import moe.lava.banksia.server.GtfsDataFixer import moe.lava.banksia.server.GtfsDataFixer
import moe.lava.banksia.server.GtfsImporter import moe.lava.banksia.server.GtfsImporter
import moe.lava.banksia.server.gtfs.GtfsParser import moe.lava.banksia.server.gtfs.GtfsParser
@ -9,6 +10,8 @@ import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module import org.koin.dsl.module
val ServerModules = module { val ServerModules = module {
includes(roomDiModule)
single { HttpClient() } single { HttpClient() }
singleOf(::GtfsParser) singleOf(::GtfsParser)
singleOf(::GtfsrtService) singleOf(::GtfsrtService)

View file

@ -32,11 +32,12 @@ dependencyResolutionManagement {
} }
include(":androidApp") include(":androidApp")
include(":client")
include(":server") include(":server")
include(":server:gtfs") include(":server:gtfs")
include(":server:gtfs_rt") include(":server:gtfs_rt")
include(":shared") include(":shared")
include(":shared:data")
include(":shared:room")
include(":ui") include(":ui")
include(":ui:maps") include(":ui:maps")
include(":ui:shared") include(":ui:shared")

View file

@ -4,11 +4,12 @@ plugins {
alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.kotlinSerialization) alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.androidMultiplatformLibrary)
alias(libs.plugins.ksp)
} }
kotlin { kotlin {
android { android {
namespace = "moe.lava.banksia.client" namespace = "moe.lava.banksia.core.data"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
compilerOptions { compilerOptions {
@ -23,21 +24,29 @@ kotlin {
iosArm64() iosArm64()
iosSimulatorArm64() iosSimulatorArm64()
jvm()
sourceSets { sourceSets {
androidMain.dependencies { androidMain.dependencies {
implementation(libs.compose.ui.tooling.preview) implementation(libs.koin.compose)
implementation(libs.androidx.activity.compose) implementation(libs.ktor.client.okhttp)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.play.services.location)
} }
commonMain.dependencies { commonMain.dependencies {
implementation(libs.okio)
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.datetime)
implementation(libs.ktor.client.core) implementation(libs.ktor.client.core)
implementation(libs.ktor.client.contentnegotiation) implementation(libs.ktor.client.contentnegotiation)
implementation(libs.ktor.serialization.kotlinx.json) 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.shared) implementation(projects.shared)
implementation(projects.shared.room)
}
iosMain.dependencies {
implementation(libs.ktor.client.darwin)
} }
} }
} }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.di package moe.lava.banksia.core.data
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpSend
@ -8,21 +8,24 @@ import io.ktor.client.plugins.plugin
import io.ktor.serialization.kotlinx.json.json import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import moe.lava.banksia.Constants import moe.lava.banksia.Constants
import moe.lava.banksia.client.data.route.RouteLocalDataSource import moe.lava.banksia.core.data.repositories.RouteRepository
import moe.lava.banksia.client.data.route.RouteRemoteDataSource import moe.lava.banksia.core.data.repositories.StopRepository
import moe.lava.banksia.client.data.stop.StopLocalDataSource import moe.lava.banksia.core.data.repositories.StopTimeRepository
import moe.lava.banksia.client.data.stop.StopRemoteDataSource import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeLocalDataSource import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeRemoteDataSource import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource
import moe.lava.banksia.client.repository.RouteRepository import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource
import moe.lava.banksia.client.repository.StopRepository import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
import moe.lava.banksia.client.repository.StopTimeRepository import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource
import moe.lava.banksia.core.room.roomDiModule
import moe.lava.banksia.data.ptv.PtvService import moe.lava.banksia.data.ptv.PtvService
import moe.lava.banksia.util.log import moe.lava.banksia.util.log
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module import org.koin.dsl.module
val ClientModule = module { val dataDiModule = module {
includes(roomDiModule)
// HTTP Clients // HTTP Clients
singleOf(::PtvService) singleOf(::PtvService)
single { single {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.client.repository package moe.lava.banksia.core.data.repositories
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import moe.lava.banksia.client.data.route.RouteLocalDataSource import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource
import moe.lava.banksia.client.data.route.RouteRemoteDataSource import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource
class RouteRepository( class RouteRepository internal constructor(
private val local: RouteLocalDataSource, private val local: RouteLocalDataSource,
private val remote: RouteRemoteDataSource, private val remote: RouteRemoteDataSource,
) { ) {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.client.repository package moe.lava.banksia.core.data.repositories
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import moe.lava.banksia.client.data.stop.StopLocalDataSource import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource
import moe.lava.banksia.client.data.stop.StopRemoteDataSource import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource
class StopRepository( class StopRepository internal constructor(
private val local: StopLocalDataSource, private val local: StopLocalDataSource,
private val remote: StopRemoteDataSource, private val remote: StopRemoteDataSource,
) { ) {

View file

@ -1,10 +1,10 @@
package moe.lava.banksia.client.repository package moe.lava.banksia.core.data.repositories
import moe.lava.banksia.client.data.stoptime.StopTimeLocalDataSource import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeRemoteDataSource import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource
import moe.lava.banksia.model.StopTimeDated import moe.lava.banksia.model.StopTimeDated
class StopTimeRepository( class StopTimeRepository internal constructor(
private val local: StopTimeLocalDataSource, private val local: StopTimeLocalDataSource,
private val remote: StopTimeRemoteDataSource, private val remote: StopTimeRemoteDataSource,
) { ) {

View file

@ -1,10 +1,10 @@
package moe.lava.banksia.client.data.route package moe.lava.banksia.core.data.sources.route
import moe.lava.banksia.core.room.dao.RouteDao
import moe.lava.banksia.core.room.entity.asEntity
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.room.dao.RouteDao
import moe.lava.banksia.room.entity.asEntity
class RouteLocalDataSource(private val dao: RouteDao) { internal class RouteLocalDataSource(private val dao: RouteDao) {
suspend fun get(id: String) = dao.get(id) suspend fun get(id: String) = dao.get(id)
suspend fun getAll() = dao.getAll() suspend fun getAll() = dao.getAll()
suspend fun save(vararg routes: Route) = dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray()) suspend fun save(vararg routes: Route) = dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray())

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.client.data.route package moe.lava.banksia.core.data.sources.route
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.get import io.ktor.client.request.get
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
class RouteRemoteDataSource(val client: HttpClient) { internal class RouteRemoteDataSource(val client: HttpClient) {
suspend fun get(id: String) = client.get("routes/${id}").body<Route>() suspend fun get(id: String) = client.get("routes/${id}").body<Route>()
suspend fun getAll() = client.get("routes").body<List<Route>>() suspend fun getAll() = client.get("routes").body<List<Route>>()
} }

View file

@ -0,0 +1,12 @@
package moe.lava.banksia.core.data.sources.stop
import moe.lava.banksia.core.room.dao.RouteDao
import moe.lava.banksia.core.room.dao.StopDao
import moe.lava.banksia.core.room.entity.asEntity
import moe.lava.banksia.model.Stop
internal class StopLocalDataSource(private val dao: StopDao, private val routeDao: RouteDao) {
suspend fun get(id: String) = dao.get(id)
suspend fun getByRoute(id: String) = routeDao.stops(id)
suspend fun save(vararg stops: Stop) = dao.insertOrReplaceAll(*stops.map { it.asEntity() }.toTypedArray())
}

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.client.data.stop package moe.lava.banksia.core.data.sources.stop
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.get import io.ktor.client.request.get
import moe.lava.banksia.model.Stop import moe.lava.banksia.model.Stop
class StopRemoteDataSource(val client: HttpClient) { internal class StopRemoteDataSource(val client: HttpClient) {
suspend fun get(id: String) = client.get("stops/${id}").body<Stop>() suspend fun get(id: String) = client.get("stops/${id}").body<Stop>()
suspend fun getByRoute(id: String) = client.get("route_stops/${id}").body<List<Stop>>() suspend fun getByRoute(id: String) = client.get("route_stops/${id}").body<List<Stop>>()
} }

View file

@ -1,15 +1,15 @@
package moe.lava.banksia.client.data.stoptime package moe.lava.banksia.core.data.sources.stoptime
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
import kotlinx.datetime.todayIn import kotlinx.datetime.todayIn
import moe.lava.banksia.core.room.dao.StopTimeDao
import moe.lava.banksia.model.StopTimeDated import moe.lava.banksia.model.StopTimeDated
import moe.lava.banksia.model.atDate import moe.lava.banksia.model.atDate
import moe.lava.banksia.room.dao.StopTimeDao
import moe.lava.banksia.util.serialise import moe.lava.banksia.util.serialise
import kotlin.time.Clock import kotlin.time.Clock
class StopTimeLocalDataSource( internal class StopTimeLocalDataSource(
private val stopTimeDao: StopTimeDao, private val stopTimeDao: StopTimeDao,
) { ) {
suspend fun getAtStop( suspend fun getAtStop(

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.data.stoptime package moe.lava.banksia.core.data.sources.stoptime
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
@ -10,7 +10,7 @@ import kotlinx.datetime.todayIn
import moe.lava.banksia.model.StopTimeDated import moe.lava.banksia.model.StopTimeDated
import kotlin.time.Clock import kotlin.time.Clock
class StopTimeRemoteDataSource( internal class StopTimeRemoteDataSource(
private val client: HttpClient, private val client: HttpClient,
) { ) {
suspend fun getAtStop( suspend fun getAtStop(

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.data.trip package moe.lava.banksia.core.data.sources.trip
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import kotlinx.datetime.DayOfWeek import kotlinx.datetime.DayOfWeek
@ -7,7 +7,7 @@ import kotlinx.datetime.todayIn
import moe.lava.banksia.model.Trip import moe.lava.banksia.model.Trip
import kotlin.time.Clock import kotlin.time.Clock
class TripRemoteDataSource( internal class TripRemoteDataSource(
private val client: HttpClient, private val client: HttpClient,
) { ) {
suspend fun get( suspend fun get(

View file

@ -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)
alias(libs.plugins.room)
}
room {
schemaDirectory("$projectDir/schemas")
}
kotlin {
android {
namespace = "moe.lava.banksia.core.room"
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 {
commonMain.dependencies {
implementation(libs.okio)
implementation(libs.koin.core)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.datetime)
implementation(libs.kotlinx.serialization.json)
implementation(libs.room.runtime)
implementation(libs.sqlite.bundled)
implementation(projects.shared)
}
}
}
dependencies {
add("kspAndroid", libs.room.compiler)
add("kspIosArm64", libs.room.compiler)
add("kspIosSimulatorArm64", libs.room.compiler)
add("kspJvm", libs.room.compiler)
}

View file

@ -1,12 +1,10 @@
package moe.lava.banksia.di package moe.lava.banksia.core.room
import android.content.Context import android.content.Context
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.koin.dsl.module
class AndroidDatabaseBuilder(val ctx: Context) : PlatformDatabaseBuilder { class AndroidDatabaseBuilder(val ctx: Context) : PlatformDatabaseBuilder {
override fun getBuilder(): RoomDatabase.Builder<Database> { override fun getBuilder(): RoomDatabase.Builder<Database> {
@ -19,7 +17,5 @@ class AndroidDatabaseBuilder(val ctx: Context) : PlatformDatabaseBuilder {
} }
} }
actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder = internal actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder =
AndroidDatabaseBuilder(get()) AndroidDatabaseBuilder(get())
internal actual val ExtPlatformModule = module { }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room package moe.lava.banksia.core.room
import androidx.room.AutoMigration import androidx.room.AutoMigration
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
@ -10,23 +10,23 @@ import androidx.sqlite.driver.bundled.BundledSQLiteDriver
import androidx.sqlite.execSQL import androidx.sqlite.execSQL
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO import kotlinx.coroutines.IO
import moe.lava.banksia.room.converter.RouteTypeConverter import moe.lava.banksia.core.room.converter.RouteTypeConverter
import moe.lava.banksia.room.dao.RouteDao import moe.lava.banksia.core.room.dao.RouteDao
import moe.lava.banksia.room.dao.ServiceDao import moe.lava.banksia.core.room.dao.ServiceDao
import moe.lava.banksia.room.dao.ServiceExceptionDao import moe.lava.banksia.core.room.dao.ServiceExceptionDao
import moe.lava.banksia.room.dao.ShapeDao import moe.lava.banksia.core.room.dao.ShapeDao
import moe.lava.banksia.room.dao.StopDao import moe.lava.banksia.core.room.dao.StopDao
import moe.lava.banksia.room.dao.StopTimeDao import moe.lava.banksia.core.room.dao.StopTimeDao
import moe.lava.banksia.room.dao.TripDao import moe.lava.banksia.core.room.dao.TripDao
import moe.lava.banksia.room.dao.VersionMetadataDao import moe.lava.banksia.core.room.dao.VersionMetadataDao
import moe.lava.banksia.room.entity.RouteEntity import moe.lava.banksia.core.room.entity.RouteEntity
import moe.lava.banksia.room.entity.ServiceEntity import moe.lava.banksia.core.room.entity.ServiceEntity
import moe.lava.banksia.room.entity.ServiceExceptionEntity import moe.lava.banksia.core.room.entity.ServiceExceptionEntity
import moe.lava.banksia.room.entity.ShapeEntity import moe.lava.banksia.core.room.entity.ShapeEntity
import moe.lava.banksia.room.entity.StopEntity import moe.lava.banksia.core.room.entity.StopEntity
import moe.lava.banksia.room.entity.StopTimeEntity import moe.lava.banksia.core.room.entity.StopTimeEntity
import moe.lava.banksia.room.entity.TripEntity import moe.lava.banksia.core.room.entity.TripEntity
import moe.lava.banksia.room.entity.VersionMetadataEntity import moe.lava.banksia.core.room.entity.VersionMetadataEntity
import androidx.room.Database as DatabaseAnnotation import androidx.room.Database as DatabaseAnnotation
@DatabaseAnnotation( @DatabaseAnnotation(

View file

@ -1,12 +1,14 @@
package moe.lava.banksia.di package moe.lava.banksia.core.room
import moe.lava.banksia.room.Database import androidx.room.RoomDatabase
import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope
import org.koin.dsl.module import org.koin.dsl.module
val CommonModules = module { val roomDiModule = module {
includes(PlatformModule) single { provideDatabaseBuilder(it) }
single { Database.build(get<PlatformDatabaseBuilder>().getBuilder()) } single { Database.build(get<PlatformDatabaseBuilder>().getBuilder()) }
single { get<Database>().versionMetadataDao } single { get<Database>().versionMetadataDao }
single { get<Database>().routeDao } single { get<Database>().routeDao }
single { get<Database>().serviceDao } single { get<Database>().serviceDao }
@ -16,3 +18,9 @@ val CommonModules = module {
single { get<Database>().stopTimeDao } single { get<Database>().stopTimeDao }
single { get<Database>().tripDao } single { get<Database>().tripDao }
} }
internal interface PlatformDatabaseBuilder {
fun getBuilder(): RoomDatabase.Builder<Database>
}
internal expect fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.converter package moe.lava.banksia.core.room.converter
import androidx.room.TypeConverter import androidx.room.TypeConverter
import moe.lava.banksia.model.RouteType import moe.lava.banksia.model.RouteType

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.converter package moe.lava.banksia.core.room.converter
import androidx.room.TypeConverter import androidx.room.TypeConverter
import moe.lava.banksia.model.ShapePath import moe.lava.banksia.model.ShapePath

View file

@ -1,12 +1,12 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.RouteEntity import moe.lava.banksia.core.room.entity.RouteEntity
import moe.lava.banksia.room.entity.StopEntity import moe.lava.banksia.core.room.entity.StopEntity
@Dao @Dao
interface RouteDao { interface RouteDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.ServiceEntity import moe.lava.banksia.core.room.entity.ServiceEntity
@Dao @Dao
interface ServiceDao { interface ServiceDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.ServiceExceptionEntity import moe.lava.banksia.core.room.entity.ServiceExceptionEntity
@Dao @Dao
interface ServiceExceptionDao { interface ServiceExceptionDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.ShapeEntity import moe.lava.banksia.core.room.entity.ShapeEntity
@Dao @Dao
interface ShapeDao { interface ShapeDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.StopEntity import moe.lava.banksia.core.room.entity.StopEntity
@Dao @Dao
interface StopDao { interface StopDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.StopTimeEntity import moe.lava.banksia.core.room.entity.StopTimeEntity
@Dao @Dao
interface StopTimeDao { interface StopTimeDao {

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.TripEntity import moe.lava.banksia.core.room.entity.TripEntity
@Dao @Dao
interface TripDao { interface TripDao {

View file

@ -1,10 +1,10 @@
package moe.lava.banksia.room.dao package moe.lava.banksia.core.room.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query import androidx.room.Query
import moe.lava.banksia.room.entity.VersionMetadataEntity import moe.lava.banksia.core.room.entity.VersionMetadataEntity
@Dao @Dao
interface VersionMetadataDao { interface VersionMetadataDao {

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -1,11 +1,11 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import androidx.room.TypeConverters import androidx.room.TypeConverters
import moe.lava.banksia.core.room.converter.ShapePathConverter
import moe.lava.banksia.model.Shape import moe.lava.banksia.model.Shape
import moe.lava.banksia.model.ShapePath import moe.lava.banksia.model.ShapePath
import moe.lava.banksia.room.converter.ShapePathConverter
@Entity("Shape") @Entity("Shape")
@TypeConverters(ShapePathConverter::class) @TypeConverters(ShapePathConverter::class)

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.ForeignKey import androidx.room.ForeignKey

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.room.entity package moe.lava.banksia.core.room.entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -1,10 +1,8 @@
package moe.lava.banksia.di package moe.lava.banksia.core.room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.koin.dsl.module
class IosDatabaseBuilder() : PlatformDatabaseBuilder { class IosDatabaseBuilder() : PlatformDatabaseBuilder {
override fun getBuilder(): RoomDatabase.Builder<Database> { override fun getBuilder(): RoomDatabase.Builder<Database> {
@ -12,7 +10,5 @@ class IosDatabaseBuilder() : PlatformDatabaseBuilder {
} }
} }
actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder = internal actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder =
IosDatabaseBuilder() IosDatabaseBuilder()
internal actual val ExtPlatformModule = module { }

View file

@ -1,11 +1,9 @@
package moe.lava.banksia.di package moe.lava.banksia.core.room
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.koin.dsl.module
import java.io.File import java.io.File
class JvmDatabaseBuilder() : PlatformDatabaseBuilder { class JvmDatabaseBuilder() : PlatformDatabaseBuilder {
@ -17,7 +15,5 @@ class JvmDatabaseBuilder() : PlatformDatabaseBuilder {
} }
} }
actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder = internal actual fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder =
JvmDatabaseBuilder() JvmDatabaseBuilder()
internal actual val ExtPlatformModule = module { }

View file

@ -0,0 +1,5 @@
package moe.lava.banksia.di
import org.koin.dsl.module
val coreDiModule = module { }

View file

@ -1,21 +0,0 @@
package moe.lava.banksia.di
import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.module.Module
import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope
import org.koin.dsl.module
interface PlatformDatabaseBuilder {
fun getBuilder(): RoomDatabase.Builder<Database>
}
expect fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder
internal expect val ExtPlatformModule: Module
internal val PlatformModule = module {
includes(ExtPlatformModule)
single { provideDatabaseBuilder(it) }
}

View file

@ -67,8 +67,8 @@ kotlin {
implementation(libs.moko.geo.compose) implementation(libs.moko.geo.compose)
implementation(libs.ui.backhandler) implementation(libs.ui.backhandler)
implementation(projects.client)
implementation(projects.shared) implementation(projects.shared)
implementation(projects.shared.data)
implementation(projects.ui.maps) implementation(projects.ui.maps)
implementation(projects.ui.shared) implementation(projects.ui.shared)
} }

View file

@ -3,7 +3,7 @@ package moe.lava.banksia.ui
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import moe.lava.banksia.di.CommonModules import moe.lava.banksia.di.coreDiModule
import moe.lava.banksia.ui.di.AppModule import moe.lava.banksia.ui.di.AppModule
import moe.lava.banksia.ui.screens.map.MapScreen import moe.lava.banksia.ui.screens.map.MapScreen
import org.koin.compose.KoinMultiplatformApplication import org.koin.compose.KoinMultiplatformApplication
@ -14,7 +14,7 @@ import org.koin.dsl.koinConfiguration
@Composable @Composable
fun App() { fun App() {
KoinMultiplatformApplication(config = koinConfiguration { KoinMultiplatformApplication(config = koinConfiguration {
modules(CommonModules, AppModule) modules(coreDiModule, AppModule)
}) { }) {
MapScreen() MapScreen()
} }

View file

@ -1,12 +1,13 @@
package moe.lava.banksia.ui.di package moe.lava.banksia.ui.di
import moe.lava.banksia.client.di.ClientModule import moe.lava.banksia.core.data.dataDiModule
import moe.lava.banksia.ui.screens.map.MapScreenViewModel import moe.lava.banksia.ui.screens.map.MapScreenViewModel
import org.koin.core.module.dsl.viewModelOf import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module import org.koin.dsl.module
val AppModule = module { val AppModule = module {
includes(ClientModule) includes(dataDiModule)
// ViewModel // ViewModel
viewModelOf(::MapScreenViewModel) viewModelOf(::MapScreenViewModel)
} }

View file

@ -15,9 +15,9 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
import kotlinx.datetime.toInstant import kotlinx.datetime.toInstant
import moe.lava.banksia.client.repository.RouteRepository import moe.lava.banksia.core.data.repositories.RouteRepository
import moe.lava.banksia.client.repository.StopRepository import moe.lava.banksia.core.data.repositories.StopRepository
import moe.lava.banksia.client.repository.StopTimeRepository import moe.lava.banksia.core.data.repositories.StopTimeRepository
import moe.lava.banksia.data.ptv.PtvService import moe.lava.banksia.data.ptv.PtvService
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.model.RouteType import moe.lava.banksia.model.RouteType