diff --git a/buildSrc/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/buildSrc/src/main/kotlin/Dependencies.kt index f0cf0dfe21f2481ab7d2d145c3c913939e333c98..2de469cb253705c67bbd328d3d3f64d189900d8c 100644 --- a/buildSrc/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/buildSrc/src/main/kotlin/Dependencies.kt @@ -26,6 +26,7 @@ object Dependencies { const val shadow = "7.1.2" const val moko = "0.23.0" const val calendar = "1.0.4" + const val sqlDelight = "2.0.0-rc02" } object Ktor { @@ -135,4 +136,9 @@ object Dependencies { const val composePager = "io.github.epicarchitect:calendar-compose-pager:${Versions.calendar}" const val composeDatePicker = "io.github.epicarchitect:calendar-compose-datepicker:${Versions.calendar}" } + + object SqlDelight { + const val nativeDriver = "app.cash.sqldelight:native-driver:${Versions.sqlDelight}" + const val androidDriver = "app.cash.sqldelight:android-driver:${Versions.sqlDelight}" + } } \ No newline at end of file diff --git a/buildSrc/buildSrc/src/main/kotlin/Plugins.kt b/buildSrc/buildSrc/src/main/kotlin/Plugins.kt index d60d39a89bbf1f575805577300b8db19dc7636a1..16d8d613ba7d149fd08e97ede88f5314540cd975 100644 --- a/buildSrc/buildSrc/src/main/kotlin/Plugins.kt +++ b/buildSrc/buildSrc/src/main/kotlin/Plugins.kt @@ -56,8 +56,13 @@ object Plugins { const val plugin = "org.jetbrains.kotlin.plugin.parcelize" } - object Moko{ + object Moko { const val implementation = "dev.icerock.moko:resources-generator:0.23.0" const val plugin = "dev.icerock.mobile.multiplatform-resources" } + + object SQLDelight { + const val version = "2.0.0-rc02" + const val plugin = "app.cash.sqldelight" + } } \ No newline at end of file diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 2247c76de0d70e0f4a81050c4072d391e4de5e82..b0d33a15379b05627173124804117691b6075348 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id(Plugins.MultiplatformCompose.plugin) id(Plugins.CocoaPods.plugin) id(Plugins.Android.plugin) + id(Plugins.SQLDelight.plugin) version Plugins.SQLDelight.version id(Plugins.BuildConfig.plugin) id(Plugins.Serialization.plugin) id(Plugins.Parcelize.plugin) @@ -94,7 +95,7 @@ kotlin { api(Dependencies.Ktor.Client.Android) implementation(Dependencies.Google.SignIn) implementation(Dependencies.AndroidX.activityKtx) - + implementation(Dependencies.SqlDelight.androidDriver) // Koin api(Dependencies.Koin.android) @@ -113,6 +114,7 @@ kotlin { dependencies { implementation(Dependencies.Ktor.Client.Darwin) implementation(files("iosApp/GoogleAuthorization/GoogleAuthorization/Sources")) + implementation(Dependencies.SqlDelight.nativeDriver) } } @@ -202,3 +204,11 @@ buildConfig { "\"726357293621-hegk0410bsb1a5hvl3ihpc4d2bfkmlgb.apps.googleusercontent.com\"" ) } + +sqldelight { + databases { + create("Database") { + packageName.set("band.effective.office.elevator") + } + } +} \ No newline at end of file diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/App.android.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/App.android.kt index 7d315a6b2bafc90425e85787ce92387e7b35de5d..e1b86db4cdc9f1dda28b56c0f8ce2781878a3f82 100644 --- a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/App.android.kt +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/App.android.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.core.os.BuildCompat.PrereleaseSdkCheck import band.effective.office.elevator.components.Calendar +import band.effective.office.elevator.data.database.di.databaseModule import band.effective.office.elevator.di.androidModuleDI import band.effective.office.elevator.di.appModuleDI import band.effective.office.elevator.domain.AppActivityLifecycleObserver @@ -34,7 +35,7 @@ class AndroidApp : Application() { Napier.base(DebugAntilog()) startKoin { androidContext(this@AndroidApp) - modules(appModuleDI, androidModuleDI) + modules(databaseModule, appModuleDI, androidModuleDI) } } } diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..2a1a0a67ddad329fa5b0702c0dc9e1ab84396fe6 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt @@ -0,0 +1,12 @@ +package band.effective.office.elevator.data.database + +import android.content.Context +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.android.AndroidSqliteDriver +import band.effective.office.elevator.Database + +actual class DriverFactory(private val context: Context) { + actual fun createDriver(): SqlDriver { + return AndroidSqliteDriver(Database.Schema, context, "test.db") + } +} \ No newline at end of file diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/di/DatabaseModule.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/di/DatabaseModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..0a7f2d9bc40d4f70cb54c340bcb5078e4bff51ae --- /dev/null +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/data/database/di/DatabaseModule.kt @@ -0,0 +1,8 @@ +package band.effective.office.elevator.data.database.di + +import band.effective.office.elevator.data.database.DriverFactory +import org.koin.dsl.module + +val databaseModule = module { + single { DriverFactory(get()).createDriver() } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt new file mode 100644 index 0000000000000000000000000000000000000000..2af8dce66b03faf9061bea17f14830eb9b0f5cf0 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt @@ -0,0 +1,8 @@ +package band.effective.office.elevator.data.database + +import band.effective.office.elevator.ui.content.ContentComponent + +// TODO(edit this interface) +interface DBSource { + fun getProfileName(): String +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSourceImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSourceImpl.kt new file mode 100644 index 0000000000000000000000000000000000000000..7c530b09408d3b4194319f105e2b44f4c514dc3e --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSourceImpl.kt @@ -0,0 +1,14 @@ +package band.effective.office.elevator.data.database + +import band.effective.office.elevator.Database + +class DBSourceImpl( + val database: Database +): DBSource { + + private val profileQueries = database.profileQueries + + override fun getProfileName(): String { + return profileQueries.selectAll().executeAsOne().full_name + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..42b1d1e81e27a40feb6b19128d9955b62e29c031 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt @@ -0,0 +1,7 @@ +package band.effective.office.elevator.data.database + +import app.cash.sqldelight.db.SqlDriver + +expect class DriverFactory { + fun createDriver(): SqlDriver +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt index 7d35a88d83fc1a00002faee2f214f38faf320169..e688f8b50830b24252ec26000ed5e8cc3537298c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt @@ -1,8 +1,15 @@ package band.effective.office.elevator.data.di +import band.effective.office.elevator.Database import band.effective.office.elevator.data.NetworkClient +import band.effective.office.elevator.data.database.DBSource +import band.effective.office.elevator.data.database.DBSourceImpl import org.koin.dsl.module internal val dataModuleDI = module { single { NetworkClient(enableLogging = true) } + + factory { Database(get()) } // SQL Driver injected by native platforms(see: androidMain or iosMain) + + single{DBSourceImpl(get())} } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/RootComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/RootComponent.kt index 0bbaaa678e7dac3fccbbfa8eaba67b54532ad6ee..45644a49c156263e301edff8608c0a928e1fd65e 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/RootComponent.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/RootComponent.kt @@ -1,5 +1,6 @@ package band.effective.office.elevator.ui.root +import band.effective.office.elevator.data.database.DBSource import band.effective.office.elevator.ui.authorization.AuthorizationComponent import band.effective.office.elevator.ui.content.ContentComponent import band.effective.office.elevator.ui.root.store.RootStore @@ -18,6 +19,7 @@ import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory import io.github.aakira.napier.DebugAntilog import io.github.aakira.napier.Napier import kotlinx.coroutines.flow.Flow +import org.koin.core.component.inject class RootComponent internal constructor( componentContext: ComponentContext, diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt index 921cffd60b4e42c23772d17d8a3472ed469a8679..760483c4aa4106d526cc2c5242b8a54a828fd0d6 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt @@ -1,6 +1,6 @@ package band.effective.office.elevator.ui.root.store -import band.effective.office.elevator.data.ApiResponse +import band.effective.office.elevator.data.database.DBSource import band.effective.office.elevator.domain.GoogleSignIn import band.effective.office.elevator.ui.root.store.RootStore.Label import band.effective.office.elevator.ui.root.store.RootStore.State @@ -9,6 +9,8 @@ import com.arkivanov.mvikotlin.core.store.StoreFactory import com.arkivanov.mvikotlin.core.utils.ExperimentalMviKotlinApi import com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor import com.arkivanov.mvikotlin.extensions.coroutines.coroutineBootstrapper +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index b52173119e565134f220e8405b51c8bc54439300..c865df817d50b8b707f1311344dc6859f272d129 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -9,6 +9,7 @@ Продолжить + Effective Введите номер Укажите номер, по которому коллеги смогли бы перевести вам деньги по СБП diff --git a/composeApp/src/commonMain/resources/MR/en/strings_en.xml b/composeApp/src/commonMain/resources/MR/en/strings_en.xml index a70e56b4bee47e695535c12dc7cf7a35ae3dcc0d..4ce63388c66658e4580d5a59db17567c04dfe211 100644 --- a/composeApp/src/commonMain/resources/MR/en/strings_en.xml +++ b/composeApp/src/commonMain/resources/MR/en/strings_en.xml @@ -12,6 +12,8 @@ Will be today No reservations + Effective + Continue Enter number diff --git a/composeApp/src/commonMain/sqldelight/band/effective/office/elevator/scheme/Profile.sq b/composeApp/src/commonMain/sqldelight/band/effective/office/elevator/scheme/Profile.sq new file mode 100644 index 0000000000000000000000000000000000000000..bb1c4f4bcf62f7f57db06c592d6723332ab8b0bd --- /dev/null +++ b/composeApp/src/commonMain/sqldelight/band/effective/office/elevator/scheme/Profile.sq @@ -0,0 +1,21 @@ +CREATE TABLE hockeyPlayer ( + player_number INTEGER NOT NULL, + full_name TEXT NOT NULL +); + +CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name); + +INSERT INTO hockeyPlayer (player_number, full_name) +VALUES (15, 'Ryan Getzlaf'); + +selectAll: +SELECT * +FROM hockeyPlayer; + +insert: +INSERT INTO hockeyPlayer(player_number, full_name) +VALUES (?, ?); + +insertFullPlayerObject: +INSERT INTO hockeyPlayer(player_number, full_name) +VALUES ?; \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..8566be2e3db317ca6ff82a5bb058a1d206503803 --- /dev/null +++ b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/DriverFactory.kt @@ -0,0 +1,11 @@ +package band.effective.office.elevator.data.database + +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.native.NativeSqliteDriver +import band.effective.office.elevator.Database + +actual class DriverFactory { + actual fun createDriver(): SqlDriver { + return NativeSqliteDriver(Database.Schema, "test.db") + } +} \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/di/DataBaseModule.kt b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/di/DataBaseModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..fea0458ea72aebc897229eedea544a89544bf4c2 --- /dev/null +++ b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/data/database/di/DataBaseModule.kt @@ -0,0 +1,8 @@ +package band.effective.office.elevator.data.database.di + +import band.effective.office.elevator.data.database.DriverFactory +import org.koin.dsl.module + +val databaseModule = module { + single { DriverFactory().createDriver() } +} \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/main.kt b/composeApp/src/iosMain/kotlin/main.kt index f4dc6537c9c4a0c8b8e91cf8c63ccd70082c6e19..b64c2fefcc4e2148ef5857fcb930618cbec7666a 100644 --- a/composeApp/src/iosMain/kotlin/main.kt +++ b/composeApp/src/iosMain/kotlin/main.kt @@ -9,6 +9,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.compose.ui.window.ComposeUIViewController import band.effective.office.elevator.AppTheme +import band.effective.office.elevator.data.database.di.databaseModule import band.effective.office.elevator.di.appModuleDI import band.effective.office.elevator.di.iosModuleDI import band.effective.office.elevator.ui.helper.LocalSafeArea @@ -27,7 +28,7 @@ fun MainViewController( bottomSafeArea: Float ): UIViewController { startKoin { - modules(appModuleDI + iosModuleDI) + modules(appModuleDI + iosModuleDI + databaseModule) } val rootComponent =