diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 1fdc2cc..5bfe32e 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,6 +1,9 @@ +import de.fayard.refreshVersions.core.versionFor + plugins { id("com.android.library") id("kotlin-android") + kotlin("plugin.serialization") version "1.5.21" kotlin("kapt") } @@ -36,6 +39,11 @@ dependencies { api(platform(Libs.kotlin_coroutine_bom)) api(Libs.kotlin_coroutine_core) + api(Libs.ktor_client_core) + api(Libs.ktor_serialization) + + api(Libs.room_runtime) + testImplementation(Libs.junit_jupiter_api) testImplementation(Libs.junit_jupiter_engine) diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/di/UseCaseModule.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/di/UseCaseModule.kt index 2cdce85..62987db 100644 --- a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/di/UseCaseModule.kt +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/di/UseCaseModule.kt @@ -1,6 +1,58 @@ package com.ericampire.android.androidstudycase.domain.di +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 com.ericampire.android.androidstudycase.domain.usecase.* +import com.ericampire.android.androidstudycase.util.IoDispatcher +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher + +@Module +@InstallIn(SingletonComponent::class) object UseCaseModule { + @Provides + fun provideAnimatorUseCase( + repository: AnimatorRepository, + @IoDispatcher dispatcher: CoroutineDispatcher + ): FindFeaturedAnimatorUseCase { + return FindFeaturedAnimatorUseCase(repository, dispatcher) + } + + @Provides + fun provideFindFeaturedBlogUseCase( + repository: BlogRepository, + @IoDispatcher dispatcher: CoroutineDispatcher + ): FindFeaturedBlogUseCase { + return FindFeaturedBlogUseCase(repository, dispatcher) + } + + @Provides + fun provideFindFeaturedLottieFileUseCase( + repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher + ): FindFeaturedLottieFileUseCase { + return FindFeaturedLottieFileUseCase(repository, dispatcher) + } + + @Provides + fun provideFindRecentLottieFileUseCase( + repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher + ): FindRecentLottieFileUseCase { + return FindRecentLottieFileUseCase(repository, dispatcher) + } + + @Provides + fun provideFindPopularLottieFileUseCase( + repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher + ): FindPopularLottieFileUseCase { + return FindPopularLottieFileUseCase(repository, dispatcher) + } } \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Animator.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Animator.kt new file mode 100644 index 0000000..471a298 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Animator.kt @@ -0,0 +1,28 @@ +package com.ericampire.android.androidstudycase.domain.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + + +@Serializable +@Entity +data class Animator( + @PrimaryKey + val name: String = "", + val avatarUrl: String = "", +) + +@Serializable +data class FeaturedAnimators(val results: List) + +@Serializable +data class AnimatorData( + val featuredAnimators: FeaturedAnimators +) + +@Serializable +data class AnimatorApiResponse( + @SerialName("data") val animatorAnimatorData: AnimatorData +) \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/BlogPage.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/BlogPage.kt new file mode 100644 index 0000000..43021d9 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/BlogPage.kt @@ -0,0 +1,37 @@ +package com.ericampire.android.androidstudycase.domain.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.serialization.Contextual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +data class BlogPage( + val currentPage: Int, + val from: Int, + val perPage: Int, + val blogs: List, + val to: Int, + val total: Int, + val totalPages: Int +) + +@Serializable +data class BlogData( + @SerialName("blogs") val blogPage: BlogPage +) + +@Serializable +data class BlogApiResponse( + @SerialName("data") val blogBlogData: BlogData +) + +@Serializable +@Entity +data class Blog( + @Contextual val postedAt: Date, + @PrimaryKey val imageUrl: String, + val title: String +) \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Lottiefile.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Lottiefile.kt new file mode 100644 index 0000000..21ab7f8 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/Lottiefile.kt @@ -0,0 +1,53 @@ +package com.ericampire.android.androidstudycase.domain.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.serialization.Contextual +import kotlinx.serialization.ExperimentalSerializationApi +import java.util.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonNames +import java.util.* + +@Serializable +data class LottieFilesApiResponse( + @SerialName("data") + val lottieFilesLottieFilesData: LottieFilesData +) + +@ExperimentalSerializationApi +@Serializable +data class LottieFilesData( + @JsonNames("recent", "popular") + val page: LottieFilesPage +) + + +@Serializable +data class LottieFilesPage( + val currentPage: Int, + val from: Int, + val perPage: Int, + val results: List, + val to: Int, + val total: Int, + val totalPages: Int +) + + +@Serializable +@Entity +class Lottiefile( + @PrimaryKey val id: Long, + val bgColor: String, + val lottieUrl: String, + val gifUrl: String, + val videoUrl: String, + val imageUrl: String, + val name: String, + @Contextual val createdAt: Date, + val createdBy: Animator +) + + diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/User.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/User.kt deleted file mode 100644 index 4e78461..0000000 --- a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/entity/User.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ericampire.android.androidstudycase.domain.entity - - -data class User( - val uid: String = "", - - ) diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/AnimatorRepository.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/AnimatorRepository.kt new file mode 100644 index 0000000..8cb0c54 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/AnimatorRepository.kt @@ -0,0 +1,10 @@ +package com.ericampire.android.androidstudycase.domain.repository + +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow + + +interface AnimatorRepository { + fun findAll(): Flow>> +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/BlogRepository.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/BlogRepository.kt new file mode 100644 index 0000000..fe07a3e --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/BlogRepository.kt @@ -0,0 +1,10 @@ +package com.ericampire.android.androidstudycase.domain.repository + +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.domain.entity.Blog +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow + +interface BlogRepository { + fun findAll(): Flow>> +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/LottieFileRepository.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/LottieFileRepository.kt new file mode 100644 index 0000000..2e88f08 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/LottieFileRepository.kt @@ -0,0 +1,11 @@ +package com.ericampire.android.androidstudycase.domain.repository + +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile +import com.ericampire.android.androidstudycase.util.Result +import kotlinx.coroutines.flow.Flow + +interface LottieFileRepository { + fun findRecent(): Flow>> + fun findPopular(): Flow>> + fun findFeatured(): Flow>> +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/UserRepository.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/UserRepository.kt deleted file mode 100644 index 94c87f0..0000000 --- a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/repository/UserRepository.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.ericampire.android.androidstudycase.domain.repository - - -interface UserRepository { - -} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/BlogUseCase.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/BlogUseCase.kt new file mode 100644 index 0000000..a5c6e14 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/BlogUseCase.kt @@ -0,0 +1,21 @@ +package com.ericampire.android.androidstudycase.domain.usecase + +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.IoDispatcher +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.usecase.FlowUseCase +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class FindFeaturedBlogUseCase @Inject constructor( + private val repository: BlogRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : FlowUseCase>(dispatcher) { + override fun execute(parameters: Unit): Flow>> { + return repository.findAll() + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/FindFeaturedAnimatorUseCase.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/FindFeaturedAnimatorUseCase.kt new file mode 100644 index 0000000..1837d47 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/FindFeaturedAnimatorUseCase.kt @@ -0,0 +1,19 @@ +package com.ericampire.android.androidstudycase.domain.usecase + +import com.ericampire.android.androidstudycase.domain.entity.Animator +import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository +import com.ericampire.android.androidstudycase.util.IoDispatcher +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.usecase.FlowUseCase +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class FindFeaturedAnimatorUseCase @Inject constructor( + private val repository: AnimatorRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : FlowUseCase>(dispatcher) { + override fun execute(parameters: Unit): Flow>> { + return repository.findAll() + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/LottieFileUseCase.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/LottieFileUseCase.kt new file mode 100644 index 0000000..b422946 --- /dev/null +++ b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/LottieFileUseCase.kt @@ -0,0 +1,37 @@ +package com.ericampire.android.androidstudycase.domain.usecase + +import com.ericampire.android.androidstudycase.domain.entity.Lottiefile +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import com.ericampire.android.androidstudycase.util.IoDispatcher +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.usecase.FlowUseCase +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class FindRecentLottieFileUseCase @Inject constructor( + private val repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : FlowUseCase>(dispatcher) { + override fun execute(parameters: Unit): Flow>> { + return repository.findRecent() + } +} + +class FindPopularLottieFileUseCase @Inject constructor( + private val repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : FlowUseCase>(dispatcher) { + override fun execute(parameters: Unit): Flow>> { + return repository.findPopular() + } +} + +class FindFeaturedLottieFileUseCase @Inject constructor( + private val repository: LottieFileRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : FlowUseCase>(dispatcher) { + override fun execute(parameters: Unit): Flow>> { + return repository.findFeatured() + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/UserUseCase.kt b/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/UserUseCase.kt deleted file mode 100644 index 1254eb1..0000000 --- a/domain/src/main/java/com/ericampire/android/androidstudycase/domain/usecase/UserUseCase.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.ericampire.android.androidstudycase.domain.usecase -