diff --git a/core/data-api/build.gradle.kts b/core/data-api/build.gradle.kts index 15d34fa..810dec7 100644 --- a/core/data-api/build.gradle.kts +++ b/core/data-api/build.gradle.kts @@ -4,4 +4,5 @@ plugins { dependencies { implementation(project(":core:model")) + implementation(libs.kotlinx.coroutines.core) } diff --git a/core/data-api/src/main/java/com/yapp/dataapi/ConfigRepository.kt b/core/data-api/src/main/java/com/yapp/dataapi/ConfigRepository.kt new file mode 100644 index 0000000..2ee0555 --- /dev/null +++ b/core/data-api/src/main/java/com/yapp/dataapi/ConfigRepository.kt @@ -0,0 +1,7 @@ +package com.yapp.dataapi + +import kotlinx.coroutines.flow.Flow + +interface ConfigRepository { + fun getPositionConfigs(): Flow> +} \ No newline at end of file diff --git a/core/data/src/main/java/com/yapp/core/data/data/SusuDispatcher.kt b/core/data/src/main/java/com/yapp/core/data/data/YappDispatcher.kt similarity index 100% rename from core/data/src/main/java/com/yapp/core/data/data/SusuDispatcher.kt rename to core/data/src/main/java/com/yapp/core/data/data/YappDispatcher.kt diff --git a/core/data/src/main/java/com/yapp/core/data/data/di/RepositoryModule.kt b/core/data/src/main/java/com/yapp/core/data/data/di/RepositoryModule.kt index 703c3fc..73d9bfc 100644 --- a/core/data/src/main/java/com/yapp/core/data/data/di/RepositoryModule.kt +++ b/core/data/src/main/java/com/yapp/core/data/data/di/RepositoryModule.kt @@ -1,8 +1,10 @@ package com.yapp.core.data.data.di import com.yapp.core.data.data.repository.AuthorizedUserRepositoryImpl +import com.yapp.core.data.data.repository.ConfigRepositoryImpl import com.yapp.core.data.data.repository.UnAuthorizedUserRepositoryImpl import com.yapp.dataapi.AuthorizedUserRepository +import com.yapp.dataapi.ConfigRepository import com.yapp.dataapi.UnAuthorizedUserRepository import dagger.Binds import dagger.Module @@ -22,4 +24,9 @@ internal abstract class RepositoryModule { abstract fun bindAuthorizedUserRepositoryImpl( repositoryImpl: AuthorizedUserRepositoryImpl, ): AuthorizedUserRepository + + @Binds + abstract fun bindConfigRepositoryImpl( + repositoryImpl: ConfigRepositoryImpl, + ): ConfigRepository } diff --git a/core/data/src/main/java/com/yapp/core/data/data/repository/ConfigRepositoryImpl.kt b/core/data/src/main/java/com/yapp/core/data/data/repository/ConfigRepositoryImpl.kt new file mode 100644 index 0000000..1aaa2a3 --- /dev/null +++ b/core/data/src/main/java/com/yapp/core/data/data/repository/ConfigRepositoryImpl.kt @@ -0,0 +1,36 @@ +package com.yapp.core.data.data.repository + +import com.yapp.core.data.data.Dispatcher +import com.yapp.core.data.data.YappDispatchers +import com.yapp.core.data.local.PositionConfigDao +import com.yapp.core.data.local.SecurityPreferences +import com.yapp.core.data.remote.api.ConfigApi +import com.yapp.core.data.remote.api.UnAuthorizedUserApi +import com.yapp.core.data.remote.model.request.toData +import com.yapp.core.data.remote.model.response.toModel +import com.yapp.dataapi.ConfigRepository +import com.yapp.dataapi.UnAuthorizedUserRepository +import com.yapp.model.SignUpInfo +import com.yapp.model.SignUpResult +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject +import kotlin.jvm.optionals.getOrNull + +internal class ConfigRepositoryImpl @Inject constructor( + private val configApi: ConfigApi, + private val positionConfigDao: PositionConfigDao, + @Dispatcher(YappDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, +) : ConfigRepository { + + override fun getPositionConfigs(): Flow> = flow { + emit(positionConfigDao.getPositionConfigs().map { it.label }) + + val remotePositionConfigs = configApi.getPositionConfigs() + positionConfigDao.upsertPositionConfigs(remotePositionConfigs.map { it.toEntity() }) + + emit(positionConfigDao.getPositionConfigs().map { it.label }) + }.flowOn(ioDispatcher) +} \ No newline at end of file diff --git a/core/data/src/main/java/com/yapp/core/data/local/EntityTable.kt b/core/data/src/main/java/com/yapp/core/data/local/EntityTable.kt index 88b3620..3e13dff 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/EntityTable.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/EntityTable.kt @@ -1,5 +1,5 @@ package com.yapp.core.data.local -object EntityTable { +internal object EntityTable { const val POSITION_CONFIG = "positions_configs" } diff --git a/core/data/src/main/java/com/yapp/core/data/local/PositionConfigDao.kt b/core/data/src/main/java/com/yapp/core/data/local/PositionConfigDao.kt index 828c28b..ec9247a 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/PositionConfigDao.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/PositionConfigDao.kt @@ -6,7 +6,7 @@ import androidx.room.Query import androidx.room.Upsert @Dao -interface PositionConfigDao { +internal interface PositionConfigDao { @Query("SELECT * FROM ${EntityTable.POSITION_CONFIG}") fun getPositionConfigs(): List diff --git a/core/data/src/main/java/com/yapp/core/data/local/PositionConfigEntity.kt b/core/data/src/main/java/com/yapp/core/data/local/PositionConfigEntity.kt index 4a12631..e29c438 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/PositionConfigEntity.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/PositionConfigEntity.kt @@ -4,7 +4,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = EntityTable.POSITION_CONFIG) -data class PositionConfigEntity( +internal data class PositionConfigEntity( @PrimaryKey val name: String, val label: String, diff --git a/core/data/src/main/java/com/yapp/core/data/local/RoomDataBase.kt b/core/data/src/main/java/com/yapp/core/data/local/RoomDataBase.kt index 886d728..8b01a7a 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/RoomDataBase.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/RoomDataBase.kt @@ -9,6 +9,6 @@ import androidx.room.RoomDatabase ], version = 1, ) -abstract class RoomDataBase : RoomDatabase() { +internal abstract class RoomDataBase : RoomDatabase() { abstract fun positionConfigDao(): PositionConfigDao } diff --git a/core/data/src/main/java/com/yapp/core/data/local/di/DaoModule.kt b/core/data/src/main/java/com/yapp/core/data/local/di/DaoModule.kt index e2d8d8e..be4e6ae 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/di/DaoModule.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/di/DaoModule.kt @@ -9,7 +9,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object DaoModule { +internal object DaoModule { @Singleton @Provides diff --git a/core/data/src/main/java/com/yapp/core/data/local/di/RoomModule.kt b/core/data/src/main/java/com/yapp/core/data/local/di/RoomModule.kt index 790e8a4..3bdf010 100644 --- a/core/data/src/main/java/com/yapp/core/data/local/di/RoomModule.kt +++ b/core/data/src/main/java/com/yapp/core/data/local/di/RoomModule.kt @@ -12,7 +12,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object RoomModule { +internal object RoomModule { private const val DB_NAME = "database-yapp" diff --git a/core/data/src/main/java/com/yapp/core/data/remote/api/ConfigApi.kt b/core/data/src/main/java/com/yapp/core/data/remote/api/ConfigApi.kt new file mode 100644 index 0000000..5c76c9a --- /dev/null +++ b/core/data/src/main/java/com/yapp/core/data/remote/api/ConfigApi.kt @@ -0,0 +1,9 @@ +package com.yapp.core.data.remote.api + +import com.yapp.core.data.remote.model.response.PositionConfigResponse +import retrofit2.http.GET + +internal interface ConfigApi { + @GET("v1/positions") + suspend fun getPositionConfigs(): List +} \ No newline at end of file diff --git a/core/data/src/main/java/com/yapp/core/data/remote/api/UnAuthorizedUserApi.kt b/core/data/src/main/java/com/yapp/core/data/remote/api/UnAuthorizedUserApi.kt index e1d421b..6cfd74c 100644 --- a/core/data/src/main/java/com/yapp/core/data/remote/api/UnAuthorizedUserApi.kt +++ b/core/data/src/main/java/com/yapp/core/data/remote/api/UnAuthorizedUserApi.kt @@ -6,7 +6,7 @@ import retrofit2.http.Body import retrofit2.http.POST import java.util.Optional -interface UnAuthorizedUserApi { +internal interface UnAuthorizedUserApi { @POST("v1/auth/sign-up") suspend fun signUp( @Body request: SignUpRequest, diff --git a/core/data/src/main/java/com/yapp/core/data/remote/di/ApiServiceModule.kt b/core/data/src/main/java/com/yapp/core/data/remote/di/ApiServiceModule.kt index 90e738b..6c75fc2 100644 --- a/core/data/src/main/java/com/yapp/core/data/remote/di/ApiServiceModule.kt +++ b/core/data/src/main/java/com/yapp/core/data/remote/di/ApiServiceModule.kt @@ -10,7 +10,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object ApiServiceModule { +internal object ApiServiceModule { @Singleton @Provides diff --git a/core/data/src/main/java/com/yapp/core/data/remote/model/response/PositionConfigEntity.kt b/core/data/src/main/java/com/yapp/core/data/remote/model/response/PositionConfigEntity.kt new file mode 100644 index 0000000..dc4d862 --- /dev/null +++ b/core/data/src/main/java/com/yapp/core/data/remote/model/response/PositionConfigEntity.kt @@ -0,0 +1,13 @@ +package com.yapp.core.data.remote.model.response + +import com.yapp.core.data.local.PositionConfigEntity + +internal data class PositionConfigResponse( + val name: String, + val label: String, +) { + fun toEntity() = PositionConfigEntity( + name = name, + label = label, + ) +} \ No newline at end of file diff --git a/core/data/src/main/java/com/yapp/core/data/remote/model/response/SignUpResponse.kt b/core/data/src/main/java/com/yapp/core/data/remote/model/response/SignUpResponse.kt index 1e16f4d..11d7418 100644 --- a/core/data/src/main/java/com/yapp/core/data/remote/model/response/SignUpResponse.kt +++ b/core/data/src/main/java/com/yapp/core/data/remote/model/response/SignUpResponse.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable import java.util.Optional @Serializable -data class SignUpResponse( +internal data class SignUpResponse( val accessToken: String, val refreshToken: String, ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ed05f4e..5fc2c1a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,6 +3,7 @@ agp = "8.7.3" kotlin = "2.0.0" jetbrainsKotlinJvm = "2.0.0" kotlinxSerializationJson = "1.8.0" +kotlinxCoroutines = "1.8.1" coreKtx = "1.13.1" appcompat = "1.7.0" @@ -40,6 +41,8 @@ android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", ver kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } compose-compiler-gradle-plugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } +kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }