Skip to content

Commit

Permalink
Merge pull request #99 from gabrielbmoro/feature/hiltImprovements
Browse files Browse the repository at this point in the history
Hilt improvements
  • Loading branch information
gabrielbmoro committed Dec 2, 2023
2 parents 71fa7db + 0215704 commit 9973b0c
Show file tree
Hide file tree
Showing 20 changed files with 169 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -1,30 +1,43 @@
package com.gabrielbmoro.moviedb.details.di

import com.gabrielbmoro.moviedb.details.domain.usecases.FavoriteMovieUseCase
import com.gabrielbmoro.moviedb.details.domain.usecases.FavoriteMovieUseCaseImpl
import com.gabrielbmoro.moviedb.details.domain.usecases.GetMovieDetailsUseCase
import com.gabrielbmoro.moviedb.details.domain.usecases.GetMovieDetailsUseCaseImpl
import com.gabrielbmoro.moviedb.details.domain.usecases.GetTrailersUseCase
import com.gabrielbmoro.moviedb.details.domain.usecases.GetTrailersUseCaseImpl
import com.gabrielbmoro.moviedb.details.domain.usecases.IsFavoriteMovieUseCase
import com.gabrielbmoro.moviedb.details.domain.usecases.IsFavoriteMovieUseCaseImpl
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.hilt.android.components.ViewModelComponent

@Module
@InstallIn(SingletonComponent::class)
@InstallIn(ViewModelComponent::class)
object DetailsModule {

@Provides
fun favoriteUseCase(repository: MoviesRepository): FavoriteMovieUseCase {
return FavoriteMovieUseCase(repository)
return FavoriteMovieUseCaseImpl(repository)
}

@Provides
fun getTrailersUseCase(repository: MoviesRepository): GetTrailersUseCase {
return GetTrailersUseCase(repository)
return GetTrailersUseCaseImpl(repository)
}

@Provides
fun isFavoriteMovieUseCase(repository: MoviesRepository): IsFavoriteMovieUseCase {
return IsFavoriteMovieUseCase(repository)
return IsFavoriteMovieUseCaseImpl(repository)
}

@Provides
fun getMovieDetailsUseCaseImpl(
repository: MoviesRepository,
getTrailersUseCase: GetTrailersUseCase
): GetMovieDetailsUseCase {
return GetMovieDetailsUseCaseImpl(repository, getTrailersUseCase)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,24 @@ package com.gabrielbmoro.moviedb.details.domain.usecases
import com.gabrielbmoro.moviedb.domain.model.DataOrException
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.Movie
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

open class FavoriteMovieUseCase @Inject constructor(
interface FavoriteMovieUseCase {
suspend operator fun invoke(
movie: Movie,
toFavorite: Boolean
): DataOrException<Boolean, Exception>
}

@ViewModelScoped
open class FavoriteMovieUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
) : FavoriteMovieUseCase {

suspend operator fun invoke(
override suspend operator fun invoke(
movie: Movie,
toFavorite: Boolean
): DataOrException<Boolean, Exception> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,22 @@ package com.gabrielbmoro.moviedb.details.domain.usecases

import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.MovieDetail
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.zip
import javax.inject.Inject

class GetMovieDetailsUseCase @Inject constructor(
interface GetMovieDetailsUseCase {
operator fun invoke(movieId: Long): Flow<MovieDetail>
}

@ViewModelScoped
class GetMovieDetailsUseCaseImpl @Inject constructor(
private val repository: MoviesRepository,
private val getTrailersUseCase: GetTrailersUseCase
) {
) : GetMovieDetailsUseCase {

operator fun invoke(movieId: Long): Flow<MovieDetail> = repository.getMovieDetail(movieId)
override operator fun invoke(movieId: Long): Flow<MovieDetail> = repository.getMovieDetail(movieId)
.zip(
other = getTrailersUseCase(movieId),
transform = { f1, f2 ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@ package com.gabrielbmoro.moviedb.details.domain.usecases

import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.VideoStream
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.transform
import javax.inject.Inject

class GetTrailersUseCase @Inject constructor(
interface GetTrailersUseCase {
operator fun invoke(movieId: Long): Flow<VideoStream?>
}

@ViewModelScoped
class GetTrailersUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
operator fun invoke(movieId: Long): Flow<VideoStream?> {
) : GetTrailersUseCase {
override operator fun invoke(movieId: Long): Flow<VideoStream?> {
return repository.getVideoStreams(movieId).transform {
val videoStream = it.firstOrNull { videoStream ->
videoStream.site == SITE_KEY && videoStream.official && videoStream.type == TYPE_KEY
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@ package com.gabrielbmoro.moviedb.details.domain.usecases

import com.gabrielbmoro.moviedb.domain.model.DataOrException
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import dagger.hilt.android.scopes.ViewModelScoped
import javax.inject.Inject

class IsFavoriteMovieUseCase @Inject constructor(
interface IsFavoriteMovieUseCase {
suspend operator fun invoke(movieTitle: String): DataOrException<Boolean, Exception>
}

@ViewModelScoped
class IsFavoriteMovieUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
) : IsFavoriteMovieUseCase {

suspend operator fun invoke(movieTitle: String): DataOrException<Boolean, Exception> {
override suspend operator fun invoke(movieTitle: String): DataOrException<Boolean, Exception> {
return repository.checkIsAFavoriteMovie(movieTitle)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import org.junit.Before
import org.junit.Test

@OptIn(ExperimentalCoroutinesApi::class)
class FavoriteMovieUseCaseTest {
class FavoriteMovieUseCaseImplTest {

private lateinit var repository: MoviesRepository
private lateinit var useCase: FavoriteMovieUseCase

@Before
fun before() {
repository = mockk()
useCase = FavoriteMovieUseCase(repository)
useCase = FavoriteMovieUseCaseImpl(repository)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ import org.junit.runners.JUnit4

@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
class GetTrailersUseCaseTest {
class GetTrailersUseCaseImplTest {

private lateinit var repository: MoviesRepository
private lateinit var useCase: GetTrailersUseCase

@Before
fun before() {
repository = mockk()
useCase = GetTrailersUseCase(repository)
useCase = GetTrailersUseCaseImpl(repository)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ import org.junit.runners.JUnit4

@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
class IsFavoriteMovieUseCaseTest {
class IsFavoriteMovieUseCaseImplTest {

private lateinit var repository: MoviesRepository
private lateinit var useCase: IsFavoriteMovieUseCase

@Before
fun before() {
repository = mockk()
useCase = IsFavoriteMovieUseCase(repository)
useCase = IsFavoriteMovieUseCaseImpl(repository)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,40 @@
package com.gabrielbmoro.moviedb.movies.di

import com.gabrielbmoro.moviedb.movies.domain.usecases.GetNowPlayingMoviesUseCase
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetNowPlayingMoviesUseCaseImpl
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetPopularMoviesUseCase
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetPopularMoviesUseCaseImpl
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetTopRatedMoviesUseCase
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetTopRatedMoviesUseCaseImpl
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetUpcomingMoviesUseCase
import com.gabrielbmoro.moviedb.movies.domain.usecases.GetUpcomingMoviesUseCaseImpl
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.hilt.android.components.ViewModelComponent

@Module
@InstallIn(SingletonComponent::class)
@InstallIn(ViewModelComponent::class)
object MoviesModule {

@Provides
fun getNowPlayingMoviesUseCase(repository: MoviesRepository): GetNowPlayingMoviesUseCase {
return GetNowPlayingMoviesUseCase(repository)
return GetNowPlayingMoviesUseCaseImpl(repository)
}

@Provides
fun getPopularMoviesUseCase(repository: MoviesRepository): GetPopularMoviesUseCase {
return GetPopularMoviesUseCase(repository)
return GetPopularMoviesUseCaseImpl(repository)
}

@Provides
fun getTopRatedMoviesUseCase(repository: MoviesRepository): GetTopRatedMoviesUseCase {
return GetTopRatedMoviesUseCase(repository)
return GetTopRatedMoviesUseCaseImpl(repository)
}

@Provides
fun getUpcomingMoviesUseCase(repository: MoviesRepository): GetUpcomingMoviesUseCase {
return GetUpcomingMoviesUseCase(repository)
return GetUpcomingMoviesUseCaseImpl(repository)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package com.gabrielbmoro.moviedb.movies.domain.usecases

import androidx.paging.PagingData
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.Movie
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class GetNowPlayingMoviesUseCase @Inject constructor(
interface GetNowPlayingMoviesUseCase {
operator fun invoke(): Flow<PagingData<Movie>>
}

@ViewModelScoped
class GetNowPlayingMoviesUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
operator fun invoke() = repository.getNowPlayingMovies()
) : GetNowPlayingMoviesUseCase {
override operator fun invoke() = repository.getNowPlayingMovies()
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package com.gabrielbmoro.moviedb.movies.domain.usecases

import androidx.paging.PagingData
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.Movie
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class GetPopularMoviesUseCase @Inject constructor(
interface GetPopularMoviesUseCase {
operator fun invoke(): Flow<PagingData<Movie>>
}

@ViewModelScoped
class GetPopularMoviesUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
operator fun invoke() = repository.getPopularMovies()
) : GetPopularMoviesUseCase {
override operator fun invoke() = repository.getPopularMovies()
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package com.gabrielbmoro.moviedb.movies.domain.usecases

import androidx.paging.PagingData
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.Movie
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class GetTopRatedMoviesUseCase @Inject constructor(
interface GetTopRatedMoviesUseCase {
operator fun invoke(): Flow<PagingData<Movie>>
}

@ViewModelScoped
class GetTopRatedMoviesUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
) : GetTopRatedMoviesUseCase {

operator fun invoke() = repository.getTopRatedMovies()
override operator fun invoke() = repository.getTopRatedMovies()
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package com.gabrielbmoro.moviedb.movies.domain.usecases

import androidx.paging.PagingData
import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.repository.model.Movie
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class GetUpcomingMoviesUseCase @Inject constructor(
interface GetUpcomingMoviesUseCase {
operator fun invoke(): Flow<PagingData<Movie>>
}

@ViewModelScoped
class GetUpcomingMoviesUseCaseImpl @Inject constructor(
private val repository: MoviesRepository
) {
) : GetUpcomingMoviesUseCase {

operator fun invoke() = repository.getUpcomingMovies()
override operator fun invoke() = repository.getUpcomingMovies()
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import org.junit.runners.JUnit4

@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
class GetPopularMoviesUseCaseTest {
class GetPopularMoviesUseCaseImplTest {

private lateinit var repository: MoviesRepository
private lateinit var useCase: GetPopularMoviesUseCase

@Before
fun before() {
repository = mockk()
useCase = GetPopularMoviesUseCase(repository)
useCase = GetPopularMoviesUseCaseImpl(repository)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class GetTopRatedMoviesUseCaseTest {
@Before
fun before() {
repository = mockk()
useCase = GetTopRatedMoviesUseCase(repository)
useCase = GetTopRatedMoviesUseCaseImpl(repository)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.gabrielbmoro.moviedb.search.di

import com.gabrielbmoro.moviedb.repository.MoviesRepository
import com.gabrielbmoro.moviedb.search.domain.SearchMovieUseCase
import com.gabrielbmoro.moviedb.search.domain.SearchMovieUseCaseImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent

@Module
@InstallIn(ViewModelComponent::class)
object SearchMovieModule {

@Provides
fun searchMovieUseCase(repository: MoviesRepository): SearchMovieUseCase {
return SearchMovieUseCaseImpl(repository)
}
}
Loading

0 comments on commit 9973b0c

Please sign in to comment.