Skip to content

Commit

Permalink
Update project
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelbel committed Mar 20, 2024
1 parent bbdb4d1 commit 1c224b2
Show file tree
Hide file tree
Showing 25 changed files with 244 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.PagingSource
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import org.michaelbel.movies.common.dispatchers.MoviesDispatchers
Expand All @@ -18,20 +16,22 @@ import org.michaelbel.movies.interactor.ktx.nameOrLocalList
import org.michaelbel.movies.interactor.remote.FeedMoviesRemoteMediator
import org.michaelbel.movies.interactor.remote.SearchMoviesRemoteMediator
import org.michaelbel.movies.network.model.MovieResponse
import org.michaelbel.movies.persistence.database.AppDatabase
import org.michaelbel.movies.persistence.database.MoviesDatabase
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.persistence.database.entity.mini.MovieDbMini
import org.michaelbel.movies.repository.MovieRepository
import org.michaelbel.movies.repository.PagingKeyRepository
import org.michaelbel.movies.repository.SearchRepository
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
internal class MovieInteractorImpl @Inject constructor(
private val dispatchers: MoviesDispatchers,
private val searchRepository: SearchRepository,
private val movieRepository: MovieRepository,
private val pagingKeyRepository: PagingKeyRepository,
private val database: AppDatabase
private val moviesDatabase: MoviesDatabase
): MovieInteractor {

override fun moviesPagingData(movieList: MovieList): Flow<PagingData<MovieDb>> {
Expand All @@ -43,7 +43,7 @@ internal class MovieInteractorImpl @Inject constructor(
remoteMediator = FeedMoviesRemoteMediator(
movieRepository = movieRepository,
pagingKeyRepository = pagingKeyRepository,
database = database,
moviesDatabase = moviesDatabase,
movieList = movieList.name
),
pagingSourceFactory = { movieRepository.moviesPagingSource(movieList.nameOrLocalList) }
Expand All @@ -60,7 +60,7 @@ internal class MovieInteractorImpl @Inject constructor(
pagingKeyRepository = pagingKeyRepository,
searchRepository = searchRepository,
movieRepository = movieRepository,
database = database,
moviesDatabase = moviesDatabase,
query = searchQuery
),
pagingSourceFactory = { movieRepository.moviesPagingSource(searchQuery) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,19 @@ import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import androidx.room.withTransaction
import org.michaelbel.movies.common.exceptions.PageEmptyException
import org.michaelbel.movies.network.ktx.isEmpty
import org.michaelbel.movies.network.ktx.isPaginationReached
import org.michaelbel.movies.network.ktx.nextPage
import org.michaelbel.movies.persistence.database.AppDatabase
import org.michaelbel.movies.persistence.database.MoviesDatabase
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.repository.MovieRepository
import org.michaelbel.movies.repository.PagingKeyRepository

actual class FeedMoviesRemoteMediator(
private val pagingKeyRepository: PagingKeyRepository,
private val movieRepository: MovieRepository,
private val database: AppDatabase,
private val moviesDatabase: MoviesDatabase,
private val movieList: String
): RemoteMediator<Int, MovieDb>() {

Expand All @@ -37,7 +36,7 @@ actual class FeedMoviesRemoteMediator(

val moviesResult = movieRepository.moviesResult(movieList, loadKey)

database.withTransaction {
moviesDatabase.withTransaction {
if (loadType == LoadType.REFRESH) {
pagingKeyRepository.removePagingKey(movieList)
movieRepository.removeMovies(movieList)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import androidx.room.withTransaction
import org.michaelbel.movies.common.exceptions.PageEmptyException
import org.michaelbel.movies.network.ktx.isEmpty
import org.michaelbel.movies.network.ktx.isPaginationReached
import org.michaelbel.movies.network.ktx.nextPage
import org.michaelbel.movies.persistence.database.AppDatabase
import org.michaelbel.movies.persistence.database.MoviesDatabase
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.repository.MovieRepository
import org.michaelbel.movies.repository.PagingKeyRepository
Expand All @@ -22,7 +21,7 @@ actual class SearchMoviesRemoteMediator(
private val pagingKeyRepository: PagingKeyRepository,
private val movieRepository: MovieRepository,
private val searchRepository: SearchRepository,
private val database: AppDatabase,
private val moviesDatabase: MoviesDatabase,
private val query: String
): RemoteMediator<Int, MovieDb>() {

Expand All @@ -43,7 +42,7 @@ actual class SearchMoviesRemoteMediator(

val moviesResult = searchRepository.searchMoviesResult(query, loadKey)

database.withTransaction {
moviesDatabase.withTransaction {
if (loadType == LoadType.REFRESH) {
pagingKeyRepository.removePagingKey(query)
movieRepository.removeMovies(query)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,7 @@
package org.michaelbel.movies.interactor.remote

import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import androidx.room.withTransaction
import org.michaelbel.movies.common.exceptions.PageEmptyException
import org.michaelbel.movies.network.ktx.isEmpty
import org.michaelbel.movies.network.ktx.isPaginationReached
import org.michaelbel.movies.network.ktx.nextPage
import org.michaelbel.movies.persistence.database.AppDatabase
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.repository.MovieRepository
import org.michaelbel.movies.repository.PagingKeyRepository

expect class FeedMoviesRemoteMediator: RemoteMediator<Int, MovieDb>
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,7 @@
package org.michaelbel.movies.interactor.remote

import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import androidx.room.withTransaction
import org.michaelbel.movies.common.exceptions.PageEmptyException
import org.michaelbel.movies.network.ktx.isEmpty
import org.michaelbel.movies.network.ktx.isPaginationReached
import org.michaelbel.movies.network.ktx.nextPage
import org.michaelbel.movies.persistence.database.AppDatabase
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.repository.MovieRepository
import org.michaelbel.movies.repository.PagingKeyRepository
import org.michaelbel.movies.repository.SearchRepository

expect class SearchMoviesRemoteMediator: RemoteMediator<Int, MovieDb>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.michaelbel.movies.persistence.database

import kotlinx.coroutines.flow.Flow
import org.michaelbel.movies.persistence.database.dao.AccountDao
import org.michaelbel.movies.persistence.database.entity.AccountDb
import javax.inject.Inject

class AccountPersistence @Inject internal constructor(
private val accountDao: AccountDao
) {

fun accountById(accountId: Int): Flow<AccountDb?> {
return accountDao.accountById(accountId)
}

suspend fun insert(account: AccountDb) {
accountDao.insert(account)
}

suspend fun removeById(accountId: Int) {
accountDao.removeById(accountId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.michaelbel.movies.persistence.database

import kotlinx.coroutines.flow.Flow
import org.michaelbel.movies.persistence.database.dao.ImageDao
import org.michaelbel.movies.persistence.database.entity.ImageDb
import javax.inject.Inject

class ImagePersistence @Inject internal constructor(
private val imageDao: ImageDao
) {

fun imagesFlow(movieId: Int): Flow<List<ImageDb>> {
return imageDao.imagesFlow(movieId)
}

suspend fun insert(images: List<ImageDb>) {
imageDao.insert(images)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.michaelbel.movies.persistence.database

import androidx.paging.PagingSource
import kotlinx.coroutines.flow.Flow
import org.michaelbel.movies.persistence.database.dao.MovieDao
import org.michaelbel.movies.persistence.database.entity.MovieDb
import org.michaelbel.movies.persistence.database.entity.mini.MovieDbMini
import javax.inject.Inject

class MoviePersistence @Inject internal constructor(
private val movieDao: MovieDao
) {

fun pagingSource(movieList: String): PagingSource<Int, MovieDb> {
return movieDao.pagingSource(movieList)
}

fun moviesFlow(movieList: String, limit: Int): Flow<List<MovieDb>> {
return movieDao.moviesFlow(movieList, limit)
}

suspend fun movies(movieList: String, limit: Int): List<MovieDb> {
return movieDao.movies(movieList, limit)
}

suspend fun moviesMini(movieList: String, limit: Int): List<MovieDbMini> {
return movieDao.moviesMini(movieList, limit)
}

suspend fun insertMovies(movies: List<MovieDb>) {
movieDao.insertMovies(movies)
}

suspend fun insertMovie(movie: MovieDb) {
movieDao.insertMovie(movie)
}

suspend fun removeMovies(movieList: String) {
movieDao.removeMovies(movieList)
}

suspend fun removeMovie(movieList: String, movieId: Int) {
movieDao.removeMovie(movieList, movieId)
}

suspend fun movieById(pagingKey: String, movieId: Int): MovieDb? {
return movieDao.movieById(pagingKey, movieId)
}

suspend fun maxPosition(movieList: String): Int? {
return movieDao.maxPosition(movieList)
}

suspend fun isEmpty(movieList: String): Boolean {
return movieDao.isEmpty(movieList)
}

suspend fun updateMovieColors(movieId: Int, containerColor: Int, onContainerColor: Int) {
movieDao.updateMovieColors(movieId, containerColor, onContainerColor)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.michaelbel.movies.persistence.database

import androidx.room.withTransaction
import org.michaelbel.movies.persistence.database.db.AppDatabase
import javax.inject.Inject

class MoviesDatabase @Inject internal constructor(
private val database: AppDatabase
) {

suspend fun <R> withTransaction(block: suspend () -> R): R {
return database.withTransaction(block)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.michaelbel.movies.persistence.database

import org.michaelbel.movies.persistence.database.dao.PagingKeyDao
import org.michaelbel.movies.persistence.database.entity.PagingKeyDb
import javax.inject.Inject

class PagingKeyPersistence @Inject internal constructor(
private val pagingKeyDao: PagingKeyDao
) {

suspend fun page(pagingKey: String): Int? {
return pagingKeyDao.page(pagingKey)
}

suspend fun totalPages(pagingKey: String): Int? {
return pagingKeyDao.totalPages(pagingKey)
}

suspend fun removePagingKey(pagingKey: String) {
pagingKeyDao.removePagingKey(pagingKey)
}

suspend fun insertPagingKey(pagingKey: PagingKeyDb) {
pagingKeyDao.insertPagingKey(pagingKey)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.michaelbel.movies.persistence.database

import kotlinx.coroutines.flow.Flow
import org.michaelbel.movies.persistence.database.dao.SuggestionDao
import org.michaelbel.movies.persistence.database.entity.SuggestionDb
import javax.inject.Inject

class SuggestionPersistence @Inject internal constructor(
private val suggestionDao: SuggestionDao
) {

fun suggestionsFlow(): Flow<List<SuggestionDb>> {
return suggestionDao.suggestionsFlow()
}

suspend fun insert(suggestions: List<SuggestionDb>) {
suggestionDao.insert(suggestions)
}

suspend fun removeAll() {
suggestionDao.removeAll()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.michaelbel.movies.persistence.database.entity.AccountDb
* The Data Access Object for the [AccountDb] class.
*/
@Dao
interface AccountDao {
internal interface AccountDao {

@Query("SELECT * FROM accounts WHERE id = :accountId")
fun accountById(accountId: Int): Flow<AccountDb?>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.michaelbel.movies.persistence.database.entity.ImageDb
* The Data Access Object for the [ImageDb] class.
*/
@Dao
interface ImageDao {
internal interface ImageDao {

@Query("SELECT * FROM images WHERE movieId = :movieId ORDER BY position ASC")
fun imagesFlow(movieId: Int): Flow<List<ImageDb>>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import org.michaelbel.movies.persistence.database.entity.mini.MovieDbMini
* The Data Access Object for the [MovieDb] class.
*/
@Dao
interface MovieDao {
internal interface MovieDao {

@Transaction
@Query("SELECT * FROM movies WHERE movieList = :movieList ORDER BY position ASC")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.michaelbel.movies.persistence.database.entity.PagingKeyDb
* The Data Access Object for the [PagingKeyDb] class.
*/
@Dao
interface PagingKeyDao {
internal interface PagingKeyDao {

@Transaction
@Query("SELECT page FROM pagingkeys WHERE pagingKey = :pagingKey")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.michaelbel.movies.persistence.database.entity.SuggestionDb
* The Data Access Object for the [SuggestionDb] class.
*/
@Dao
interface SuggestionDao {
internal interface SuggestionDao {

@Query("SELECT * FROM suggestions")
fun suggestionsFlow(): Flow<List<SuggestionDb>>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.michaelbel.movies.persistence.database
package org.michaelbel.movies.persistence.database.db

import android.content.Context
import androidx.room.Database
Expand Down Expand Up @@ -33,7 +33,7 @@ import org.michaelbel.movies.persistence.database.entity.SuggestionDb
exportSchema = false
)
@TypeConverters(CalendarConverter::class)
abstract class AppDatabase: RoomDatabase() {
internal abstract class AppDatabase: RoomDatabase() {

abstract fun movieDao(): MovieDao
abstract fun imageDao(): ImageDao
Expand Down
Loading

0 comments on commit 1c224b2

Please sign in to comment.