Compare commits

...

2 commits

117 changed files with 355 additions and 312 deletions

2
.gitignore vendored
View file

@ -18,6 +18,6 @@ captures
**/xcshareddata/WorkspaceSettings.xcsettings
secrets.properties
shared/src/commonMain/kotlin/moe/lava/banksia/Constants.kt
/core/src/commonMain/kotlin/moe/lava/banksia/core/Constants.kt
/data/
/data

View file

@ -1,11 +0,0 @@
package moe.lava.banksia.client.data.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) {
suspend fun get(id: String) = dao.get(id)
suspend fun getAll() = dao.getAll()
suspend fun save(vararg routes: Route) = dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray())
}

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

@ -1,16 +0,0 @@
package moe.lava.banksia.client.repository
import moe.lava.banksia.client.data.stoptime.StopTimeLocalDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeRemoteDataSource
import moe.lava.banksia.model.StopTimeDated
class StopTimeRepository(
private val local: StopTimeLocalDataSource,
private val remote: StopTimeRemoteDataSource,
) {
suspend fun getForStop(id: String): List<StopTimeDated> {
return local
.getAtStop(id)
.ifEmpty { remote.getAtStop(id) }
}
}

View file

@ -14,7 +14,7 @@ room {
kotlin {
android {
namespace = "moe.lava.banksia.shared"
namespace = "moe.lava.banksia.core"
compileSdk = libs.versions.android.compileSdk.get().toInt()
compilerOptions {

View file

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

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.plugins.HttpSend
@ -7,22 +7,25 @@ import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.plugin
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import moe.lava.banksia.Constants
import moe.lava.banksia.client.data.route.RouteLocalDataSource
import moe.lava.banksia.client.data.route.RouteRemoteDataSource
import moe.lava.banksia.client.data.stop.StopLocalDataSource
import moe.lava.banksia.client.data.stop.StopRemoteDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeLocalDataSource
import moe.lava.banksia.client.data.stoptime.StopTimeRemoteDataSource
import moe.lava.banksia.client.repository.RouteRepository
import moe.lava.banksia.client.repository.StopRepository
import moe.lava.banksia.client.repository.StopTimeRepository
import moe.lava.banksia.core.Constants
import moe.lava.banksia.core.data.repositories.RouteRepository
import moe.lava.banksia.core.data.repositories.StopRepository
import moe.lava.banksia.core.data.repositories.StopTimeRepository
import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource
import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource
import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource
import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource
import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource
import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource
import moe.lava.banksia.core.room.roomDiModule
import moe.lava.banksia.core.util.log
import moe.lava.banksia.data.ptv.PtvService
import moe.lava.banksia.util.log
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module
val ClientModule = module {
val dataDiModule = module {
includes(roomDiModule)
// HTTP Clients
singleOf(::PtvService)
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.withLock
import moe.lava.banksia.client.data.route.RouteLocalDataSource
import moe.lava.banksia.client.data.route.RouteRemoteDataSource
import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource
import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource
class RouteRepository(
class RouteRepository internal constructor(
private val local: RouteLocalDataSource,
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.withLock
import moe.lava.banksia.client.data.stop.StopLocalDataSource
import moe.lava.banksia.client.data.stop.StopRemoteDataSource
import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource
import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource
class StopRepository(
class StopRepository internal constructor(
private val local: StopLocalDataSource,
private val remote: StopRemoteDataSource,
) {

View file

@ -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
class StopTimeRepository internal constructor(
private val local: StopTimeLocalDataSource,
private val remote: StopTimeRemoteDataSource,
) {
suspend fun getForStop(id: String): List<StopTimeDated> {
return local
.getAtStop(id)
.ifEmpty { remote.getAtStop(id) }
}
}

View file

@ -0,0 +1,11 @@
package moe.lava.banksia.core.data.sources.route
import moe.lava.banksia.core.model.Route
import moe.lava.banksia.core.room.dao.RouteDao
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 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.call.body
import io.ktor.client.request.get
import moe.lava.banksia.model.Route
import moe.lava.banksia.core.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 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.model.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
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.call.body
import io.ktor.client.request.get
import moe.lava.banksia.model.Stop
import moe.lava.banksia.core.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 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.TimeZone
import kotlinx.datetime.todayIn
import moe.lava.banksia.model.StopTimeDated
import moe.lava.banksia.model.atDate
import moe.lava.banksia.room.dao.StopTimeDao
import moe.lava.banksia.util.serialise
import moe.lava.banksia.core.model.StopTimeDated
import moe.lava.banksia.core.model.atDate
import moe.lava.banksia.core.room.dao.StopTimeDao
import moe.lava.banksia.core.util.serialise
import kotlin.time.Clock
class StopTimeLocalDataSource(
internal class StopTimeLocalDataSource(
private val stopTimeDao: StopTimeDao,
) {
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.call.body
@ -7,10 +7,10 @@ import io.ktor.client.request.parameter
import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone
import kotlinx.datetime.todayIn
import moe.lava.banksia.model.StopTimeDated
import moe.lava.banksia.core.model.StopTimeDated
import kotlin.time.Clock
class StopTimeRemoteDataSource(
internal class StopTimeRemoteDataSource(
private val client: HttpClient,
) {
suspend fun getAtStop(

View file

@ -1,13 +1,13 @@
package moe.lava.banksia.client.data.trip
package moe.lava.banksia.core.data.sources.trip
import io.ktor.client.HttpClient
import kotlinx.datetime.DayOfWeek
import kotlinx.datetime.TimeZone
import kotlinx.datetime.todayIn
import moe.lava.banksia.model.Trip
import moe.lava.banksia.core.model.Trip
import kotlin.time.Clock
class TripRemoteDataSource(
internal class TripRemoteDataSource(
private val client: HttpClient,
) {
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.core)
}
}
}
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 androidx.room.Room
import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope
import org.koin.dsl.module
class AndroidDatabaseBuilder(val ctx: Context) : PlatformDatabaseBuilder {
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())
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.RoomDatabase
@ -10,23 +10,23 @@ import androidx.sqlite.driver.bundled.BundledSQLiteDriver
import androidx.sqlite.execSQL
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import moe.lava.banksia.room.converter.RouteTypeConverter
import moe.lava.banksia.room.dao.RouteDao
import moe.lava.banksia.room.dao.ServiceDao
import moe.lava.banksia.room.dao.ServiceExceptionDao
import moe.lava.banksia.room.dao.ShapeDao
import moe.lava.banksia.room.dao.StopDao
import moe.lava.banksia.room.dao.StopTimeDao
import moe.lava.banksia.room.dao.TripDao
import moe.lava.banksia.room.dao.VersionMetadataDao
import moe.lava.banksia.room.entity.RouteEntity
import moe.lava.banksia.room.entity.ServiceEntity
import moe.lava.banksia.room.entity.ServiceExceptionEntity
import moe.lava.banksia.room.entity.ShapeEntity
import moe.lava.banksia.room.entity.StopEntity
import moe.lava.banksia.room.entity.StopTimeEntity
import moe.lava.banksia.room.entity.TripEntity
import moe.lava.banksia.room.entity.VersionMetadataEntity
import moe.lava.banksia.core.room.converter.RouteTypeConverter
import moe.lava.banksia.core.room.dao.RouteDao
import moe.lava.banksia.core.room.dao.ServiceDao
import moe.lava.banksia.core.room.dao.ServiceExceptionDao
import moe.lava.banksia.core.room.dao.ShapeDao
import moe.lava.banksia.core.room.dao.StopDao
import moe.lava.banksia.core.room.dao.StopTimeDao
import moe.lava.banksia.core.room.dao.TripDao
import moe.lava.banksia.core.room.dao.VersionMetadataDao
import moe.lava.banksia.core.room.entity.RouteEntity
import moe.lava.banksia.core.room.entity.ServiceEntity
import moe.lava.banksia.core.room.entity.ServiceExceptionEntity
import moe.lava.banksia.core.room.entity.ShapeEntity
import moe.lava.banksia.core.room.entity.StopEntity
import moe.lava.banksia.core.room.entity.StopTimeEntity
import moe.lava.banksia.core.room.entity.TripEntity
import moe.lava.banksia.core.room.entity.VersionMetadataEntity
import androidx.room.Database as 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
val CommonModules = module {
includes(PlatformModule)
val roomDiModule = module {
single { provideDatabaseBuilder(it) }
single { Database.build(get<PlatformDatabaseBuilder>().getBuilder()) }
single { get<Database>().versionMetadataDao }
single { get<Database>().routeDao }
single { get<Database>().serviceDao }
@ -16,3 +18,9 @@ val CommonModules = module {
single { get<Database>().stopTimeDao }
single { get<Database>().tripDao }
}
internal interface PlatformDatabaseBuilder {
fun getBuilder(): RoomDatabase.Builder<Database>
}
internal expect fun Scope.provideDatabaseBuilder(p: ParametersHolder): PlatformDatabaseBuilder

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.room.converter
package moe.lava.banksia.core.room.converter
import androidx.room.TypeConverter
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.core.model.RouteType
object RouteTypeConverter {
@TypeConverter

View file

@ -1,8 +1,8 @@
package moe.lava.banksia.room.converter
package moe.lava.banksia.core.room.converter
import androidx.room.TypeConverter
import moe.lava.banksia.model.ShapePath
import moe.lava.banksia.util.Point
import moe.lava.banksia.core.model.ShapePath
import moe.lava.banksia.core.util.Point
object ShapePathConverter {
@TypeConverter

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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.RouteEntity
import moe.lava.banksia.room.entity.StopEntity
import moe.lava.banksia.core.room.entity.RouteEntity
import moe.lava.banksia.core.room.entity.StopEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.ServiceEntity
import moe.lava.banksia.core.room.entity.ServiceEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.ServiceExceptionEntity
import moe.lava.banksia.core.room.entity.ServiceExceptionEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.ShapeEntity
import moe.lava.banksia.core.room.entity.ShapeEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.StopEntity
import moe.lava.banksia.core.room.entity.StopEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.StopTimeEntity
import moe.lava.banksia.core.room.entity.StopTimeEntity
@Dao
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.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.TripEntity
import moe.lava.banksia.core.room.entity.TripEntity
@Dao
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.Insert
import androidx.room.OnConflictStrategy.Companion.REPLACE
import androidx.room.Query
import moe.lava.banksia.room.entity.VersionMetadataEntity
import moe.lava.banksia.core.room.entity.VersionMetadataEntity
@Dao
interface VersionMetadataDao {

View file

@ -1,9 +1,9 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import moe.lava.banksia.model.Route
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.core.model.Route
import moe.lava.banksia.core.model.RouteType
@Entity("Route")
data class RouteEntity(

View file

@ -1,12 +1,12 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.datetime.LocalDate
import moe.lava.banksia.model.Service
import moe.lava.banksia.util.deserialiseDaysBitflag
import moe.lava.banksia.util.serialise
import moe.lava.banksia.core.model.Service
import moe.lava.banksia.core.util.deserialiseDaysBitflag
import moe.lava.banksia.core.util.serialise
@Entity("Service")
data class ServiceEntity(

View file

@ -1,9 +1,9 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo
import androidx.room.Entity
import kotlinx.datetime.LocalDate
import moe.lava.banksia.model.ServiceException
import moe.lava.banksia.core.model.ServiceException
@Entity(
"ServiceException",

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.PrimaryKey
import androidx.room.TypeConverters
import moe.lava.banksia.model.Shape
import moe.lava.banksia.model.ShapePath
import moe.lava.banksia.room.converter.ShapePathConverter
import moe.lava.banksia.core.model.Shape
import moe.lava.banksia.core.model.ShapePath
import moe.lava.banksia.core.room.converter.ShapePathConverter
@Entity("Shape")
@TypeConverters(ShapePathConverter::class)

View file

@ -1,12 +1,12 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.ForeignKey.Companion.SET_NULL
import androidx.room.PrimaryKey
import moe.lava.banksia.model.Stop
import moe.lava.banksia.util.Point
import moe.lava.banksia.core.model.Stop
import moe.lava.banksia.core.util.Point
@Entity(
"Stop",

View file

@ -1,13 +1,13 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.ForeignKey.Companion.CASCADE
import androidx.room.Index
import kotlinx.serialization.ExperimentalSerializationApi
import moe.lava.banksia.model.FutureTime
import moe.lava.banksia.model.FutureTime.Companion.asInt
import moe.lava.banksia.model.StopTime
import moe.lava.banksia.core.model.FutureTime
import moe.lava.banksia.core.model.FutureTime.Companion.asInt
import moe.lava.banksia.core.model.StopTime
@Entity(
"StopTime",

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.Entity
@ -6,7 +6,7 @@ import androidx.room.ForeignKey
import androidx.room.ForeignKey.Companion.CASCADE
import androidx.room.Index
import androidx.room.PrimaryKey
import moe.lava.banksia.model.Trip
import moe.lava.banksia.core.model.Trip
@Entity(
"Trip",

View file

@ -1,8 +1,8 @@
package moe.lava.banksia.room.entity
package moe.lava.banksia.core.room.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import moe.lava.banksia.model.VersionMetadata
import moe.lava.banksia.core.model.VersionMetadata
@Entity(
"VersionMetadata",

View file

@ -1,10 +1,8 @@
package moe.lava.banksia.di
package moe.lava.banksia.core.room
import androidx.room.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope
import org.koin.dsl.module
class IosDatabaseBuilder() : PlatformDatabaseBuilder {
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()
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.RoomDatabase
import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope
import org.koin.dsl.module
import java.io.File
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()
internal actual val ExtPlatformModule = module { }

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
import android.util.Log

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDate
@ -12,7 +12,7 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import moe.lava.banksia.model.FutureTime.Companion.asInt
import moe.lava.banksia.core.model.FutureTime.Companion.asInt
@Serializable(FutureTimeSerialiser::class)
data class FutureTime(

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable
@ -15,6 +15,6 @@ enum class RouteType(val value: Int) {
;
companion object {
fun from(value: Int) = RouteType.entries.first { it.value == value }
fun from(value: Int) = entries.first { it.value == value }
}
}

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
data class Run(
val ref: String,

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.datetime.DayOfWeek
import kotlinx.datetime.LocalDate

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable
import moe.lava.banksia.util.Point
import moe.lava.banksia.core.util.Point
typealias ShapePath = List<Point>

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable
import moe.lava.banksia.util.Point
import moe.lava.banksia.core.util.Point
@Serializable
data class Stop(

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.model
package moe.lava.banksia.core.model
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
/** Wraps an arbitrary value, such that equality checks are forced to be done by reference */
class BoxedValue<T>(val value: T) {

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
import kotlinx.datetime.DayOfWeek

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
fun error(tag: String, throwable: Throwable) = error(tag, "", throwable)
expect fun log(tag: String, msg: String)

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
import kotlinx.serialization.Serializable

View file

@ -16,7 +16,12 @@ import io.ktor.serialization.kotlinx.json.json
import kotlinx.coroutines.delay
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import moe.lava.banksia.Constants
import moe.lava.banksia.core.Constants
import moe.lava.banksia.core.model.RouteType
import moe.lava.banksia.core.util.LoopFlow.Companion.initWith
import moe.lava.banksia.core.util.error
import moe.lava.banksia.core.util.log
import moe.lava.banksia.core.util.loopFlow
import moe.lava.banksia.data.ptv.structures.PtvDeparture
import moe.lava.banksia.data.ptv.structures.PtvDirection
import moe.lava.banksia.data.ptv.structures.PtvRoute
@ -24,11 +29,6 @@ import moe.lava.banksia.data.ptv.structures.PtvRouteType
import moe.lava.banksia.data.ptv.structures.PtvRouteType.Companion.asPtvType
import moe.lava.banksia.data.ptv.structures.PtvRun
import moe.lava.banksia.data.ptv.structures.PtvStop
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.util.LoopFlow.Companion.initWith
import moe.lava.banksia.util.error
import moe.lava.banksia.util.log
import moe.lava.banksia.util.loopFlow
import okio.ByteString.Companion.encodeUtf8
import kotlin.random.Random

View file

@ -2,7 +2,7 @@ package moe.lava.banksia.data.ptv.structures
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.core.model.RouteType
@Serializable
data class PtvRoute(

View file

@ -7,7 +7,7 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.core.model.RouteType
object PtvRouteTypeSerialiser : KSerializer<PtvRouteType> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
actual fun log(tag: String, msg: String) {
TODO("Not yet implemented")

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.util
package moe.lava.banksia.core.util
actual fun log(tag: String, msg: String) {
println("[$tag] $msg")

View file

@ -19,7 +19,8 @@ kotlin {
}
dependencies {
implementation(projects.shared)
implementation(projects.core)
implementation(projects.core.room)
implementation(projects.server.gtfs)
implementation(projects.server.gtfsRt)

View file

@ -11,7 +11,7 @@ kotlin {
}
dependencies {
implementation(projects.shared)
implementation(projects.core)
implementation(libs.kotlinx.serialization.csv)
implementation(libs.kotlinx.datetime)
implementation(libs.ktor.client.contentnegotiation)

View file

@ -17,15 +17,16 @@ import kotlinx.datetime.LocalDate
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.modules.EmptySerializersModule
import kotlinx.serialization.serializer
import moe.lava.banksia.Constants
import moe.lava.banksia.model.Route
import moe.lava.banksia.model.RouteType
import moe.lava.banksia.model.Service
import moe.lava.banksia.model.ServiceException
import moe.lava.banksia.model.Shape
import moe.lava.banksia.model.Stop
import moe.lava.banksia.model.StopTime
import moe.lava.banksia.model.Trip
import moe.lava.banksia.core.Constants
import moe.lava.banksia.core.model.Route
import moe.lava.banksia.core.model.RouteType
import moe.lava.banksia.core.model.Service
import moe.lava.banksia.core.model.ServiceException
import moe.lava.banksia.core.model.Shape
import moe.lava.banksia.core.model.Stop
import moe.lava.banksia.core.model.StopTime
import moe.lava.banksia.core.model.Trip
import moe.lava.banksia.core.util.Point
import moe.lava.banksia.server.gtfs.structures.GtfsRoute
import moe.lava.banksia.server.gtfs.structures.GtfsService
import moe.lava.banksia.server.gtfs.structures.GtfsServiceException
@ -33,7 +34,6 @@ import moe.lava.banksia.server.gtfs.structures.GtfsShape
import moe.lava.banksia.server.gtfs.structures.GtfsStop
import moe.lava.banksia.server.gtfs.structures.GtfsStopTime
import moe.lava.banksia.server.gtfs.structures.GtfsTrip
import moe.lava.banksia.util.Point
import java.io.File
import java.util.zip.ZipFile
import kotlin.time.ExperimentalTime

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.server.gtfs.structures
import kotlinx.serialization.Serializable
import moe.lava.banksia.model.FutureTime
import moe.lava.banksia.core.model.FutureTime
@Suppress("PropertyName")
@Serializable

View file

@ -12,7 +12,7 @@ kotlin {
}
dependencies {
implementation(projects.shared)
implementation(projects.core)
implementation(libs.okio)
implementation(libs.koin.core)
implementation(libs.ktor.client.core)

View file

@ -11,7 +11,7 @@ import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import moe.lava.banksia.util.log
import moe.lava.banksia.core.util.log
import java.io.File
import kotlin.time.Instant

View file

@ -15,9 +15,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
import moe.lava.banksia.Constants
import moe.lava.banksia.util.LogScope
import moe.lava.banksia.util.log
import moe.lava.banksia.core.Constants
import moe.lava.banksia.core.util.LogScope
import moe.lava.banksia.core.util.log
private val types = arrayOf(
"metro/trip-updates",

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.server.gtfsrt
import com.google.transit.realtime.FeedMessage
import moe.lava.banksia.util.Point
import moe.lava.banksia.core.util.Point
class RealtimeVehiclePositions(data: FeedMessage) : GtfsRealtime(data) {
private val positions = mutableMapOf<String, Point>()

View file

@ -18,16 +18,15 @@ import kotlinx.coroutines.withContext
import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone
import kotlinx.datetime.todayIn
import moe.lava.banksia.Constants
import moe.lava.banksia.di.CommonModules
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.core.Constants
import moe.lava.banksia.core.model.atDate
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.core.util.serialise
import moe.lava.banksia.server.di.ServerModules
import moe.lava.banksia.server.gtfsrt.GtfsrtService
import moe.lava.banksia.util.serialise
import org.koin.dsl.module
import org.koin.ktor.ext.inject
import org.koin.ktor.plugin.Koin
@ -44,14 +43,12 @@ fun Application.module() {
}
install(Koin) {
modules(module { single { log } })
modules(CommonModules, ServerModules)
modules(ServerModules)
}
val gtfsr by inject<GtfsrtService>()
@Suppress("KotlinConstantConditions")
if (!Constants.devMode) {
val gtfsr by inject<GtfsrtService>()
launch { gtfsr.start(this, true) }
}
launch { gtfsr.start(this, !Constants.devMode) }
routing {
if (Constants.devMode) {

View file

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

View file

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

View file

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

View file

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

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.ui.backhandler)
implementation(projects.client)
implementation(projects.shared)
implementation(projects.core)
implementation(projects.core.data)
implementation(projects.ui.maps)
implementation(projects.ui.shared)
}

View file

@ -49,7 +49,7 @@ kotlin {
implementation(libs.compose.material3)
implementation(libs.compose.ui)
implementation(projects.shared)
implementation(projects.core)
implementation(projects.ui.shared)
}
}

View file

@ -10,7 +10,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import kotlinx.serialization.json.JsonObject
import moe.lava.banksia.Constants
import moe.lava.banksia.core.Constants
import moe.lava.banksia.ui.map.mappers.routeColorExpression
import moe.lava.banksia.ui.platform.BanksiaTheme
import org.maplibre.compose.camera.CameraPosition

View file

@ -4,11 +4,11 @@ import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import moe.lava.banksia.core.util.Point
import moe.lava.banksia.ui.map.mappers.asFeatures
import moe.lava.banksia.ui.map.mappers.toPosition
import moe.lava.banksia.ui.map.util.Marker
import moe.lava.banksia.ui.platform.BanksiaTheme
import moe.lava.banksia.util.Point
internal val MELBOURNE = Point(-37.8136, 144.9631)
internal val MELBOURNE_POS = MELBOURNE.toPosition()

Some files were not shown because too many files have changed in this diff Show more