Skip to content

Commit

Permalink
feat/#60: Room DB 및 ConfigRepository 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
jinukeu committed Feb 2, 2025
1 parent f0da29b commit ec3f9f8
Show file tree
Hide file tree
Showing 17 changed files with 85 additions and 9 deletions.
1 change: 1 addition & 0 deletions core/data-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ plugins {

dependencies {
implementation(project(":core:model"))
implementation(libs.kotlinx.coroutines.core)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.yapp.dataapi

import kotlinx.coroutines.flow.Flow

interface ConfigRepository {
fun getPositionConfigs(): Flow<List<String>>
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -22,4 +24,9 @@ internal abstract class RepositoryModule {
abstract fun bindAuthorizedUserRepositoryImpl(
repositoryImpl: AuthorizedUserRepositoryImpl,
): AuthorizedUserRepository

@Binds
abstract fun bindConfigRepositoryImpl(
repositoryImpl: ConfigRepositoryImpl,
): ConfigRepository
}
Original file line number Diff line number Diff line change
@@ -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<List<String>> = 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)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.yapp.core.data.local

object EntityTable {
internal object EntityTable {
const val POSITION_CONFIG = "positions_configs"
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<PositionConfigEntity>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ import androidx.room.RoomDatabase
],
version = 1,
)
abstract class RoomDataBase : RoomDatabase() {
internal abstract class RoomDataBase : RoomDatabase() {
abstract fun positionConfigDao(): PositionConfigDao
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object DaoModule {
internal object DaoModule {

@Singleton
@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object RoomModule {
internal object RoomModule {

private const val DB_NAME = "database-yapp"

Expand Down
Original file line number Diff line number Diff line change
@@ -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<PositionConfigResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object ApiServiceModule {
internal object ApiServiceModule {

@Singleton
@Provides
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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" }
Expand Down

0 comments on commit ec3f9f8

Please sign in to comment.