Skip to content

Commit 8548bf8

Browse files
authored
feat: Migrate [core/database] to KMP (openMF#2354)
* [core.database] to KMP * dependencyGuardBaseline generated * provided type for mifosdatabase + refactored
1 parent 5eb043c commit 8548bf8

File tree

177 files changed

+2377
-924
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

177 files changed

+2377
-924
lines changed

build-logic/convention/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,5 +138,11 @@ gradlePlugin {
138138
id = "mifos.android.koin"
139139
implementationClass = "KoinAndroidConventionPlugin"
140140
}
141+
142+
//room android
143+
register("kmpRoom") {
144+
id = "mifos.kmp.room"
145+
implementationClass = "KMPRoomConventionPlugin"
146+
}
141147
}
142148
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import androidx.room.gradle.RoomExtension
2+
import com.google.devtools.ksp.gradle.KspExtension
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import org.gradle.kotlin.dsl.configure
6+
import org.gradle.kotlin.dsl.dependencies
7+
import org.mifos.libs
8+
9+
class KMPRoomConventionPlugin : Plugin<Project> {
10+
override fun apply(target: Project) {
11+
with(target) {
12+
pluginManager.apply("androidx.room")
13+
pluginManager.apply("com.google.devtools.ksp")
14+
15+
extensions.configure<KspExtension> {
16+
arg("room.generateKotlin", "true")
17+
}
18+
19+
extensions.configure<RoomExtension> {
20+
// The schemas directory contains a schema file for each version of the Room database.
21+
// This is required to enable Room auto migrations.
22+
// See https://developer.android.com/reference/kotlin/androidx/room/AutoMigration.
23+
schemaDirectory("$projectDir/schemas")
24+
}
25+
26+
dependencies {
27+
"implementation"(libs.findLibrary("androidx.room.runtime").get())
28+
"implementation"(libs.findLibrary("androidx.room.ktx").get())
29+
// Adding ksp dependencies for multiple platforms
30+
listOf(
31+
"kspDesktop",
32+
"kspAndroid",
33+
"kspIosArm64",
34+
"kspIosX64",
35+
"kspIosSimulatorArm64",
36+
// Add any other platform you may support
37+
).forEach { platform ->
38+
add(platform, libs.findLibrary("androidx.room.compiler").get())
39+
}
40+
}
41+
}
42+
}
43+
}

cmp-navigation/src/main/kotlin/com/mifos/cmp/navigation/KoinModules.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,21 @@ import com.mifos.feature.search.di.SearchModule
3737
import com.mifos.feature.settings.di.SettingsModule
3838
import com.mifos.feature.splash.di.SplashModule
3939
import com.mifos.room.di.DaoModule
40-
import com.mifos.room.di.DatabaseModule
4140
import com.mifos.room.di.HelperModule
41+
import com.mifos.room.di.PlatformSpecificDatabaseModule
4242
import org.koin.dsl.module
4343

4444
object KoinModules {
4545

4646
private val commonModules = module { includes(DispatchersModule) }
4747
private val domainModule = module { includes(UseCaseModule) }
4848
private val dataModules = module { includes(RepositoryModule) }
49-
private val coreDataStoreModules = module {
50-
includes(PreferencesModule)
51-
}
49+
private val coreDataStoreModules = module { includes(PreferencesModule) }
5250
private val databaseModules = module {
5351
includes(
5452
DaoModule,
55-
DatabaseModule,
5653
HelperModule,
54+
PlatformSpecificDatabaseModule,
5755
)
5856
}
5957

core/common/src/commonMain/kotlin/com/mifos/core/common/utils/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ package com.mifos.core.common.utils
1313
* Created by satya on 13/04/14.
1414
*/
1515
object Constants {
16+
const val DATABASE_NAME = "mifos_database"
17+
1618
const val INSTANCE_URL_KEY = "instanceURL"
1719
const val INSTANCE_DOMAIN_KEY = "instanceDomain"
1820
const val INSTANCE_PORT_KEY = "instancePort"

core/database/build.gradle.kts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
99
*/
1010
plugins {
11-
alias(libs.plugins.mifos.android.library)
12-
alias(libs.plugins.mifos.android.koin)
13-
alias(libs.plugins.mifos.android.room)
11+
alias(libs.plugins.mifos.kmp.library)
1412
alias(libs.plugins.kotlin.serialization)
13+
alias(libs.plugins.mifos.kmp.room)
1514
alias(libs.plugins.mifos.android.library.jacoco)
1615
alias(libs.plugins.kotlin.parcelize)
1716
}
@@ -24,19 +23,29 @@ android {
2423
}
2524
}
2625

27-
dependencies {
28-
api(projects.core.model)
29-
api(projects.core.common)
26+
kotlin{
27+
sourceSets {
28+
commonMain.dependencies {
29+
implementation(libs.kotlinx.coroutines.core)
30+
implementation(libs.kotlinx.serialization.json)
31+
api(projects.core.common)
32+
api(projects.core.model)
33+
}
3034

31-
implementation(libs.converter.gson)
32-
implementation(libs.kotlinx.serialization.json)
35+
androidMain.dependencies {
36+
implementation(libs.koin.android)
37+
implementation(libs.androidx.room.runtime)
38+
implementation(libs.androidx.sqlite.bundled)
39+
}
3340

34-
// fineract sdk dependencies
35-
implementation(libs.mifos.android.sdk.arch)
41+
nativeMain.dependencies {
42+
implementation(libs.androidx.room.runtime)
43+
implementation(libs.androidx.sqlite.bundled)
44+
}
3645

37-
// sdk client
38-
implementation(libs.fineract.client)
39-
40-
androidTestImplementation(projects.core.testing)
41-
implementation(libs.koin.android)
42-
}
46+
desktopMain.dependencies {
47+
implementation(libs.androidx.room.runtime)
48+
implementation(libs.androidx.sqlite.bundled)
49+
}
50+
}
51+
}
File renamed without changes.

core/database/src/main/java/com/mifos/room/db/MifosDatabase.kt renamed to core/database/src/androidMain/kotlin/com/mifos/room/MifosDatabase.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
99
*/
10-
package com.mifos.room.db
10+
package com.mifos.room
1111

1212
import androidx.room.Database
1313
import androidx.room.RoomDatabase
@@ -76,7 +76,7 @@ import com.mifos.room.entities.templates.clients.SavingProductOptionsEntity
7676
import com.mifos.room.entities.templates.clients.StaffOptionsEntity
7777
import com.mifos.room.entities.templates.loans.LoanRepaymentTemplateEntity
7878
import com.mifos.room.entities.templates.savings.SavingsAccountTransactionTemplateEntity
79-
import com.mifos.room.utils.typeconverters.CustomTypeConverters
79+
import com.mifos.room.typeconverters.CustomTypeConverters
8080

8181
@Database(
8282
entities = [
@@ -152,17 +152,17 @@ import com.mifos.room.utils.typeconverters.CustomTypeConverters
152152
@TypeConverters(
153153
CustomTypeConverters::class,
154154
)
155-
abstract class MifosDatabase : RoomDatabase() {
156-
abstract fun centerDao(): CenterDao
157-
abstract fun chargeDao(): ChargeDao
158-
abstract fun clientDao(): ClientDao
159-
abstract fun columnValueDao(): ColumnValueDao
160-
abstract fun groupsDao(): GroupsDao
161-
abstract fun loanDao(): LoanDao
162-
abstract fun officeDao(): OfficeDao
163-
abstract fun savingsDao(): SavingsDao
164-
abstract fun staffDao(): StaffDao
165-
abstract fun surveyDao(): SurveyDao
155+
actual abstract class MifosDatabase : RoomDatabase() {
156+
actual abstract val centerDao: CenterDao
157+
actual abstract val chargeDao: ChargeDao
158+
actual abstract val clientDao: ClientDao
159+
actual abstract val columnValueDao: ColumnValueDao
160+
actual abstract val groupsDao: GroupsDao
161+
actual abstract val loanDao: LoanDao
162+
actual abstract val officeDao: OfficeDao
163+
actual abstract val savingsDao: SavingsDao
164+
actual abstract val staffDao: StaffDao
165+
actual abstract val surveyDao: SurveyDao
166166

167167
companion object {
168168
const val VERSION = 1
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.room.di
11+
12+
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
13+
import com.mifos.core.common.network.MifosDispatchers
14+
import com.mifos.room.MifosDatabase
15+
import com.mifos.room.utils.MifosDatabaseFactory
16+
import org.koin.android.ext.koin.androidApplication
17+
import org.koin.core.module.Module
18+
import org.koin.core.qualifier.named
19+
import org.koin.dsl.module
20+
import kotlin.coroutines.CoroutineContext
21+
22+
actual val PlatformSpecificDatabaseModule: Module = module {
23+
single<MifosDatabase> {
24+
val ioContext: CoroutineContext = getKoin().get(named(MifosDispatchers.IO.name))
25+
26+
MifosDatabaseFactory(androidApplication())
27+
.createDatabase()
28+
.fallbackToDestructiveMigrationOnDowngrade(false)
29+
.setDriver(BundledSQLiteDriver())
30+
.setQueryCoroutineContext(ioContext)
31+
.build()
32+
}
33+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.room.utils
11+
12+
actual fun getCurrentTimeInMillis(): Long {
13+
return System.currentTimeMillis()
14+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.room.utils
11+
12+
import android.content.Context
13+
import androidx.room.Room
14+
import androidx.room.RoomDatabase
15+
import com.mifos.core.common.utils.Constants
16+
import com.mifos.room.MifosDatabase
17+
18+
class MifosDatabaseFactory(
19+
private val context: Context,
20+
) {
21+
fun createDatabase(): RoomDatabase.Builder<MifosDatabase> {
22+
val appContext = context.applicationContext
23+
val dbFile = appContext.getDatabasePath(Constants.DATABASE_NAME)
24+
25+
return Room.databaseBuilder<MifosDatabase>(
26+
context = appContext,
27+
name = dbFile.absolutePath,
28+
)
29+
}
30+
}

0 commit comments

Comments
 (0)