From 356ad13003f57484431c4cea53fb8e857c52eaab Mon Sep 17 00:00:00 2001 From: Eric Ampire Date: Sat, 4 Sep 2021 03:21:28 +0200 Subject: [PATCH] Setup data layer --- data/build.gradle.kts | 2 + .../datasource/animator/AnimatorDataSource.kt | 9 +++ .../animator/LocalAnimatorDataSource.kt | 18 +++++ .../animator/RemoteAnimatorDataSource.kt | 24 ++++++ .../data/datasource/blog/BlogDataSource.kt | 9 +++ .../datasource/blog/LocalBlogDataSource.kt | 17 ++++ .../datasource/blog/RemoteBlogDataSource.kt | 21 +++++ .../lottiefiles/LocalLottieFileDataSource.kt | 25 ++++++ .../lottiefiles/LottieFileDataSource.kt | 11 +++ .../lottiefiles/RemoteLottieFileDataSource.kt | 34 ++++++++ .../data/datasource/user/UserDataSource.kt | 5 -- .../data/di/DataSourceModule.kt | 79 +++++++++++++++++++ .../data/di/RepositoryModule.kt | 52 ++++++++++++ .../data/repository/AnimatorRepositoryImpl.kt | 34 ++++++++ .../data/repository/BlogRepositoryImpl.kt | 34 ++++++++ .../repository/LottieFileRepositoryImpl.kt | 56 +++++++++++++ .../data/repository/UserRepositoryImpl.kt | 11 --- .../androidstudycase/data/room/AnimatorDao.kt | 17 ++++ .../androidstudycase/data/room/BlogDao.kt | 16 ++++ .../data/room/LottieFilesDao.kt | 22 ++++++ 20 files changed, 480 insertions(+), 16 deletions(-) create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/AnimatorDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/LocalAnimatorDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/RemoteAnimatorDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/BlogDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/LocalBlogDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/RemoteBlogDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LocalLottieFileDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LottieFileDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/RemoteLottieFileDataSource.kt delete mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/user/UserDataSource.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/repository/BlogRepositoryImpl.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/repository/LottieFileRepositoryImpl.kt delete mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/repository/UserRepositoryImpl.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/room/AnimatorDao.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/room/BlogDao.kt create mode 100644 data/src/main/java/com/ericampire/android/androidstudycase/data/room/LottieFilesDao.kt diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 8e74804..423e189 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -36,6 +36,8 @@ dependencies { api(platform(Libs.kotlin_coroutine_bom)) api(Libs.kotlin_coroutine_core) + api(Libs.ktor_client_android) + testImplementation(Libs.junit_jupiter_api) testImplementation(Libs.junit_jupiter_engine) diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/AnimatorDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/AnimatorDataSource.kt new file mode 100644 index 0000000..33619a3 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/AnimatorDataSource.kt @@ -0,0 +1,9 @@ +package com.ericampire.android.androidstudycase.data.datasource.animator + +import com.ericampire.android.androidstudycase.domain.entity.Animator + + +interface AnimatorDataSource { + suspend fun findAll(): List + suspend fun save(animator: Animator) +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/LocalAnimatorDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/LocalAnimatorDataSource.kt new file mode 100644 index 0000000..3ab5bfe --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/LocalAnimatorDataSource.kt @@ -0,0 +1,18 @@ +package com.ericampire.android.androidstudycase.data.datasource.animator + +import com.ericampire.android.androidstudycase.data.room.AnimatorDao +import com.ericampire.android.androidstudycase.domain.entity.Animator +import javax.inject.Inject + +class LocalAnimatorDataSource @Inject constructor( + private val animatorDao: AnimatorDao +) : AnimatorDataSource { + + override suspend fun findAll(): List { + return animatorDao.findAll() + } + + override suspend fun save(animator: Animator) { + animatorDao.save(animator) + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/RemoteAnimatorDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/RemoteAnimatorDataSource.kt new file mode 100644 index 0000000..fd4a517 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/animator/RemoteAnimatorDataSource.kt @@ -0,0 +1,24 @@ +package com.ericampire.android.androidstudycase.data.datasource.animator + +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.domain.entity.AnimatorApiResponse +import com.ericampire.android.androidstudycase.util.ApiUrl +import com.ericampire.android.androidstudycase.util.Result +import io.ktor.client.* +import io.ktor.client.request.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class RemoteAnimatorDataSource @Inject constructor( + private val httpClient: HttpClient +) : AnimatorDataSource { + override suspend fun findAll(): List { + val data = httpClient.get(ApiUrl.Animator.featured) + return data.animatorAnimatorData.featuredAnimators.results + } + + override suspend fun save(animator: Animator) { + TODO("Save animator online, not supported by the API") + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/BlogDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/BlogDataSource.kt new file mode 100644 index 0000000..40fd110 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/BlogDataSource.kt @@ -0,0 +1,9 @@ +package com.ericampire.android.androidstudycase.data.datasource.blog + + +import com.ericampire.android.androidstudycase.domain.entity.Blog + +interface BlogDataSource { + suspend fun findAll(): List + suspend fun save(blog: Blog) +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/LocalBlogDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/LocalBlogDataSource.kt new file mode 100644 index 0000000..fced049 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/LocalBlogDataSource.kt @@ -0,0 +1,17 @@ +package com.ericampire.android.androidstudycase.data.datasource.blog + +import com.ericampire.android.androidstudycase.data.room.BlogDao +import com.ericampire.android.androidstudycase.domain.entity.Blog +import javax.inject.Inject + +class LocalBlogDataSource @Inject constructor( + private val dao: BlogDao +) : BlogDataSource { + override suspend fun findAll(): List { + return dao.findAll() + } + + override suspend fun save(blog: Blog) { + dao.save(blog) + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/RemoteBlogDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/RemoteBlogDataSource.kt new file mode 100644 index 0000000..71f209d --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/blog/RemoteBlogDataSource.kt @@ -0,0 +1,21 @@ +package com.ericampire.android.androidstudycase.data.datasource.blog + +import com.ericampire.android.androidstudycase.domain.entity.Blog +import com.ericampire.android.androidstudycase.domain.entity.BlogApiResponse +import com.ericampire.android.androidstudycase.util.ApiUrl +import io.ktor.client.* +import io.ktor.client.request.* +import javax.inject.Inject + +class RemoteBlogDataSource @Inject constructor( + private val httpClient: HttpClient +) : BlogDataSource { + override suspend fun findAll(): List { + val data = httpClient.get(ApiUrl.Blog.latest) + return data.blogBlogData.blogPage.blogs + } + + override suspend fun save(blog: Blog) { + TODO("Not supported yet by the API") + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LocalLottieFileDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LocalLottieFileDataSource.kt new file mode 100644 index 0000000..02424a1 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LocalLottieFileDataSource.kt @@ -0,0 +1,25 @@ +package com.ericampire.android.androidstudycase.data.datasource.lottiefiles + +import com.ericampire.android.androidstudycase.data.room.LottieFilesDao +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile +import javax.inject.Inject + +class LocalLottieFileDataSource @Inject constructor( + private val lottieFileDao: LottieFilesDao +) : LottieFileDataSource { + override suspend fun findRecent(): List { + return lottieFileDao.findRecent() + } + + override suspend fun findPopular(): List { + return lottieFileDao.findPopular() + } + + override suspend fun findFeatured(): List { + return lottieFileDao.findFeatured() + } + + override suspend fun save(lottiefile: Lottiefile) { + lottieFileDao.save(lottiefile) + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LottieFileDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LottieFileDataSource.kt new file mode 100644 index 0000000..05cacdd --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/LottieFileDataSource.kt @@ -0,0 +1,11 @@ +package com.ericampire.android.androidstudycase.data.datasource.lottiefiles + +import com.ericampire.android.androidstudycase.domain.entity.Blog +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile + +interface LottieFileDataSource { + suspend fun findRecent(): List + suspend fun findPopular(): List + suspend fun findFeatured(): List + suspend fun save(lottiefile: Lottiefile) +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/RemoteLottieFileDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/RemoteLottieFileDataSource.kt new file mode 100644 index 0000000..f85f009 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/lottiefiles/RemoteLottieFileDataSource.kt @@ -0,0 +1,34 @@ +package com.ericampire.android.androidstudycase.data.datasource.lottiefiles + +import com.ericampire.android.androidstudycase.domain.entity.LottieFilesApiResponse +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile +import com.ericampire.android.androidstudycase.util.ApiUrl +import io.ktor.client.* +import io.ktor.client.request.* +import javax.inject.Inject + +class RemoteLottieFileDataSource @Inject constructor( + private val httpClient: HttpClient +) : LottieFileDataSource { + + private suspend fun find(url: String): List { + val data = httpClient.get(url) + return data.lottieFilesLottieFilesData.page.results + } + + override suspend fun findRecent(): List { + return find(ApiUrl.LottieFile.recent) + } + + override suspend fun findPopular(): List { + return find(ApiUrl.LottieFile.popular) + } + + override suspend fun findFeatured(): List { + return find(ApiUrl.LottieFile.featured) + } + + override suspend fun save(lottiefile: Lottiefile) { + TODO("Not supported by the API") + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/user/UserDataSource.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/user/UserDataSource.kt deleted file mode 100644 index 7ed87b4..0000000 --- a/data/src/main/java/com/ericampire/android/androidstudycase/data/datasource/user/UserDataSource.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.ericampire.android.androidstudycase.data.datasource.user - - -interface UserDataSource { -} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/di/DataSourceModule.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/di/DataSourceModule.kt index 178d8fc..4c1c7bd 100644 --- a/data/src/main/java/com/ericampire/android/androidstudycase/data/di/DataSourceModule.kt +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/di/DataSourceModule.kt @@ -1,6 +1,85 @@ package com.ericampire.android.androidstudycase.data.di +import com.ericampire.android.androidstudycase.data.datasource.animator.AnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.animator.LocalAnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.animator.RemoteAnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.BlogDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.LocalBlogDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.RemoteBlogDataSource +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.LocalLottieFileDataSource +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.LottieFileDataSource +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.RemoteLottieFileDataSource +import com.ericampire.android.androidstudycase.data.room.AnimatorDao +import com.ericampire.android.androidstudycase.data.room.BlogDao +import com.ericampire.android.androidstudycase.data.room.LottieFilesDao +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import io.ktor.client.* +import io.ktor.client.engine.android.* +import io.ktor.client.features.json.* +import io.ktor.client.features.json.serializer.* +import kotlinx.serialization.json.Json as KotlinJson + +@Module +@InstallIn(SingletonComponent::class) object DataSourceModule { + @Provides + fun provideHttpClient(): HttpClient { + return HttpClient(Android) { + install(JsonFeature) { + val jsonSetup = KotlinJson { + isLenient = true + ignoreUnknownKeys = true + prettyPrint = true + } + serializer = KotlinxSerializer(jsonSetup) + } + } + } + + @Provides + fun provideLocalAnimatorDataSource( + animatorDao: AnimatorDao + ): AnimatorDataSource { + return LocalAnimatorDataSource(animatorDao) + } + + @Provides + fun provideRemoteBlogDataSource( + httpClient: HttpClient + ): BlogDataSource { + return RemoteBlogDataSource(httpClient) + } + + @Provides + fun provideLocalBlogDataSource( + dao: BlogDao + ): BlogDataSource { + return LocalBlogDataSource(dao) + } + + @Provides + fun provideRemoteAnimatorDataSource( + httpClient: HttpClient + ): AnimatorDataSource { + return RemoteAnimatorDataSource(httpClient) + } + + @Provides + fun provideRemoteLottieFileDataSource( + httpClient: HttpClient + ): LottieFileDataSource { + return RemoteLottieFileDataSource(httpClient) + } + + @Provides + fun provideLocalLottieFileDataSource( + dao: LottieFilesDao + ): LottieFileDataSource { + return LocalLottieFileDataSource(dao) + } } \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/di/RepositoryModule.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/di/RepositoryModule.kt index d6032ed..2953553 100644 --- a/data/src/main/java/com/ericampire/android/androidstudycase/data/di/RepositoryModule.kt +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/di/RepositoryModule.kt @@ -1,6 +1,58 @@ package com.ericampire.android.androidstudycase.data.di +import com.ericampire.android.androidstudycase.data.datasource.animator.AnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.animator.LocalAnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.animator.RemoteAnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.LocalBlogDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.RemoteBlogDataSource +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.LocalLottieFileDataSource +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.RemoteLottieFileDataSource +import com.ericampire.android.androidstudycase.data.repository.AnimatorRepositoryImpl +import com.ericampire.android.androidstudycase.data.repository.BlogRepositoryImpl +import com.ericampire.android.androidstudycase.data.repository.LottieFileRepositoryImpl +import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository +import com.ericampire.android.androidstudycase.domain.repository.BlogRepository +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) object RepositoryModule { + @Provides + fun provideAnimatorRepository( + localDataSource: LocalAnimatorDataSource, + remoteDataSource: RemoteAnimatorDataSource, + ) : AnimatorRepository { + return AnimatorRepositoryImpl( + localDataSource = localDataSource, + remoteDataSource = remoteDataSource + ) + } + + @Provides + fun provideLottieFileRepository( + localDataSource: LocalLottieFileDataSource, + remoteDataSource: RemoteLottieFileDataSource, + ) : LottieFileRepository { + return LottieFileRepositoryImpl( + localDataSource = localDataSource, + remoteDataSource = remoteDataSource + ) + } + + @Provides + fun provideBlogRepository( + localDataSource: LocalBlogDataSource, + remoteDataSource: RemoteBlogDataSource, + ) : BlogRepository { + return BlogRepositoryImpl( + localDataSource = localDataSource, + remoteDataSource = remoteDataSource + ) + } } \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt new file mode 100644 index 0000000..28cffc1 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt @@ -0,0 +1,34 @@ +package com.ericampire.android.androidstudycase.data.repository + +import com.ericampire.android.androidstudycase.data.datasource.animator.AnimatorDataSource +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + + +class AnimatorRepositoryImpl @Inject constructor( + private val remoteDataSource: AnimatorDataSource, + private val localDataSource: AnimatorDataSource, +) : AnimatorRepository { + override fun findAll(): Flow>> { + return flow { + try { + refreshData() + emit(Result.Success(localDataSource.findAll())) + } catch (e: Exception) { + emit(Result.Error(e)) + } + } + } + + private suspend fun refreshData() { + remoteDataSource.findAll().forEach { + localDataSource.save(it) + } + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/BlogRepositoryImpl.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/BlogRepositoryImpl.kt new file mode 100644 index 0000000..2f9c89d --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/BlogRepositoryImpl.kt @@ -0,0 +1,34 @@ +package com.ericampire.android.androidstudycase.data.repository + +import com.ericampire.android.androidstudycase.data.datasource.animator.AnimatorDataSource +import com.ericampire.android.androidstudycase.data.datasource.blog.BlogDataSource +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.domain.entity.Blog +import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository +import com.ericampire.android.androidstudycase.domain.repository.BlogRepository +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class BlogRepositoryImpl @Inject constructor( + private val remoteDataSource: BlogDataSource, + private val localDataSource: BlogDataSource, +) : BlogRepository { + override fun findAll(): Flow>> { + return flow { + try { + refreshData() + emit(Result.Success(localDataSource.findAll())) + } catch (e: Exception) { + emit(Result.Error(e)) + } + } + } + + private suspend fun refreshData() { + remoteDataSource.findAll().forEach { + localDataSource.save(it) + } + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/LottieFileRepositoryImpl.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/LottieFileRepositoryImpl.kt new file mode 100644 index 0000000..012ffc9 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/LottieFileRepositoryImpl.kt @@ -0,0 +1,56 @@ +package com.ericampire.android.androidstudycase.data.repository + +import com.ericampire.android.androidstudycase.data.datasource.lottiefiles.LottieFileDataSource +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class LottieFileRepositoryImpl @Inject constructor( + private val localDataSource: LottieFileDataSource, + private val remoteDataSource: LottieFileDataSource, +) : LottieFileRepository { + override suspend fun findRecent(): Flow>> { + return flow { + try { + val recentFiles = remoteDataSource.findRecent() + refreshData(recentFiles) + emit(Result.Success(localDataSource.findRecent())) + } catch (e: Exception) { + emit(Result.Error(e)) + } + } + } + + private suspend fun refreshData(data: List) { + data.forEach { + localDataSource.save(it) + } + } + + override suspend fun findPopular(): Flow>> { + return flow { + try { + val recentFiles = remoteDataSource.findPopular() + refreshData(recentFiles) + emit(Result.Success(localDataSource.findPopular())) + } catch (e: Exception) { + emit(Result.Error(e)) + } + } + } + + override suspend fun findFeatured(): Flow>> { + return flow { + try { + val recentFiles = remoteDataSource.findFeatured() + refreshData(recentFiles) + emit(Result.Success(localDataSource.findFeatured())) + } catch (e: Exception) { + emit(Result.Error(e)) + } + } + } +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/UserRepositoryImpl.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/UserRepositoryImpl.kt deleted file mode 100644 index 729ba4c..0000000 --- a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/UserRepositoryImpl.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.ericampire.android.androidstudycase.data.repository - -import com.ericampire.android.androidstudycase.data.datasource.user.UserDataSource -import com.ericampire.android.androidstudycase.domain.repository.UserRepository -import javax.inject.Inject - - -class UserRepositoryImpl @Inject constructor( - private val dataSource: UserDataSource -) : UserRepository { -} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/room/AnimatorDao.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/AnimatorDao.kt new file mode 100644 index 0000000..ab34562 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/AnimatorDao.kt @@ -0,0 +1,17 @@ +package com.ericampire.android.androidstudycase.data.room + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.ericampire.android.androidstudycase.domain.entity.Animator + +@Dao +interface AnimatorDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun save(animator: Animator) + + @Query("SELECT * FROM Animator") + suspend fun findAll(): List +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/room/BlogDao.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/BlogDao.kt new file mode 100644 index 0000000..2099642 --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/BlogDao.kt @@ -0,0 +1,16 @@ +package com.ericampire.android.androidstudycase.data.room + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.ericampire.android.androidstudycase.domain.entity.Blog + +@Dao +interface BlogDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun save(blog: Blog) + + @Query("SELECT * FROM Blog") + suspend fun findAll(): List +} \ No newline at end of file diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/room/LottieFilesDao.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/LottieFilesDao.kt new file mode 100644 index 0000000..ff45cea --- /dev/null +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/room/LottieFilesDao.kt @@ -0,0 +1,22 @@ +package com.ericampire.android.androidstudycase.data.room + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile + +@Dao +interface LottieFilesDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun save(lottiefile: Lottiefile) + + @Query("SELECT * FROM Lottiefile") + suspend fun findPopular(): List + + @Query("SELECT * FROM Lottiefile") + suspend fun findFeatured(): List + + @Query("SELECT * FROM Lottiefile") + suspend fun findRecent(): List +} \ No newline at end of file