diff --git a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/impl/MovieInteractorImpl.kt b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/impl/MovieInteractorImpl.kt index 9513dacc1..83e2a6251 100644 --- a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/impl/MovieInteractorImpl.kt +++ b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/impl/MovieInteractorImpl.kt @@ -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 @@ -18,12 +16,14 @@ 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( @@ -31,7 +31,7 @@ internal class MovieInteractorImpl @Inject constructor( 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> { @@ -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) } @@ -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) } diff --git a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt index 5b56f2bb9..0badf178e 100644 --- a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt +++ b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt @@ -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 @@ -20,7 +19,7 @@ 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() { @@ -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) diff --git a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt index 6a3be5781..4c5a1d517 100644 --- a/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt +++ b/core/interactor-kmp/src/androidMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt @@ -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 @@ -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() { @@ -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) diff --git a/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt b/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt index 005b1f87c..6cfbd1679 100644 --- a/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt +++ b/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/FeedMoviesRemoteMediator.kt @@ -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 \ No newline at end of file diff --git a/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt b/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt index dcb55cb29..94bbf3569 100644 --- a/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt +++ b/core/interactor-kmp/src/commonMain/kotlin/org/michaelbel/movies/interactor/remote/SearchMoviesRemoteMediator.kt @@ -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 \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AccountPersistence.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AccountPersistence.kt new file mode 100644 index 000000000..4d15a5a8a --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AccountPersistence.kt @@ -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 { + return accountDao.accountById(accountId) + } + + suspend fun insert(account: AccountDb) { + accountDao.insert(account) + } + + suspend fun removeById(accountId: Int) { + accountDao.removeById(accountId) + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/ImagePersistence.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/ImagePersistence.kt new file mode 100644 index 000000000..384fe83dd --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/ImagePersistence.kt @@ -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> { + return imageDao.imagesFlow(movieId) + } + + suspend fun insert(images: List) { + imageDao.insert(images) + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviePersistence.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviePersistence.kt new file mode 100644 index 000000000..3c5a742c7 --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviePersistence.kt @@ -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 { + return movieDao.pagingSource(movieList) + } + + fun moviesFlow(movieList: String, limit: Int): Flow> { + return movieDao.moviesFlow(movieList, limit) + } + + suspend fun movies(movieList: String, limit: Int): List { + return movieDao.movies(movieList, limit) + } + + suspend fun moviesMini(movieList: String, limit: Int): List { + return movieDao.moviesMini(movieList, limit) + } + + suspend fun insertMovies(movies: List) { + 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) + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviesDatabase.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviesDatabase.kt new file mode 100644 index 000000000..b83c33912 --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/MoviesDatabase.kt @@ -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 withTransaction(block: suspend () -> R): R { + return database.withTransaction(block) + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/PagingKeyPersistence.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/PagingKeyPersistence.kt new file mode 100644 index 000000000..6c365afe4 --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/PagingKeyPersistence.kt @@ -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) + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/SuggestionPersistence.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/SuggestionPersistence.kt new file mode 100644 index 000000000..57d00cf52 --- /dev/null +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/SuggestionPersistence.kt @@ -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> { + return suggestionDao.suggestionsFlow() + } + + suspend fun insert(suggestions: List) { + suggestionDao.insert(suggestions) + } + + suspend fun removeAll() { + suggestionDao.removeAll() + } +} \ No newline at end of file diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/AccountDao.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/AccountDao.kt index 3e5a856c5..43db53cdb 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/AccountDao.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/AccountDao.kt @@ -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 diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/ImageDao.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/ImageDao.kt index 32aa91b53..59f41358b 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/ImageDao.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/ImageDao.kt @@ -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> diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/MovieDao.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/MovieDao.kt index 173e40d8b..f1f7066f5 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/MovieDao.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/MovieDao.kt @@ -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") diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/PagingKeyDao.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/PagingKeyDao.kt index 92545ec28..969cbd868 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/PagingKeyDao.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/PagingKeyDao.kt @@ -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") diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/SuggestionDao.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/SuggestionDao.kt index fa76d7d58..d22422960 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/SuggestionDao.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/dao/SuggestionDao.kt @@ -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> diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AppDatabase.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/db/AppDatabase.kt similarity index 95% rename from core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AppDatabase.kt rename to core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/db/AppDatabase.kt index 3ab4e402b..8dac11146 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/AppDatabase.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/db/AppDatabase.kt @@ -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 @@ -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 diff --git a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/di/DatabaseModule.kt b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/di/DatabaseModule.kt index de6c2f295..44d7a2489 100644 --- a/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/di/DatabaseModule.kt +++ b/core/persistence/src/main/kotlin/org/michaelbel/movies/persistence/database/di/DatabaseModule.kt @@ -7,7 +7,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton -import org.michaelbel.movies.persistence.database.AppDatabase +import org.michaelbel.movies.persistence.database.db.AppDatabase import org.michaelbel.movies.persistence.database.dao.AccountDao import org.michaelbel.movies.persistence.database.dao.ImageDao import org.michaelbel.movies.persistence.database.dao.MovieDao diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AccountRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AccountRepositoryImpl.kt index 419acd41d..0286f97df 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AccountRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AccountRepositoryImpl.kt @@ -11,7 +11,7 @@ import kotlinx.coroutines.flow.map import org.michaelbel.movies.common.exceptions.AccountDetailsException import org.michaelbel.movies.network.ktor.KtorAccountService import org.michaelbel.movies.network.retrofit.RetrofitAccountService -import org.michaelbel.movies.persistence.database.dao.AccountDao +import org.michaelbel.movies.persistence.database.AccountPersistence import org.michaelbel.movies.persistence.database.entity.AccountDb import org.michaelbel.movies.persistence.datastore.MoviesPreferences import org.michaelbel.movies.repository.AccountRepository @@ -24,13 +24,13 @@ import org.michaelbel.movies.repository.ktx.mapToAccountDb internal class AccountRepositoryImpl @Inject constructor( private val retrofitAccountService: RetrofitAccountService, private val ktorAccountService: KtorAccountService, - private val accountDao: AccountDao, + private val accountPersistence: AccountPersistence, private val preferences: MoviesPreferences ): AccountRepository { override val account: Flow = preferences.accountIdFlow .map { accountId -> accountId ?: 0 } - .flatMapLatest(accountDao::accountById) + .flatMapLatest(accountPersistence::accountById) override suspend fun accountId(): Int { return preferences.accountId() @@ -48,7 +48,7 @@ internal class AccountRepositoryImpl @Inject constructor( setAccountId(account.id) setAccountExpireTime(System.currentTimeMillis()) } - accountDao.insert(account.mapToAccountDb) + accountPersistence.insert(account.mapToAccountDb) }.onFailure { throw AccountDetailsException } diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AuthenticationRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AuthenticationRepositoryImpl.kt index 108483d7d..5e1b431f5 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AuthenticationRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/AuthenticationRepositoryImpl.kt @@ -1,7 +1,5 @@ package org.michaelbel.movies.repository.impl -import javax.inject.Inject -import javax.inject.Singleton import org.michaelbel.movies.common.exceptions.CreateRequestTokenException import org.michaelbel.movies.common.exceptions.CreateSessionException import org.michaelbel.movies.common.exceptions.CreateSessionWithLoginException @@ -13,9 +11,11 @@ import org.michaelbel.movies.network.model.SessionRequest import org.michaelbel.movies.network.model.Token import org.michaelbel.movies.network.model.Username import org.michaelbel.movies.network.retrofit.RetrofitAuthenticationService -import org.michaelbel.movies.persistence.database.dao.AccountDao +import org.michaelbel.movies.persistence.database.AccountPersistence import org.michaelbel.movies.persistence.datastore.MoviesPreferences import org.michaelbel.movies.repository.AuthenticationRepository +import javax.inject.Inject +import javax.inject.Singleton /** * You can replace [ktorAuthenticationService] with [retrofitAuthenticationService] to use it. @@ -24,7 +24,7 @@ import org.michaelbel.movies.repository.AuthenticationRepository internal class AuthenticationRepositoryImpl @Inject constructor( private val retrofitAuthenticationService: RetrofitAuthenticationService, private val ktorAuthenticationService: KtorAuthenticationService, - private val accountDao: AccountDao, + private val accountPersistence: AccountPersistence, private val preferences: MoviesPreferences ): AuthenticationRepository { @@ -83,7 +83,7 @@ internal class AuthenticationRepositoryImpl @Inject constructor( val deletedSession = ktorAuthenticationService.deleteSession(sessionRequest) if (deletedSession.success) { val accountId = preferences.accountId() - accountDao.removeById(accountId) + accountPersistence.removeById(accountId) preferences.run { removeSessionId() removeAccountId() diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/ImageRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/ImageRepositoryImpl.kt index 15b3ddf2a..b14b6c35b 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/ImageRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/ImageRepositoryImpl.kt @@ -1,14 +1,14 @@ package org.michaelbel.movies.repository.impl -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import org.michaelbel.movies.network.ktor.KtorMovieService import org.michaelbel.movies.network.retrofit.RetrofitMovieService -import org.michaelbel.movies.persistence.database.dao.ImageDao +import org.michaelbel.movies.persistence.database.ImagePersistence import org.michaelbel.movies.persistence.database.entity.ImageDb import org.michaelbel.movies.persistence.database.ktx.imageDb import org.michaelbel.movies.repository.ImageRepository +import javax.inject.Inject +import javax.inject.Singleton /** * You can replace [ktorMovieService] with [retrofitMovieService] to use it. @@ -17,11 +17,11 @@ import org.michaelbel.movies.repository.ImageRepository internal class ImageRepositoryImpl @Inject constructor( private val retrofitMovieService: RetrofitMovieService, private val ktorMovieService: KtorMovieService, - private val imageDao: ImageDao + private val imagePersistence: ImagePersistence ): ImageRepository { override fun imagesFlow(movieId: Int): Flow> { - return imageDao.imagesFlow(movieId) + return imagePersistence.imagesFlow(movieId) } override suspend fun images(movieId: Int) { @@ -47,6 +47,6 @@ internal class ImageRepositoryImpl @Inject constructor( position = posters.count().plus(backdrops.count()).plus(index) ) } - imageDao.insert(posters + backdrops + logos) + imagePersistence.insert(posters + backdrops + logos) } } \ No newline at end of file diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/MovieRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/MovieRepositoryImpl.kt index e711911b8..589f26d59 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/MovieRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/MovieRepositoryImpl.kt @@ -1,8 +1,6 @@ package org.michaelbel.movies.repository.impl import androidx.paging.PagingSource -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import org.michaelbel.movies.common.exceptions.MovieDetailsException import org.michaelbel.movies.common.exceptions.MoviesUpcomingException @@ -13,7 +11,7 @@ import org.michaelbel.movies.network.ktor.KtorMovieService import org.michaelbel.movies.network.model.MovieResponse import org.michaelbel.movies.network.model.Result import org.michaelbel.movies.network.retrofit.RetrofitMovieService -import org.michaelbel.movies.persistence.database.dao.MovieDao +import org.michaelbel.movies.persistence.database.MoviePersistence import org.michaelbel.movies.persistence.database.entity.MovieDb import org.michaelbel.movies.persistence.database.entity.mini.MovieDbMini import org.michaelbel.movies.persistence.database.ktx.movieDb @@ -21,6 +19,8 @@ import org.michaelbel.movies.persistence.database.ktx.orEmpty import org.michaelbel.movies.repository.MovieRepository import org.michaelbel.movies.repository.ktx.checkApiKeyNotNullException import org.michaelbel.movies.repository.ktx.mapToMovieDb +import javax.inject.Inject +import javax.inject.Singleton /** * You can replace [ktorMovieService] with [retrofitMovieService] to use it. @@ -29,20 +29,20 @@ import org.michaelbel.movies.repository.ktx.mapToMovieDb internal class MovieRepositoryImpl @Inject constructor( private val retrofitMovieService: RetrofitMovieService, private val ktorMovieService: KtorMovieService, - private val movieDao: MovieDao, + private val moviePersistence: MoviePersistence, private val localeController: LocaleController ): MovieRepository { override fun moviesPagingSource(pagingKey: String): PagingSource { - return movieDao.pagingSource(pagingKey) + return moviePersistence.pagingSource(pagingKey) } override fun moviesFlow(pagingKey: String, limit: Int): Flow> { - return movieDao.moviesFlow(pagingKey, limit) + return moviePersistence.moviesFlow(pagingKey, limit) } override suspend fun moviesResult(movieList: String, page: Int): Result { - if (isTmdbApiKeyEmpty && movieDao.isEmpty(MovieDb.MOVIES_LOCAL_LIST)) { + if (isTmdbApiKeyEmpty && moviePersistence.isEmpty(MovieDb.MOVIES_LOCAL_LIST)) { checkApiKeyNotNullException() } @@ -54,12 +54,12 @@ internal class MovieRepositoryImpl @Inject constructor( } override suspend fun movie(pagingKey: String, movieId: Int): MovieDb { - return movieDao.movieById(pagingKey, movieId).orEmpty + return moviePersistence.movieById(pagingKey, movieId).orEmpty } override suspend fun movieDetails(pagingKey: String, movieId: Int): MovieDb { return try { - movieDao.movieById(pagingKey, movieId) ?: ktorMovieService.movie(movieId, localeController.language).mapToMovieDb + moviePersistence.movieById(pagingKey, movieId) ?: ktorMovieService.movie(movieId, localeController.language).mapToMovieDb } catch (ignored: Exception) { throw MovieDetailsException } @@ -78,26 +78,26 @@ internal class MovieRepositoryImpl @Inject constructor( position = index.plus(1) ) } - movieDao.removeMovies(MovieDb.MOVIES_WIDGET) - movieDao.insertMovies(moviesDb) - movieDao.moviesMini(MovieDb.MOVIES_WIDGET, MovieResponse.DEFAULT_PAGE_SIZE) + moviePersistence.removeMovies(MovieDb.MOVIES_WIDGET) + moviePersistence.insertMovies(moviesDb) + moviePersistence.moviesMini(MovieDb.MOVIES_WIDGET, MovieResponse.DEFAULT_PAGE_SIZE) } catch (ignored: Exception) { - movieDao.moviesMini(MovieDb.MOVIES_WIDGET, MovieResponse.DEFAULT_PAGE_SIZE).ifEmpty { + moviePersistence.moviesMini(MovieDb.MOVIES_WIDGET, MovieResponse.DEFAULT_PAGE_SIZE).ifEmpty { throw MoviesUpcomingException } } } override suspend fun removeMovies(pagingKey: String) { - movieDao.removeMovies(pagingKey) + moviePersistence.removeMovies(pagingKey) } override suspend fun removeMovie(pagingKey: String, movieId: Int) { - movieDao.removeMovie(pagingKey, movieId) + moviePersistence.removeMovie(pagingKey, movieId) } override suspend fun insertMovies(pagingKey: String, page: Int, movies: List) { - val maxPosition = movieDao.maxPosition(pagingKey) ?: 0 + val maxPosition = moviePersistence.maxPosition(pagingKey) ?: 0 val moviesDb = movies.mapIndexed { index, movieResponse -> movieResponse.mapToMovieDb( movieList = pagingKey, @@ -105,12 +105,12 @@ internal class MovieRepositoryImpl @Inject constructor( position = if (maxPosition == 0) index else maxPosition.plus(index).plus(1) ) } - movieDao.insertMovies(moviesDb) + moviePersistence.insertMovies(moviesDb) } override suspend fun insertMovie(pagingKey: String, movie: MovieDb) { - val maxPosition = movieDao.maxPosition(pagingKey) ?: 0 - movieDao.insertMovie( + val maxPosition = moviePersistence.maxPosition(pagingKey) ?: 0 + moviePersistence.insertMovie( movie.copy( movieList = pagingKey, dateAdded = System.currentTimeMillis(), @@ -120,6 +120,6 @@ internal class MovieRepositoryImpl @Inject constructor( } override suspend fun updateMovieColors(movieId: Int, containerColor: Int, onContainerColor: Int) { - movieDao.updateMovieColors(movieId, containerColor, onContainerColor) + moviePersistence.updateMovieColors(movieId, containerColor, onContainerColor) } } \ No newline at end of file diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/PagingKeyRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/PagingKeyRepositoryImpl.kt index c0539bc8f..4dfb12f98 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/PagingKeyRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/PagingKeyRepositoryImpl.kt @@ -1,22 +1,22 @@ package org.michaelbel.movies.repository.impl -import javax.inject.Inject -import javax.inject.Singleton -import org.michaelbel.movies.persistence.database.dao.PagingKeyDao +import org.michaelbel.movies.persistence.database.PagingKeyPersistence import org.michaelbel.movies.persistence.database.entity.PagingKeyDb import org.michaelbel.movies.repository.PagingKeyRepository +import javax.inject.Inject +import javax.inject.Singleton @Singleton internal class PagingKeyRepositoryImpl @Inject constructor( - private val pagingKeyDao: PagingKeyDao + private val pagingKeyPersistence: PagingKeyPersistence ): PagingKeyRepository { override suspend fun page(pagingKey: String): Int? { - return pagingKeyDao.page(pagingKey) + return pagingKeyPersistence.page(pagingKey) } override suspend fun totalPages(pagingKey: String): Int? { - return pagingKeyDao.totalPages(pagingKey) + return pagingKeyPersistence.totalPages(pagingKey) } override suspend fun prevPage(pagingKey: String): Int? { @@ -24,11 +24,11 @@ internal class PagingKeyRepositoryImpl @Inject constructor( } override suspend fun removePagingKey(pagingKey: String) { - pagingKeyDao.removePagingKey(pagingKey) + pagingKeyPersistence.removePagingKey(pagingKey) } override suspend fun insertPagingKey(pagingKey: String, page: Int, totalPages: Int) { - pagingKeyDao.insertPagingKey( + pagingKeyPersistence.insertPagingKey( PagingKeyDb( pagingKey = pagingKey, page = page, diff --git a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/SuggestionRepositoryImpl.kt b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/SuggestionRepositoryImpl.kt index 4c57c1077..4d9b5414a 100644 --- a/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/SuggestionRepositoryImpl.kt +++ b/core/repository-kmp/src/androidMain/kotlin/org/michaelbel/movies/repository/impl/SuggestionRepositoryImpl.kt @@ -1,16 +1,16 @@ package org.michaelbel.movies.repository.impl -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import org.michaelbel.movies.common.localization.LocaleController import org.michaelbel.movies.network.ktor.KtorMovieService import org.michaelbel.movies.network.model.Movie import org.michaelbel.movies.network.retrofit.RetrofitMovieService -import org.michaelbel.movies.persistence.database.dao.MovieDao -import org.michaelbel.movies.persistence.database.dao.SuggestionDao +import org.michaelbel.movies.persistence.database.MoviePersistence +import org.michaelbel.movies.persistence.database.SuggestionPersistence import org.michaelbel.movies.persistence.database.entity.SuggestionDb import org.michaelbel.movies.repository.SuggestionRepository +import javax.inject.Inject +import javax.inject.Singleton /** * You can replace [ktorMovieService] with [retrofitMovieService] to use it. @@ -19,28 +19,28 @@ import org.michaelbel.movies.repository.SuggestionRepository internal class SuggestionRepositoryImpl @Inject constructor( private val retrofitMovieService: RetrofitMovieService, private val ktorMovieService: KtorMovieService, - private val movieDao: MovieDao, - private val suggestionDao: SuggestionDao, + private val moviePersistence: MoviePersistence, + private val suggestionPersistence: SuggestionPersistence, private val localeController: LocaleController ): SuggestionRepository { override fun suggestions(): Flow> { - return suggestionDao.suggestionsFlow() + return suggestionPersistence.suggestionsFlow() } override suspend fun updateSuggestions() { - suggestionDao.removeAll() + suggestionPersistence.removeAll() - val nowPlayingMovies = movieDao.movies(Movie.NOW_PLAYING, 5) + val nowPlayingMovies = moviePersistence.movies(Movie.NOW_PLAYING, 5) if (nowPlayingMovies.isNotEmpty()) { - suggestionDao.insert(nowPlayingMovies.map { movieDb -> SuggestionDb(movieDb.title) }) + suggestionPersistence.insert(nowPlayingMovies.map { movieDb -> SuggestionDb(movieDb.title) }) } else { val movieResponse = ktorMovieService.movies( list = Movie.NOW_PLAYING, language = localeController.language, page = 1 ).results.take(5) - suggestionDao.insert(movieResponse.map { movie -> SuggestionDb(movie.title) }) + suggestionPersistence.insert(movieResponse.map { movie -> SuggestionDb(movie.title) }) } } } \ No newline at end of file diff --git a/core/work/src/main/kotlin/org/michaelbel/movies/work/MoviesDatabaseWorker.kt b/core/work/src/main/kotlin/org/michaelbel/movies/work/MoviesDatabaseWorker.kt index a7fc8b424..d0113530c 100644 --- a/core/work/src/main/kotlin/org/michaelbel/movies/work/MoviesDatabaseWorker.kt +++ b/core/work/src/main/kotlin/org/michaelbel/movies/work/MoviesDatabaseWorker.kt @@ -14,7 +14,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream import org.michaelbel.movies.common.dispatchers.MoviesDispatchers import org.michaelbel.movies.network.model.MovieResponse -import org.michaelbel.movies.persistence.database.dao.MovieDao +import org.michaelbel.movies.persistence.database.MoviePersistence import org.michaelbel.movies.persistence.database.entity.MovieDb import org.michaelbel.movies.persistence.database.ktx.movieDb @@ -23,14 +23,14 @@ class MoviesDatabaseWorker @AssistedInject constructor( @Assisted context: Context, @Assisted workerParams: WorkerParameters, private val dispatchers: MoviesDispatchers, - private val movieDao: MovieDao + private val moviePersistence: MoviePersistence ): CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { return withContext(dispatchers.io) { try { val filename = inputData.getString(KEY_FILENAME) - if (filename != null && movieDao.isEmpty(MovieDb.MOVIES_LOCAL_LIST)) { + if (filename != null && moviePersistence.isEmpty(MovieDb.MOVIES_LOCAL_LIST)) { applicationContext.assets.open(filename).use { inputStream -> val format = Json { ignoreUnknownKeys = true } val moviesJsonData: List = format.decodeFromStream(inputStream) @@ -40,7 +40,7 @@ class MoviesDatabaseWorker @AssistedInject constructor( position = index.plus(1) ) } - movieDao.insertMovies(moviesDb) + moviePersistence.insertMovies(moviesDb) } } Result.success()