diff --git a/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/Mapper.kt b/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/Mapper.kt index f16897513..8133b8d22 100644 --- a/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/Mapper.kt +++ b/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/Mapper.kt @@ -3,10 +3,8 @@ package com.thomaskioko.tvmaniac.showsgrid import com.thomaskioko.tvmaniac.core.db.ShowsByCategory import com.thomaskioko.tvmaniac.showsgrid.model.TvShow -fun List.toTvShowList(): List = map { it.toTvShow() } - fun ShowsByCategory.toTvShow(): TvShow = TvShow( - traktId = trakt_id, + traktId = id.id, tmdbId = tmdb_id, title = title, posterImageUrl = poster_url, diff --git a/data/category/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/category/api/cache/CategoryCache.kt b/data/category/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/category/api/cache/CategoryCache.kt index d4a34253d..845e783ee 100644 --- a/data/category/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/category/api/cache/CategoryCache.kt +++ b/data/category/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/category/api/cache/CategoryCache.kt @@ -3,6 +3,6 @@ package com.thomaskioko.tvmaniac.category.api.cache import com.thomaskioko.tvmaniac.core.db.Show_category interface CategoryCache { - fun insert(category: Show_category) - fun insert(category: List) + fun upsert(category: Show_category) + fun upsert(category: List) } diff --git a/data/category/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/category/implementation/CategoryCacheImpl.kt b/data/category/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/category/implementation/CategoryCacheImpl.kt index f7efa87b8..aea103b44 100644 --- a/data/category/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/category/implementation/CategoryCacheImpl.kt +++ b/data/category/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/category/implementation/CategoryCacheImpl.kt @@ -12,16 +12,16 @@ class CategoryCacheImpl( private val showCategoryQuery get() = database.show_categoryQueries - override fun insert(category: Show_category) { + override fun upsert(category: Show_category) { database.transaction { showCategoryQuery.insertOrReplace( - trakt_id = category.trakt_id, + id = category.id, category_id = category.category_id, ) } } - override fun insert(category: List) { - category.forEach { insert(it) } + override fun upsert(category: List) { + category.forEach { upsert(it) } } } diff --git a/data/episodeimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/api/EpisodeImageDao.kt b/data/episodeimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/api/EpisodeImageDao.kt index c74f48296..4b8e5889c 100644 --- a/data/episodeimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/api/EpisodeImageDao.kt +++ b/data/episodeimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/api/EpisodeImageDao.kt @@ -6,9 +6,9 @@ import kotlinx.coroutines.flow.Flow interface EpisodeImageDao { - fun insert(entity: Episode_image) + fun upsert(entity: Episode_image) - fun insert(list: List) + fun upsert(list: List) fun observeEpisodeImage(): Flow> } diff --git a/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageDaoImpl.kt b/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageDaoImpl.kt index ab8fbd80e..16de93cd2 100644 --- a/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageDaoImpl.kt +++ b/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageDaoImpl.kt @@ -18,17 +18,17 @@ class EpisodeImageDaoImpl( private val episodeQueries get() = database.episode_imageQueries - override fun insert(entity: Episode_image) { + override fun upsert(entity: Episode_image) { episodeQueries.insertOrReplace( - trakt_id = entity.trakt_id, + id = entity.id, tmdb_id = entity.tmdb_id, image_url = entity.image_url, ) } - override fun insert(list: List) { + override fun upsert(list: List) { database.transaction { - list.map { insert(it) } + list.map { upsert(it) } } } diff --git a/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageRepositoryImpl.kt b/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageRepositoryImpl.kt index 94ee1a533..1980d15b2 100644 --- a/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageRepositoryImpl.kt +++ b/data/episodeimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodeimages/implementation/EpisodeImageRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.thomaskioko.tvmaniac.core.networkutil.DefaultError import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.episodeimages.api.EpisodeImageDao import com.thomaskioko.tvmaniac.episodeimages.api.EpisodeImageRepository import com.thomaskioko.tvmaniac.tmdb.api.TmdbNetworkDataSource @@ -38,10 +39,10 @@ class EpisodeImageRepositoryImpl( when (response) { is ApiResponse.Success -> { - episodeImageDao.insert( + episodeImageDao.upsert( Episode_image( - trakt_id = episodeArt.trakt_id, - tmdb_id = response.body.id.toLong(), + id = Id(id = response.body.id.toLong()), + tmdb_id = Id(id = tmdbId), image_url = response.body.imageUrl?.let { formatterUtil.formatTmdbPosterPath(it) }, diff --git a/data/episodes/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/api/EpisodesDao.kt b/data/episodes/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/api/EpisodesDao.kt index ab85ff44c..56f0aac79 100644 --- a/data/episodes/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/api/EpisodesDao.kt +++ b/data/episodes/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/api/EpisodesDao.kt @@ -1,6 +1,6 @@ package com.thomaskioko.tvmaniac.episodes.api -import com.thomaskioko.tvmaniac.core.db.Episodes as EpisodeCache +import com.thomaskioko.tvmaniac.core.db.Episode as EpisodeCache interface EpisodesDao { diff --git a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt index e8e5e3f66..19848fdf0 100644 --- a/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt +++ b/data/episodes/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/episodes/implementation/EpisodesDaoImpl.kt @@ -1,9 +1,10 @@ package com.thomaskioko.tvmaniac.episodes.implementation import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.episodes.api.EpisodesDao import me.tatarka.inject.annotations.Inject -import com.thomaskioko.tvmaniac.core.db.Episodes as EpisodeCache +import com.thomaskioko.tvmaniac.core.db.Episode as EpisodeCache @Inject class EpisodesDaoImpl( @@ -15,7 +16,7 @@ class EpisodesDaoImpl( override fun insert(entity: EpisodeCache) { database.transaction { episodeQueries.insertOrReplace( - trakt_id = entity.trakt_id, + id = entity.id, season_id = entity.season_id, tmdb_id = entity.tmdb_id, title = entity.title, @@ -33,7 +34,7 @@ class EpisodesDaoImpl( } override fun delete(id: Long) { - episodeQueries.delete(id) + episodeQueries.delete(Id(id)) } override fun deleteAll() { diff --git a/data/profilestats/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/profilestats/implementation/StatsStore.kt b/data/profilestats/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/profilestats/implementation/StatsStore.kt index 59aeb69ae..19e09011c 100644 --- a/data/profilestats/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/profilestats/implementation/StatsStore.kt +++ b/data/profilestats/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/profilestats/implementation/StatsStore.kt @@ -22,7 +22,7 @@ class StatsStore( private val mapper: StatsMapper, private val logger: KermitLogger, private val scope: AppCoroutineScope, -) : Store by storeBuilderFromFetcherAndSourceOfTruth( +) : Store by storeBuilderFromFetcherAndSourceOfTruth( fetcher = Fetcher.of { slug -> when (val response = remoteDataSource.getStats(slug)) { diff --git a/data/seasondetails/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/api/SeasonDetailsRepository.kt b/data/seasondetails/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/api/SeasonDetailsRepository.kt index 3ddaa2701..bc824bc11 100644 --- a/data/seasondetails/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/api/SeasonDetailsRepository.kt +++ b/data/seasondetails/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/api/SeasonDetailsRepository.kt @@ -1,13 +1,13 @@ package com.thomaskioko.tvmaniac.seasondetails.api -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import kotlinx.coroutines.flow.Flow interface SeasonDetailsRepository { - fun observeSeasonDetailsStream(traktId: Long): Flow>> + suspend fun fetchSeasonDetails(traktId: Long): List - fun observeCachedSeasonDetails(traktId: Long): Flow>> + fun observeSeasonDetailsStream(traktId: Long): Flow>> } diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/Mapper.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/Mapper.kt index 33d7aa01f..9595a6c9b 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/Mapper.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/Mapper.kt @@ -1,31 +1,27 @@ package com.thomaskioko.tvmaniac.seasondetails.implementation -import com.thomaskioko.tvmaniac.core.db.Episodes -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes -import com.thomaskioko.tvmaniac.trakt.api.model.TraktEpisodesResponse +import com.thomaskioko.tvmaniac.core.db.Episode +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.trakt.api.model.TraktSeasonEpisodesResponse -fun TraktSeasonEpisodesResponse.toEpisodeCacheList(): List { - return episodes.map { episodeResponse -> - Episodes( - season_id = ids.trakt.toLong(), - trakt_id = episodeResponse.ids.trakt.toLong(), - tmdb_id = episodeResponse.ids.tmdb?.toLong(), - title = episodeResponse.title, - overview = episodeResponse.overview ?: "TBA", - ratings = episodeResponse.ratings, - runtime = episodeResponse.runtime.toLong(), - votes = episodeResponse.votes.toLong(), - episode_number = episodeResponse.episodeNumber.toString().padStart(2, '0'), +internal fun List.toSeasonWithEpisodes(): List { + return map { season -> + SeasonData( + seasonId = season.ids.trakt.toLong(), + title = season.title, + overview = season.overview ?: "TBA", + episodeCount = season.episodeCount.toLong(), + seasonNumber = season.number.toLong(), + episodes = season.toEpisodeCacheList(), ) } } -fun List.toEpisodeCache(seasonId: Long): List { - return map { episodeResponse -> - Episodes( - season_id = seasonId, - trakt_id = episodeResponse.ids.trakt.toLong(), +fun TraktSeasonEpisodesResponse.toEpisodeCacheList(): List { + return episodes.map { episodeResponse -> + Episode( + id = Id(episodeResponse.ids.trakt.toLong()), + season_id = Id(ids.trakt.toLong()), tmdb_id = episodeResponse.ids.tmdb?.toLong(), title = episodeResponse.title, overview = episodeResponse.overview ?: "TBA", @@ -37,7 +33,11 @@ fun List.toEpisodeCache(seasonId: Long): List { } } -fun List.toSeasonWithEpisodes(): List { - // TODO:: Add mapping #59 - return emptyList() -} +internal data class SeasonData( + val seasonId: Long, + val title: String, + val overview: String, + val seasonNumber: Long, + val episodeCount: Long, + val episodes: List, +) diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt index 491235e1b..d5568bbbf 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsComponent.kt @@ -1,6 +1,5 @@ package com.thomaskioko.tvmaniac.seasondetails.implementation -import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsDao import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsRepository import com.thomaskioko.tvmaniac.util.scope.ApplicationScope import me.tatarka.inject.annotations.Provides @@ -12,8 +11,4 @@ interface SeasonDetailsComponent { fun provideSeasonDetailsRepository( bind: SeasonDetailsRepositoryImpl, ): SeasonDetailsRepository = bind - - @ApplicationScope - @Provides - fun provideSeasonsDetailsDao(bind: SeasonDetailsDaoImpl): SeasonDetailsDao = bind } diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsRepositoryImpl.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsRepositoryImpl.kt index c9a0cb781..63a59a3cf 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsRepositoryImpl.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsRepositoryImpl.kt @@ -1,39 +1,37 @@ package com.thomaskioko.tvmaniac.seasondetails.implementation -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes -import com.thomaskioko.tvmaniac.core.db.Season_episodes +import com.thomaskioko.tvmaniac.core.db.Season +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById import com.thomaskioko.tvmaniac.core.networkutil.ApiResponse -import com.thomaskioko.tvmaniac.core.networkutil.DefaultError import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler import com.thomaskioko.tvmaniac.core.networkutil.networkBoundResult +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.episodes.api.EpisodesDao -import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsDao import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsRepository +import com.thomaskioko.tvmaniac.seasons.api.SeasonsDao import com.thomaskioko.tvmaniac.trakt.api.TraktShowsRemoteDataSource import com.thomaskioko.tvmaniac.trakt.api.model.ErrorResponse import com.thomaskioko.tvmaniac.trakt.api.model.TraktSeasonEpisodesResponse import com.thomaskioko.tvmaniac.util.KermitLogger import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject @Inject class SeasonDetailsRepositoryImpl( private val remoteDataSource: TraktShowsRemoteDataSource, - private val seasonCache: SeasonDetailsDao, + private val seasonCache: SeasonsDao, private val episodesDao: EpisodesDao, private val exceptionHandler: NetworkExceptionHandler, private val dispatcher: AppCoroutineDispatchers, private val logger: KermitLogger, ) : SeasonDetailsRepository { - override fun observeSeasonDetailsStream(traktId: Long): Flow>> = + override fun observeSeasonDetailsStream(traktId: Long): Flow>> = networkBoundResult( - query = { seasonCache.observeShowEpisodes(traktId) }, + query = { seasonCache.observeSeasonEpisodeDetailsById(traktId) }, shouldFetch = { it.isNullOrEmpty() }, fetch = { remoteDataSource.getSeasonEpisodes(traktId) }, saveFetchResult = { mapResponse(traktId, it) }, @@ -41,10 +39,8 @@ class SeasonDetailsRepositoryImpl( coroutineDispatcher = dispatcher.io, ) - override fun observeCachedSeasonDetails(traktId: Long): Flow>> = - seasonCache.observeShowEpisodes(traktId) - .catch { Either.Left(DefaultError(exceptionHandler.resolveError(it))) } - .map { Either.Right(it) } + override suspend fun fetchSeasonDetails(traktId: Long): List = + seasonCache.fetchSeasonDetails(traktId) private fun mapResponse( showId: Long, @@ -55,11 +51,14 @@ class SeasonDetailsRepositoryImpl( response.body.forEach { season -> episodesDao.insert(season.toEpisodeCacheList()) - seasonCache.insert( - Season_episodes( - show_id = showId, - season_id = season.ids.trakt.toLong(), + seasonCache.upsert( + Season( + id = Id(season.ids.trakt.toLong()), + show_id = Id(showId), season_number = season.number.toLong(), + title = season.title, + episode_count = season.episodeCount.toLong(), + overview = season.overview, ), ) } diff --git a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsStore.kt b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsStore.kt index cfdff1f1e..16dc03eda 100644 --- a/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsStore.kt +++ b/data/seasondetails/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/implementation/SeasonDetailsStore.kt @@ -1,11 +1,11 @@ package com.thomaskioko.tvmaniac.seasondetails.implementation -import com.thomaskioko.tvmaniac.core.db.Episodes -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes -import com.thomaskioko.tvmaniac.core.db.Season_episodes +import com.thomaskioko.tvmaniac.core.db.Season +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById import com.thomaskioko.tvmaniac.core.networkutil.ApiResponse +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.episodes.api.EpisodesDao -import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsDao +import com.thomaskioko.tvmaniac.seasons.api.SeasonsDao import com.thomaskioko.tvmaniac.trakt.api.TraktShowsRemoteDataSource import com.thomaskioko.tvmaniac.util.KermitLogger import com.thomaskioko.tvmaniac.util.model.AppCoroutineScope @@ -18,12 +18,12 @@ import org.mobilenativefoundation.store.store5.StoreBuilder @Inject class SeasonDetailsStore( private val remoteDataSource: TraktShowsRemoteDataSource, - private val seasonDetailsDao: SeasonDetailsDao, + private val seasonCache: SeasonsDao, private val episodesDao: EpisodesDao, private val scope: AppCoroutineScope, private val logger: KermitLogger, -) : Store> by StoreBuilder - .from, List>( +) : Store> by StoreBuilder + .from( fetcher = Fetcher.of { id: Long -> when (val response = remoteDataSource.getSeasonEpisodes(id)) { is ApiResponse.Success -> response.body.toSeasonWithEpisodes() @@ -44,34 +44,25 @@ class SeasonDetailsStore( } }, sourceOfTruth = SourceOfTruth.of( - reader = seasonDetailsDao::observeShowEpisodes, + reader = seasonCache::observeSeasonEpisodeDetailsById, writer = { id, list -> list.forEach { season -> - episodesDao.insert( - Episodes( - trakt_id = season.trakt_id, - season_id = season.season_id, + seasonCache.upsert( + Season( + id = Id(season.seasonId), + show_id = Id(id), + season_number = season.seasonNumber, title = season.title, - tmdb_id = season.tmdb_id, + episode_count = season.episodeCount, overview = season.overview, - ratings = season.ratings, - runtime = season.runtime, - votes = season.votes, - episode_number = season.episode_number, ), ) - seasonDetailsDao.insert( - Season_episodes( - show_id = id, - season_id = season.trakt_id, - season_number = season.season_number, - ), - ) + episodesDao.insert(season.episodes) } }, - delete = seasonDetailsDao::delete, - deleteAll = seasonDetailsDao::deleteAll, + delete = seasonCache::delete, + deleteAll = seasonCache::deleteAll, ), ) .scope(scope.io) diff --git a/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/FakeSeasonDetailsRepository.kt b/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/FakeSeasonDetailsRepository.kt index d25663e67..7e0a13c8a 100644 --- a/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/FakeSeasonDetailsRepository.kt +++ b/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/FakeSeasonDetailsRepository.kt @@ -1,6 +1,6 @@ package com.thomaskioko.tvmaniac.seasondetails.testing -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsRepository @@ -10,22 +10,22 @@ import kotlinx.coroutines.flow.receiveAsFlow class FakeSeasonDetailsRepository : SeasonDetailsRepository { - private val seasonsResult: Channel>> = Channel(Channel.UNLIMITED) - private val cachedResult: Channel>> = Channel(Channel.UNLIMITED) + private val seasonsResult: Channel>> = Channel(Channel.UNLIMITED) + private val cachedResult: Channel> = Channel(Channel.UNLIMITED) - suspend fun setSeasonsResult(result: Either>) { + suspend fun setSeasonsResult(result: Either>) { seasonsResult.send(result) } - suspend fun setCachedResults(result: Either>) { + suspend fun setCachedResults(result: List) { cachedResult.send(result) } - override fun observeCachedSeasonDetails( + override suspend fun fetchSeasonDetails( traktId: Long, - ): Flow>> = cachedResult.receiveAsFlow() + ): List = cachedResult.receive() override fun observeSeasonDetailsStream( traktId: Long, - ): Flow>> = seasonsResult.receiveAsFlow() + ): Flow>> = seasonsResult.receiveAsFlow() } diff --git a/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/MockData.kt b/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/MockData.kt index 0b80394d6..a4b5c86a7 100644 --- a/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/MockData.kt +++ b/data/seasondetails/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasondetails/testing/MockData.kt @@ -1,24 +1,25 @@ package com.thomaskioko.tvmaniac.seasondetails.testing -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById +import com.thomaskioko.tvmaniac.db.Id val SeasonWithEpisodeList = listOf( - SeasonWithEpisodes( - trakt_id = 84958, - tmdb_id = 849583, - title = "Loki", + SeasonEpisodeDetailsById( + show_id = Id(84958), + season_id = Id(12343), + show_title = "Loki", overview = "After stealing the Tesseract in Avengers: Endgame, Loki lands before the Time Variance Authority.", runtime = 45, - id = 12345, - season_id = 12343, season_number = 0, - episode_count = 15, - name = "Season 01", - trakt_id_ = 12345, - title_ = "Some title", + episode_count = 1, + season_title = "Season 01", + season_overview = "The journey to reunite the Ingham family continues as they travel to the USA.", ratings = 4.5, episode_number = "01", votes = 4958, - image_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", + episode_image_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", + episode_title = "Some title", + episode_season_id = Id(12345), + episode_id = Id(12345), ), ) diff --git a/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsDao.kt b/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsDao.kt index b66e72782..58d129411 100644 --- a/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsDao.kt +++ b/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsDao.kt @@ -1,15 +1,21 @@ package com.thomaskioko.tvmaniac.seasons.api -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.Season +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import kotlinx.coroutines.flow.Flow interface SeasonsDao { - fun insertSeason(season: Seasons) + fun upsert(season: Season) - fun insertSeasons(entityList: List) + fun upsert(entityList: List) - fun observeSeasons(traktId: Long): Flow> + fun fetchSeasonDetails(traktId: Long): List + + fun observeSeasonsByShowId(traktId: Long): Flow> + + fun observeSeasonEpisodeDetailsById(showId: Long): Flow> fun delete(id: Long) diff --git a/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsRepository.kt b/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsRepository.kt index edfdf7abf..9d6a9ddaa 100644 --- a/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsRepository.kt +++ b/data/seasons/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/api/SeasonsRepository.kt @@ -1,12 +1,12 @@ package com.thomaskioko.tvmaniac.seasons.api -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import kotlinx.coroutines.flow.Flow interface SeasonsRepository { - suspend fun getSeasons(traktId: Long): List - fun observeSeasonsStoreResponse(traktId: Long): Flow>> + suspend fun fetchSeasonsByShowId(traktId: Long): List + fun observeSeasonsByShowId(traktId: Long): Flow>> } diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/Mapper.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/Mapper.kt index 533d6d27d..21500488a 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/Mapper.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/Mapper.kt @@ -1,15 +1,16 @@ package com.thomaskioko.tvmaniac.seasons.implementation -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.Season +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.trakt.api.model.TraktSeasonsResponse -fun List.toSeasonCacheList(traktId: Long): List = +fun List.toSeasonCacheList(traktId: Long): List = map { seasonResponse -> - Seasons( - show_trakt_id = traktId, - id = seasonResponse.ids.trakt.toLong(), + Season( + show_id = Id(traktId), + id = Id(id = seasonResponse.ids.trakt.toLong()), season_number = seasonResponse.number.toLong(), - name = seasonResponse.title, + title = seasonResponse.title, overview = seasonResponse.overview, episode_count = seasonResponse.episodeCount.toLong(), ) diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt index 1e596acd3..0b344db0b 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsDaoImpl.kt @@ -2,8 +2,11 @@ package com.thomaskioko.tvmaniac.seasons.implementation import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.Season +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.seasons.api.SeasonsDao import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow @@ -17,31 +20,40 @@ class SeasonsDaoImpl( private val seasonQueries get() = database.seasonQueries - override fun insertSeason(season: Seasons) { + override fun upsert(season: Season) { database.transaction { seasonQueries.insertOrReplace( id = season.id, - show_trakt_id = season.show_trakt_id, + show_id = season.show_id, season_number = season.season_number, episode_count = season.episode_count, - name = season.name, + title = season.title, overview = season.overview, ) } } - override fun insertSeasons(entityList: List) { - entityList.forEach { insertSeason(it) } + override fun upsert(entityList: List) { + entityList.forEach { upsert(it) } } - override fun observeSeasons(traktId: Long): Flow> { - return seasonQueries.seasonById(traktId) + override fun observeSeasonsByShowId(traktId: Long): Flow> { + return database.seasonQueries.seasonsByShowId(Id(traktId)) .asFlow() .mapToList(dispatcher.io) } + override fun fetchSeasonDetails(traktId: Long): List = + database.seasonQueries.seasonEpisodeDetailsById(id = Id(traktId)) + .executeAsList() + + override fun observeSeasonEpisodeDetailsById(showId: Long): Flow> = + database.seasonQueries.seasonEpisodeDetailsById(id = Id(showId)) + .asFlow() + .mapToList(dispatcher.io) + override fun delete(id: Long) { - seasonQueries.delete(id) + seasonQueries.delete(Id(id)) } override fun deleteAll() { diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsRepositoryImpl.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsRepositoryImpl.kt index 3367dcb2b..a4cc0cb2c 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsRepositoryImpl.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsRepositoryImpl.kt @@ -1,6 +1,6 @@ package com.thomaskioko.tvmaniac.seasons.implementation -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.resourcemanager.api.RequestManagerRepository @@ -26,10 +26,10 @@ class SeasonsRepositoryImpl( private val dispatcher: AppCoroutineDispatchers, ) : SeasonsRepository { - override suspend fun getSeasons(traktId: Long): List = + override suspend fun fetchSeasonsByShowId(traktId: Long): List = seasonsStore.get(traktId) - override fun observeSeasonsStoreResponse(traktId: Long): Flow>> = + override fun observeSeasonsByShowId(traktId: Long): Flow>> = seasonsStore.stream( StoreReadRequest.cached( key = traktId, diff --git a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsStore.kt b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsStore.kt index 54f07ca2e..b993f8695 100644 --- a/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsStore.kt +++ b/data/seasons/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/implementation/SeasonsStore.kt @@ -1,6 +1,6 @@ package com.thomaskioko.tvmaniac.seasons.implementation -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.networkutil.ApiResponse import com.thomaskioko.tvmaniac.resourcemanager.api.LastRequest import com.thomaskioko.tvmaniac.resourcemanager.api.RequestManagerRepository @@ -22,7 +22,7 @@ class SeasonsStore( private val seasonsDao: SeasonsDao, private val scope: AppCoroutineScope, private val logger: KermitLogger, -) : Store> by StoreBuilder.from, List>( +) : Store> by StoreBuilder.from( fetcher = Fetcher.of { id -> when (val response = remoteDataSource.getShowSeasons(id)) { is ApiResponse.Success -> response.body.toSeasonCacheList(id) @@ -43,14 +43,14 @@ class SeasonsStore( } }, sourceOfTruth = SourceOfTruth.of( - reader = seasonsDao::observeSeasons, + reader = seasonsDao::observeSeasonsByShowId, writer = { id, list -> - seasonsDao.insertSeasons(list) + seasonsDao.upsert(list) requestManagerRepository.insert( LastRequest( - id = list.first().id, + id = list.first().id.id, entityId = id, requestType = "SEASON", timestamp = Clock.System.now(), diff --git a/data/seasons/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/testing/FakeSeasonsRepository.kt b/data/seasons/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/testing/FakeSeasonsRepository.kt index 7eb3f74be..b07ff1914 100644 --- a/data/seasons/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/testing/FakeSeasonsRepository.kt +++ b/data/seasons/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/seasons/testing/FakeSeasonsRepository.kt @@ -1,7 +1,6 @@ package com.thomaskioko.tvmaniac.seasons.testing -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.seasons.api.SeasonsRepository @@ -11,27 +10,27 @@ import kotlinx.coroutines.flow.receiveAsFlow class FakeSeasonsRepository : SeasonsRepository { - private var seasonsList: Channel> = Channel(Channel.UNLIMITED) - private var seasonsResult: Channel>> = Channel(Channel.UNLIMITED) + private var seasonsList: Channel> = Channel(Channel.UNLIMITED) + private var seasonsResult: Channel>> = Channel(Channel.UNLIMITED) - private var seasonEpisodesResult: Channel>> = + private var seasonEpisodesResult: Channel>> = Channel(Channel.UNLIMITED) - suspend fun setSeasonWithEpisodes(result: Either>) { + suspend fun setSeasonWithEpisodes(result: Either>) { seasonEpisodesResult.send(result) } - suspend fun setSeasons(result: List) { + suspend fun setSeasons(result: List) { seasonsList.send(result) } - suspend fun setSeasonsResult(result: Either>) { + suspend fun setSeasonsResult(result: Either>) { seasonsResult.send(result) } - override suspend fun getSeasons(traktId: Long): List = seasonsList.receive() + override suspend fun fetchSeasonsByShowId(traktId: Long): List = seasonsList.receive() - override fun observeSeasonsStoreResponse( + override fun observeSeasonsByShowId( traktId: Long, - ): Flow>> = seasonsResult.receiveAsFlow() + ): Flow>> = seasonsResult.receiveAsFlow() } diff --git a/data/showimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/api/ShowImagesDao.kt b/data/showimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/api/ShowImagesDao.kt index 1adf44f43..26d59e7b4 100644 --- a/data/showimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/api/ShowImagesDao.kt +++ b/data/showimages/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/api/ShowImagesDao.kt @@ -1,12 +1,12 @@ package com.thomaskioko.tvmaniac.showimages.api -import com.thomaskioko.tvmaniac.core.db.SelectShowImages +import com.thomaskioko.tvmaniac.core.db.EmptyShowImage import com.thomaskioko.tvmaniac.core.db.Show_image import kotlinx.coroutines.flow.Flow interface ShowImagesDao { - fun insert(image: Show_image) + fun upsert(image: Show_image) - fun observeShowImages(): Flow> + fun observeShowImages(): Flow> } diff --git a/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesDaoImpl.kt b/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesDaoImpl.kt index 4317e5410..ad1b7955d 100644 --- a/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesDaoImpl.kt +++ b/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesDaoImpl.kt @@ -2,7 +2,7 @@ package com.thomaskioko.tvmaniac.showimages.implementation import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList -import com.thomaskioko.tvmaniac.core.db.SelectShowImages +import com.thomaskioko.tvmaniac.core.db.EmptyShowImage import com.thomaskioko.tvmaniac.core.db.Show_image import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase import com.thomaskioko.tvmaniac.showimages.api.ShowImagesDao @@ -16,10 +16,10 @@ class ShowImagesDaoImpl( private val dispatchers: AppCoroutineDispatchers, ) : ShowImagesDao { - override fun insert(image: Show_image) { + override fun upsert(image: Show_image) { database.transaction { database.show_imageQueries.insertOrReplace( - trakt_id = image.trakt_id, + id = image.id, tmdb_id = image.tmdb_id, poster_url = image.poster_url, backdrop_url = image.backdrop_url, @@ -27,8 +27,8 @@ class ShowImagesDaoImpl( } } - override fun observeShowImages(): Flow> { - return database.show_imageQueries.selectShowImages() + override fun observeShowImages(): Flow> { + return database.show_imageQueries.emptyShowImage() .asFlow() .mapToList(dispatchers.io) } diff --git a/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesRepositoryImpl.kt b/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesRepositoryImpl.kt index 8ffa4af07..50c5c5352 100644 --- a/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesRepositoryImpl.kt +++ b/data/showimages/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/showimages/implementation/ShowImagesRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.thomaskioko.tvmaniac.core.networkutil.DefaultError import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.resourcemanager.api.LastRequest import com.thomaskioko.tvmaniac.resourcemanager.api.RequestManagerRepository import com.thomaskioko.tvmaniac.showimages.api.ShowImagesDao @@ -42,9 +43,9 @@ class ShowImagesRepositoryImpl( } is ApiResponse.Success -> { - imageCache.insert( + imageCache.upsert( Show_image( - trakt_id = show.trakt_id, + id = Id(id = show.id.id), tmdb_id = tmdbId, poster_url = response.body.posterPath?.let { formatterUtil.formatTmdbPosterPath(it) @@ -58,7 +59,7 @@ class ShowImagesRepositoryImpl( requestManagerRepository.insert( LastRequest( id = tmdbId, - entityId = show.trakt_id, + entityId = show.id.id, requestType = "SHOW_ARTWORK", ), ) diff --git a/data/shows/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/ShowsDao.kt b/data/shows/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/ShowsDao.kt index 4393a466b..c2720edf6 100644 --- a/data/shows/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/ShowsDao.kt +++ b/data/shows/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/ShowsDao.kt @@ -8,9 +8,9 @@ import kotlinx.coroutines.flow.Flow interface ShowsDao { - fun insert(show: Show) + fun upsert(show: Show) - fun insert(list: List) + fun upsert(list: List) fun observeTvShow(showId: Long): Flow @@ -21,6 +21,4 @@ interface ShowsDao { fun getTvShow(traktId: Long): ShowById fun deleteTvShows() - - fun getShowsByCategoryID(categoryId: Long): List } diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverResponseMapper.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverResponseMapper.kt index 43aa2a87e..0d0e029df 100644 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverResponseMapper.kt +++ b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverResponseMapper.kt @@ -6,6 +6,7 @@ import com.thomaskioko.tvmaniac.core.db.ShowById import com.thomaskioko.tvmaniac.core.db.Show_category import com.thomaskioko.tvmaniac.core.db.ShowsByCategory import com.thomaskioko.tvmaniac.core.networkutil.ApiResponse +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.resourcemanager.api.LastRequest import com.thomaskioko.tvmaniac.resourcemanager.api.RequestManagerRepository import com.thomaskioko.tvmaniac.trakt.api.model.ErrorResponse @@ -35,10 +36,12 @@ class DiscoverResponseMapper( logger.error("ShowStore GenericError", "${response.errorBody}") throw Throwable("${response.errorMessage}") } + is ApiResponse.Error.GenericError -> { logger.error("ShowStore GenericError", "${response.errorMessage}") throw Throwable("${response.errorMessage}") } + is ApiResponse.Error.SerializationError -> { logger.error("ShowStore GenericError", "${response.errorMessage}") throw Throwable("${response.errorMessage}") @@ -58,10 +61,12 @@ class DiscoverResponseMapper( logger.error("ShowStore GenericError", "${response.errorBody}") throw Throwable("${response.errorMessage}") } + is ApiResponse.Error.SerializationError -> { logger.error("ShowStore GenericError", "${response.errorMessage}") throw Throwable("${response.errorMessage}") } + is ApiResponse.Error.GenericError -> { logger.error("ShowStore GenericError", "${response.errorMessage}") throw Throwable("${response.errorMessage}") @@ -69,7 +74,7 @@ class DiscoverResponseMapper( } private fun responseToEntity(response: TraktShowResponse) = ShowsByCategory( - trakt_id = response.ids.trakt.toLong(), + id = Id(id = response.ids.trakt.toLong()), tmdb_id = response.ids.tmdb?.toLong(), title = response.title, overview = response.overview ?: "", @@ -87,7 +92,7 @@ class DiscoverResponseMapper( ) fun responseToShow(response: TraktShowResponse) = ShowById( - trakt_id = response.ids.trakt.toLong(), + id = Id(id = response.ids.trakt.toLong()), tmdb_id = response.ids.tmdb?.toLong(), title = response.title, overview = response.overview ?: "", @@ -99,18 +104,14 @@ class DiscoverResponseMapper( rating = formatterUtil.formatDouble(response.rating, 1), genres = response.genres.map { it.replaceFirstChar { it.uppercase() } }, status = response.status.replaceFirstChar { it.uppercase() }, - trakt_id_ = null, - tmdb_id_ = null, poster_url = null, backdrop_url = null, - id = null, - created_at = null, - synced = false, + in_watchlist = 0L, ) fun toShow(showById: ShowById) = Show( - trakt_id = showById.trakt_id, + id = showById.id, tmdb_id = showById.tmdb_id, title = showById.title, overview = showById.overview, @@ -126,7 +127,7 @@ class DiscoverResponseMapper( private fun showResponseToCacheList(response: TraktShowsResponse): ShowsByCategory = ShowsByCategory( - trakt_id = response.show.ids.trakt.toLong(), + id = Id(id = response.show.ids.trakt.toLong()), tmdb_id = response.show.ids.tmdb?.toLong(), title = response.show.title, overview = response.show.overview ?: "", @@ -145,8 +146,8 @@ class DiscoverResponseMapper( fun toCategoryCache(shows: List, categoryId: Long) = shows.map { Show_category( - trakt_id = it.trakt_id, - category_id = categoryId, + id = Id(id = it.id.id), + category_id = Id(categoryId), ) } } diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverShowsStore.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverShowsStore.kt index 4a95c4894..582847bb3 100644 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverShowsStore.kt +++ b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/DiscoverShowsStore.kt @@ -47,7 +47,7 @@ class DiscoverShowsStore( val shows = list.map { Show( - trakt_id = it.trakt_id, + id = it.id, tmdb_id = it.tmdb_id, title = it.title, overview = it.overview, @@ -61,8 +61,8 @@ class DiscoverShowsStore( genres = it.genres, ) } - showsDao.insert(shows) - categoryCache.insert(mapper.toCategoryCache(shows, category.id)) + showsDao.upsert(shows) + categoryCache.upsert(mapper.toCategoryCache(shows, category.id)) }, ), ) diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowDaoImpl.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowDaoImpl.kt index ce12d3ea4..5107b4362 100644 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowDaoImpl.kt +++ b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowDaoImpl.kt @@ -8,21 +8,22 @@ import com.thomaskioko.tvmaniac.core.db.ShowById import com.thomaskioko.tvmaniac.core.db.Shows import com.thomaskioko.tvmaniac.core.db.ShowsByCategory import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.ShowsDao import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject @Inject -class ShowDaoImpl constructor( +class ShowDaoImpl( private val database: TvManiacDatabase, private val dispatchers: AppCoroutineDispatchers, ) : ShowsDao { - override fun insert(show: Show) { + override fun upsert(show: Show) { database.showQueries.transaction { database.showQueries.insertOrReplace( - trakt_id = show.trakt_id, + id = show.id, tmdb_id = show.tmdb_id, title = show.title, overview = show.overview, @@ -37,18 +38,18 @@ class ShowDaoImpl constructor( } } - override fun insert(list: List) { - list.forEach { insert(it) } + override fun upsert(list: List) { + list.forEach { upsert(it) } } override fun observeTvShow(showId: Long): Flow { - return database.showQueries.showById(showId) + return database.showQueries.showById(Id(showId)) .asFlow() .mapToOne(dispatchers.io) } override fun observeCachedShows(categoryId: Long): Flow> { - return database.showQueries.showsByCategory(categoryId) + return database.show_categoryQueries.showsByCategory(Id(categoryId)) .asFlow() .mapToList(dispatchers.io) } @@ -60,14 +61,10 @@ class ShowDaoImpl constructor( } override fun getTvShow(traktId: Long): ShowById = - database.showQueries.showById(traktId) + database.showQueries.showById(Id(traktId)) .executeAsOne() override fun deleteTvShows() { database.showQueries.deleteAll() } - - override fun getShowsByCategoryID(categoryId: Long): List = - database.showQueries.showsByCategory(categoryId) - .executeAsList() } diff --git a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowStore.kt b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowStore.kt index 5e8e16573..3c5751ab6 100644 --- a/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowStore.kt +++ b/data/shows/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/implementation/ShowStore.kt @@ -49,11 +49,11 @@ class ShowStore( reader = { traktId -> showsDao.observeTvShow(traktId) }, writer = { id, show -> - showsDao.insert(mapper.toShow(show)) + showsDao.upsert(mapper.toShow(show)) requestManagerRepository.insert( LastRequest( - id = id + show.trakt_id, + id = id + show.id.id, entityId = id, requestType = "SHOW_DETAILS", ), diff --git a/data/shows/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/testing/FakeDiscoverRepository.kt b/data/shows/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/testing/FakeDiscoverRepository.kt index ef6382f32..00df46a1f 100644 --- a/data/shows/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/testing/FakeDiscoverRepository.kt +++ b/data/shows/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/testing/FakeDiscoverRepository.kt @@ -5,6 +5,7 @@ import com.thomaskioko.tvmaniac.core.db.ShowById import com.thomaskioko.tvmaniac.core.db.ShowsByCategory import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.DiscoverRepository import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow @@ -38,7 +39,8 @@ class FakeDiscoverRepository : DiscoverRepository { showByIdResult.send(result) } - override fun observeShow(traktId: Long): Flow> = showByIdResult.receiveAsFlow() + override fun observeShow(traktId: Long): Flow> = + showByIdResult.receiveAsFlow() override fun observeShowCategory( category: Category, @@ -47,13 +49,14 @@ class FakeDiscoverRepository : DiscoverRepository { override suspend fun fetchDiscoverShows() {} - override suspend fun fetchShows(category: Category): List = showCategoryResult.receive() + override suspend fun fetchShows(category: Category): List = + showCategoryResult.receive() override suspend fun getShowById(traktId: Long): ShowById = showById.receive() } val selectedShow = ShowById( - trakt_id = 84958, + id = Id(84958), tmdb_id = 849583, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -72,9 +75,5 @@ val selectedShow = ShowById( poster_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", backdrop_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", aired_episodes = 12, - trakt_id_ = 1234, - id = 12345, - created_at = null, - synced = false, - tmdb_id_ = 1232, + in_watchlist = 0, ) diff --git a/data/similar/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/api/SimilarShowsDao.kt b/data/similar/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/api/SimilarShowsDao.kt index e5a288a6b..fb0c8acf0 100644 --- a/data/similar/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/api/SimilarShowsDao.kt +++ b/data/similar/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/api/SimilarShowsDao.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.flow.Flow interface SimilarShowsDao { - fun insert(traktId: Long, similarShowId: Long) + fun upsert(showId: Long, similarShowId: Long) fun observeSimilarShows(traktId: Long): Flow> diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/ResponseMapper.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/ResponseMapper.kt index 37ad2b2b7..e1928c406 100644 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/ResponseMapper.kt +++ b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/ResponseMapper.kt @@ -2,12 +2,13 @@ package com.thomaskioko.tvmaniac.similar.implementation import com.thomaskioko.tvmaniac.core.db.Show import com.thomaskioko.tvmaniac.core.db.SimilarShows +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.trakt.api.model.TraktShowResponse fun List.responseToShow(): List { return map { SimilarShows( - trakt_id = it.ids.trakt.toLong(), + id = Id(it.ids.trakt.toLong()), tmdb_id = it.ids.tmdb?.toLong(), title = it.title, overview = it.overview ?: "", @@ -26,7 +27,7 @@ fun List.responseToShow(): List { fun SimilarShows.toShow(): Show { return Show( - trakt_id = trakt_id, + id = id, tmdb_id = tmdb_id, title = title, overview = overview, diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowStore.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowStore.kt index b3acf71e2..990a18d0d 100644 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowStore.kt +++ b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowStore.kt @@ -23,7 +23,7 @@ class SimilarShowStore( private val requestManagerRepository: RequestManagerRepository, private val scope: AppCoroutineScope, private val logger: KermitLogger, -) : Store> by StoreBuilder.from, List>( +) : Store> by StoreBuilder.from( fetcher = Fetcher.of { id -> when (val apiResult = remoteDataSource.getSimilarShows(id)) { @@ -50,11 +50,11 @@ class SimilarShowStore( writer = { id, list -> list.forEach { - showsDao.insert(it.toShow()) + showsDao.upsert(it.toShow()) - similarShowsDao.insert( - traktId = id, - similarShowId = it.trakt_id, + similarShowsDao.upsert( + similarShowId = it.id.id, + showId = id, ) } diff --git a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt index 196e255a5..5d7bad51a 100644 --- a/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt +++ b/data/similar/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/similar/implementation/SimilarShowsDaoImpl.kt @@ -4,6 +4,7 @@ import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList import com.thomaskioko.tvmaniac.core.db.SimilarShows import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.similar.api.SimilarShowsDao import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow @@ -15,23 +16,23 @@ class SimilarShowsDaoImpl( private val dispatchers: AppCoroutineDispatchers, ) : SimilarShowsDao { - override fun insert(traktId: Long, similarShowId: Long) { + override fun upsert(showId: Long, similarShowId: Long) { database.similar_showsQueries.transaction { database.similar_showsQueries.insertOrReplace( - id = similarShowId, - trakt_id = traktId, + id = Id(similarShowId), + similar_show_id = Id(showId), ) } } override fun observeSimilarShows(traktId: Long): Flow> { - return database.similar_showsQueries.similarShows(trakt_id = traktId) + return database.similar_showsQueries.similarShows(Id(traktId)) .asFlow() .mapToList(dispatchers.io) } override fun delete(id: Long) { - database.similar_showsQueries.delete(id) + database.similar_showsQueries.delete(Id(id)) } override fun deleteAll() { diff --git a/data/trailers/api/src/commonMain/kotlin/com.thomaskioko.tvmaniac.data.trailers.implementation/TrailerDao.kt b/data/trailers/api/src/commonMain/kotlin/com.thomaskioko.tvmaniac.data.trailers.implementation/TrailerDao.kt index 66abbf9f7..d2e174df3 100644 --- a/data/trailers/api/src/commonMain/kotlin/com.thomaskioko.tvmaniac.data.trailers.implementation/TrailerDao.kt +++ b/data/trailers/api/src/commonMain/kotlin/com.thomaskioko.tvmaniac.data.trailers.implementation/TrailerDao.kt @@ -5,9 +5,9 @@ import kotlinx.coroutines.flow.Flow interface TrailerDao { - fun insert(trailer: Trailers) + fun upsert(trailer: Trailers) - fun insert(trailerList: List) + fun upsert(trailerList: List) fun observeTrailersById(showId: Long): Flow> diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt index 2fd127a33..c9b4fdde8 100644 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt +++ b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerDaoImpl.kt @@ -4,6 +4,7 @@ import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList import com.thomaskioko.tvmaniac.core.db.Trailers import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow import me.tatarka.inject.annotations.Inject @@ -14,10 +15,10 @@ class TrailerDaoImpl( private val dispatchers: AppCoroutineDispatchers, ) : TrailerDao { - override fun insert(trailer: Trailers) { + override fun upsert(trailer: Trailers) { database.trailersQueries.insertOrReplace( id = trailer.id, - trakt_id = trailer.trakt_id, + show_id = trailer.show_id, key = trailer.key, name = trailer.name, site = trailer.site, @@ -26,19 +27,19 @@ class TrailerDaoImpl( ) } - override fun insert(trailerList: List) { - trailerList.forEach { insert(it) } + override fun upsert(trailerList: List) { + trailerList.forEach { upsert(it) } } override fun observeTrailersById(showId: Long): Flow> { - return database.trailersQueries.selectByShowId(showId) + return database.trailersQueries.selectByShowId(Id(showId)) .asFlow() .mapToList(dispatchers.io) } override fun delete(id: Long) { database.transaction { - database.trailersQueries.delete(id) + database.trailersQueries.delete(Id(id)) } } diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerMapper.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerMapper.kt index ad1b7c77c..f7d2de761 100644 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerMapper.kt +++ b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerMapper.kt @@ -1,12 +1,13 @@ package com.thomaskioko.tvmaniac.data.trailers.implementation import com.thomaskioko.tvmaniac.core.db.Trailers +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.tmdb.api.model.TrailerResponse fun List.toEntity(id: Long) = map { trailer -> Trailers( id = trailer.id, - trakt_id = id, + show_id = Id(id), key = trailer.key, name = trailer.name, site = trailer.site, diff --git a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerStore.kt b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerStore.kt index 8be7294ae..e94b68d50 100644 --- a/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerStore.kt +++ b/data/trailers/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/data/trailers/implementation/TrailerStore.kt @@ -22,7 +22,7 @@ class TrailerStore( private val requestManagerRepository: RequestManagerRepository, private val logger: KermitLogger, private val scope: AppCoroutineScope, -) : Store> by StoreBuilder.from, List>( +) : Store> by StoreBuilder.from( fetcher = Fetcher.of { id -> val show = showsDao.getTvShow(id) @@ -49,10 +49,10 @@ class TrailerStore( sourceOfTruth = SourceOfTruth.of( reader = { id -> trailerDao.observeTrailersById(id) }, writer = { id, list -> - trailerDao.insert(list) + trailerDao.upsert(list) requestManagerRepository.insert( LastRequest( - id = list.first().trakt_id, + id = list.first().show_id.id, entityId = id, requestType = "TRAILERS", ), diff --git a/data/trailers/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/trailers/testing/MockData.kt b/data/trailers/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/trailers/testing/MockData.kt index daf967642..4c6e9601e 100644 --- a/data/trailers/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/trailers/testing/MockData.kt +++ b/data/trailers/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/trailers/testing/MockData.kt @@ -1,11 +1,12 @@ package com.thomaskioko.tvmaniac.trailers.testing import com.thomaskioko.tvmaniac.core.db.Trailers +import com.thomaskioko.tvmaniac.db.Id val trailers = listOf( Trailers( id = "1231", - trakt_id = 84958, + show_id = Id(84958), key = "Fd43V", name = "Some title", site = "Youtube", diff --git a/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistDao.kt b/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistDao.kt index 1367b6fe3..84425e9f4 100644 --- a/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistDao.kt +++ b/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistDao.kt @@ -1,20 +1,20 @@ package com.thomaskioko.tvmaniac.shows.api -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow import com.thomaskioko.tvmaniac.core.db.Watchlist import kotlinx.coroutines.flow.Flow interface WatchlistDao { - fun insert(followedShow: Watchlist) + fun upsert(watchlist: Watchlist) - fun insert(followedShows: List) + fun upsert(watchedShowList: List) - fun getWatchlist(): List + fun getWatchedShows(): List fun getUnSyncedShows(): List - fun observeWatchlist(): Flow> + fun observeWatchedShows(): Flow> fun updateShowSyncState(traktId: Long) diff --git a/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistRepository.kt b/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistRepository.kt index b51adbc93..e4b038aa1 100644 --- a/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistRepository.kt +++ b/data/watchlist/api/src/commonMain/kotlin/com/thomaskioko/tvmaniac/shows/api/WatchlistRepository.kt @@ -1,15 +1,15 @@ package com.thomaskioko.tvmaniac.shows.api -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import kotlinx.coroutines.flow.Flow interface WatchlistRepository { - fun observeWatchList(): Flow>> + fun observeWatchList(): Flow>> - fun getWatchlist(): List + suspend fun getWatchlist(): List suspend fun updateWatchlist(traktId: Long, addToWatchList: Boolean) diff --git a/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistDaoImpl.kt b/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistDaoImpl.kt index 8bee0ddc9..e3036a7c8 100644 --- a/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistDaoImpl.kt +++ b/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistDaoImpl.kt @@ -2,9 +2,10 @@ package com.thomaskioko.tvmaniac.watchlist.implementation import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist import com.thomaskioko.tvmaniac.core.db.TvManiacDatabase +import com.thomaskioko.tvmaniac.core.db.WatchedShow import com.thomaskioko.tvmaniac.core.db.Watchlist +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.shows.api.WatchlistDao import com.thomaskioko.tvmaniac.util.model.AppCoroutineDispatchers import kotlinx.coroutines.flow.Flow @@ -16,41 +17,41 @@ class WatchlistDaoImpl( private val dispatchers: AppCoroutineDispatchers, ) : WatchlistDao { - override fun insert(followedShow: Watchlist) { + override fun upsert(watchlist: Watchlist) { database.transaction { database.watchlistQueries.insertOrReplace( - id = followedShow.id, - synced = followedShow.synced, - created_at = followedShow.created_at, + id = watchlist.id, + synced = watchlist.synced, + created_at = watchlist.created_at, ) } } - override fun insert(followedShows: List) { - followedShows.forEach { insert(it) } + override fun upsert(watchedShowList: List) { + watchedShowList.forEach { upsert(it) } } - override fun getWatchlist(): List = - database.watchlistQueries.selectWatchlist() + override fun getWatchedShows(): List = + database.watchlistQueries.watchedShow() .executeAsList() - override fun getUnSyncedShows(): List = - database.watchlistQueries.selectUnsyncedShows() - .executeAsList() - - override fun observeWatchlist(): Flow> = - database.watchlistQueries.selectWatchlist() + override fun observeWatchedShows(): Flow> = + database.watchlistQueries.watchedShow() .asFlow() .mapToList(dispatchers.io) + override fun getUnSyncedShows(): List = + database.watchlistQueries.unsyncedShows() + .executeAsList() + override fun updateShowSyncState(traktId: Long) { database.watchlistQueries.updateFollowedState( - id = traktId, + id = Id(traktId), synced = true, ) } override fun removeShow(traktId: Long) { - database.watchlistQueries.removeShow(traktId) + database.watchlistQueries.removeShowFromWatchlist(Id(traktId)) } } diff --git a/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistRepositoryImpl.kt b/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistRepositoryImpl.kt index 4563d8175..39b223222 100644 --- a/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistRepositoryImpl.kt +++ b/data/watchlist/implementation/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/implementation/WatchlistRepositoryImpl.kt @@ -1,11 +1,12 @@ package com.thomaskioko.tvmaniac.watchlist.implementation -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow import com.thomaskioko.tvmaniac.core.db.Watchlist import com.thomaskioko.tvmaniac.core.networkutil.DefaultError import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.core.networkutil.NetworkExceptionHandler +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.profile.api.ProfileDao import com.thomaskioko.tvmaniac.shows.api.WatchlistDao import com.thomaskioko.tvmaniac.shows.api.WatchlistRepository @@ -20,7 +21,7 @@ import kotlinx.coroutines.flow.map import me.tatarka.inject.annotations.Inject @Inject -class WatchlistRepositoryImpl constructor( +class WatchlistRepositoryImpl( private val remoteDataSource: TraktListRemoteDataSource, private val watchlistDao: WatchlistDao, private val profileDao: ProfileDao, @@ -36,9 +37,9 @@ class WatchlistRepositoryImpl constructor( if (user.slug.isNotBlank()) { watchlistDao.getUnSyncedShows() .map { - remoteDataSource.addShowToWatchList(it.id) + remoteDataSource.addShowToWatchList(it.id.id) - watchlistDao.insert( + watchlistDao.upsert( Watchlist( id = it.id, synced = true, @@ -53,9 +54,9 @@ class WatchlistRepositoryImpl constructor( override suspend fun updateWatchlist(traktId: Long, addToWatchList: Boolean) { // TODO:: Check if user is signed into trakt and sync followed shows. when { - addToWatchList -> watchlistDao.insert( + addToWatchList -> watchlistDao.upsert( Watchlist( - id = traktId, + id = Id(traktId), synced = false, created_at = dateFormatter.getTimestampMilliseconds(), ), @@ -65,11 +66,11 @@ class WatchlistRepositoryImpl constructor( } } - override fun observeWatchList(): Flow>> = - watchlistDao.observeWatchlist() + override fun observeWatchList(): Flow>> = + watchlistDao.observeWatchedShows() .distinctUntilChanged() .map { Either.Right(it) } .catch { Either.Left(DefaultError(exceptionHandler.resolveError(it))) } - override fun getWatchlist(): List = watchlistDao.getWatchlist() + override suspend fun getWatchlist(): List = watchlistDao.getWatchedShows() } diff --git a/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/FakeWatchlistRepository.kt b/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/FakeWatchlistRepository.kt index b39f612a5..de6771737 100644 --- a/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/FakeWatchlistRepository.kt +++ b/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/FakeWatchlistRepository.kt @@ -1,25 +1,27 @@ package com.thomaskioko.tvmaniac.watchlist.testing -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.core.networkutil.Failure import com.thomaskioko.tvmaniac.shows.api.WatchlistRepository +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.receiveAsFlow class FakeWatchlistRepository : WatchlistRepository { - private var watchlistResult = flowOf>>() + private var watchlist: Channel> = Channel(Channel.UNLIMITED) + private var watchlistResult: Channel>> = + Channel(Channel.UNLIMITED) - suspend fun setFollowedResult(result: Either>) { - watchlistResult = flow { emit(result) } + suspend fun setFollowedResult(result: List) { + watchlist.send(result) } - override fun observeWatchList(): Flow>> = - watchlistResult + override fun observeWatchList(): Flow>> = + watchlistResult.receiveAsFlow() - override fun getWatchlist(): List = com.thomaskioko.tvmaniac.watchlist.testing.watchlistResult + override suspend fun getWatchlist(): List = watchlist.receive() override suspend fun updateWatchlist(traktId: Long, addToWatchList: Boolean) { } diff --git a/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/MockData.kt b/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/MockData.kt index 913e0dd7f..8216a1b7a 100644 --- a/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/MockData.kt +++ b/data/watchlist/testing/src/commonMain/kotlin/com/thomaskioko/tvmaniac/watchlist/testing/MockData.kt @@ -1,10 +1,11 @@ package com.thomaskioko.tvmaniac.watchlist.testing -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow +import com.thomaskioko.tvmaniac.db.Id val watchlistResult = listOf( - SelectWatchlist( - trakt_id = 84958, + WatchedShow( + show_id = Id(84958), tmdb_id = 849583, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -23,10 +24,6 @@ val watchlistResult = listOf( poster_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", backdrop_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", aired_episodes = 12, - id = 84958, - synced = true, created_at = 12345645, - trakt_id_ = 1232, - tmdb_id_ = 849583, ), ) diff --git a/presentation/discover/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/discover/DiscoverShowsMapper.kt b/presentation/discover/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/discover/DiscoverShowsMapper.kt index 7a80a1ddd..466ab72e7 100644 --- a/presentation/discover/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/discover/DiscoverShowsMapper.kt +++ b/presentation/discover/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/discover/DiscoverShowsMapper.kt @@ -12,7 +12,7 @@ fun List?.toTvShowList(): ImmutableList = this?.map { it.toTvShow() }?.toImmutableList() ?: persistentListOf() fun ShowsByCategory.toTvShow(): TvShow = TvShow( - traktId = trakt_id, + traktId = id.id, tmdbId = tmdb_id, title = title, overview = overview, diff --git a/presentation/discover/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/discover/MockData.kt b/presentation/discover/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/discover/MockData.kt index c62d54b90..910e5ecda 100644 --- a/presentation/discover/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/discover/MockData.kt +++ b/presentation/discover/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/discover/MockData.kt @@ -1,6 +1,7 @@ package com.thomaskioko.tvmaniac.presentation.discover import com.thomaskioko.tvmaniac.core.db.ShowsByCategory +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.presentation.discover.model.TvShow import kotlinx.collections.immutable.toImmutableList @@ -33,7 +34,7 @@ val discoverContent = DataLoaded( fun categoryResult(categoryId: Long) = listOf( ShowsByCategory( - trakt_id = 84958, + id = Id(84958), tmdb_id = 849583, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -51,14 +52,14 @@ fun categoryResult(categoryId: Long) = listOf( runtime = 45, poster_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", backdrop_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", - category_id = categoryId, + category_id = Id(categoryId), aired_episodes = null, ), ) fun updateCategoryResult(categoryId: Long, size: Int = 1) = List(size) { ShowsByCategory( - trakt_id = 84958, + id = Id(84958), tmdb_id = 849583, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -76,7 +77,7 @@ fun updateCategoryResult(categoryId: Long, size: Int = 1) = List(size) { runtime = 45, poster_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", backdrop_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", - category_id = categoryId, + category_id = Id(categoryId), aired_episodes = null, ) } diff --git a/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/Mapper.kt b/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/Mapper.kt index bfff1f713..e04b38087 100644 --- a/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/Mapper.kt +++ b/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/Mapper.kt @@ -1,42 +1,30 @@ package com.thomaskioko.tvmaniac.presentation.seasondetails -import com.thomaskioko.tvmaniac.core.db.SeasonWithEpisodes -import com.thomaskioko.tvmaniac.core.networkutil.Either +import com.thomaskioko.tvmaniac.core.db.SeasonEpisodeDetailsById import com.thomaskioko.tvmaniac.presentation.seasondetails.model.Episode import com.thomaskioko.tvmaniac.presentation.seasondetails.model.SeasonDetails -fun Either.Right>.toSeasonWithEpisodes(): List { - return data?.groupBy { it.name }?.map { groupMap -> +fun List?.toSeasonWithEpisodes(): List { + return this?.groupBy { it.season_id }?.map { (_, groupMap) -> + val seasonRow = groupMap.first() SeasonDetails( - seasonId = groupMap.value.first().season_id, - seasonName = groupMap.key, - episodes = groupMap.value.map { it.toEpisode() }, - episodeCount = groupMap.value.size.toLong(), - watchProgress = 0f, // TODO:: Fetch watch progress + seasonId = seasonRow.season_id.id, + seasonName = seasonRow.season_title, + episodes = groupMap.map { it.toEpisode() }, + episodeCount = seasonRow.episode_count, + watchProgress = 0f, ) } ?: emptyList() } -fun List?.toSeasonWithEpisodes(): List { - return this?.groupBy { it.name }?.map { groupMap -> - SeasonDetails( - seasonId = groupMap.value.first().season_id, - seasonName = groupMap.key, - episodes = groupMap.value.map { it.toEpisode() }, - episodeCount = groupMap.value.size.toLong(), - watchProgress = 0f, // TODO:: Fetch watch progress - ) - } ?: emptyList() -} - -fun SeasonWithEpisodes.toEpisode(): Episode { +fun SeasonEpisodeDetailsById.toEpisode(): Episode { return Episode( - id = id, - seasonId = season_id, - episodeTitle = title_, - episodeNumberTitle = "E$episode_number • $title_", + id = episode_id.id, + seasonId = season_id.id, + episodeTitle = episode_title, + episodeNumberTitle = "E$episode_number • $episode_title", overview = overview, - imageUrl = image_url, + imageUrl = episode_image_url, runtime = runtime, voteCount = votes, episodeNumber = episode_number, @@ -48,8 +36,4 @@ fun SeasonWithEpisodes.toEpisode(): Episode { ) } -fun Either.Right>.getTitle(): String = - data?.firstOrNull()?.title ?: "" - -fun List?.getTitle(): String = - this?.firstOrNull()?.title ?: "" +fun List?.getTitle(): String = this?.firstOrNull()?.show_title ?: "" diff --git a/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/SeasonDetailsStateMachine.kt b/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/SeasonDetailsStateMachine.kt index f4c1e9dca..834b8db18 100644 --- a/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/SeasonDetailsStateMachine.kt +++ b/presentation/seasondetails/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/seasondetails/SeasonDetailsStateMachine.kt @@ -1,8 +1,6 @@ package com.thomaskioko.tvmaniac.presentation.seasondetails -import com.freeletics.flowredux.dsl.ChangedState import com.freeletics.flowredux.dsl.FlowReduxStateMachine -import com.freeletics.flowredux.dsl.State import com.thomaskioko.tvmaniac.episodeimages.api.EpisodeImageRepository import com.thomaskioko.tvmaniac.seasondetails.api.SeasonDetailsRepository import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -21,23 +19,12 @@ class SeasonDetailsStateMachine( spec { inState { onEnter { state -> - fetchSeasonDetails(state) - } + val seasonList = seasonDetailsRepository.fetchSeasonDetails(traktId) - untilIdentityChanges({ state -> state }) { - collectWhileInState(seasonDetailsRepository.observeSeasonDetailsStream(traktId)) { result, state -> - result.fold( - { - state.override { LoadingError(it.errorMessage) } - }, - { - state.override { - SeasonDetailsLoaded( - showTitle = it.getTitle(), - seasonDetailsList = it.toSeasonWithEpisodes(), - ) - } - }, + state.override { + SeasonDetailsLoaded( + showTitle = seasonList.getTitle(), + seasonDetailsList = seasonList.toSeasonWithEpisodes(), ) } } @@ -70,23 +57,4 @@ class SeasonDetailsStateMachine( } } } - - private suspend fun fetchSeasonDetails(state: State): ChangedState { - var nextState: SeasonDetailsState = Loading - - seasonDetailsRepository.observeCachedSeasonDetails(traktId) - .collect { result -> - nextState = result.fold( - { LoadingError(it.errorMessage) }, - { - SeasonDetailsLoaded( - showTitle = it.getTitle(), - seasonDetailsList = it.toSeasonWithEpisodes(), - ) - }, - ) - } - - return state.override { nextState } - } } diff --git a/presentation/seasondetails/src/commonTest/kotlin/com/thomaskioko/tvmaniac/data/seasondetails/SeasonDetailsStateMachineTest.kt b/presentation/seasondetails/src/commonTest/kotlin/com/thomaskioko/tvmaniac/data/seasondetails/SeasonDetailsStateMachineTest.kt index 40da3c454..5d19f535b 100644 --- a/presentation/seasondetails/src/commonTest/kotlin/com/thomaskioko/tvmaniac/data/seasondetails/SeasonDetailsStateMachineTest.kt +++ b/presentation/seasondetails/src/commonTest/kotlin/com/thomaskioko/tvmaniac/data/seasondetails/SeasonDetailsStateMachineTest.kt @@ -26,7 +26,7 @@ class SeasonDetailsStateMachineTest { @Test fun onLoadSeasonDetails_correct_state_is_emitted() = runTest { stateMachine.state.test { - seasonDetailsRepository.setSeasonsResult(Either.Right(SeasonWithEpisodeList)) + seasonDetailsRepository.setCachedResults(SeasonWithEpisodeList) awaitItem() shouldBe Loading awaitItem() shouldBe seasonDetailsLoaded @@ -37,9 +37,11 @@ class SeasonDetailsStateMachineTest { fun onLoadSeasonDetails_andErrorOccurs_correctStateIsEmitted() = runTest { stateMachine.state.test { val errorMessage = "Something went wrong" + seasonDetailsRepository.setCachedResults(SeasonWithEpisodeList) seasonDetailsRepository.setSeasonsResult(Either.Left(DefaultError(errorMessage))) awaitItem() shouldBe Loading + awaitItem() shouldBe seasonDetailsLoaded awaitItem() shouldBe LoadingError(errorMessage) } } diff --git a/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailMapper.kt b/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailMapper.kt index 2f0ca1653..050249d4d 100644 --- a/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailMapper.kt +++ b/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailMapper.kt @@ -6,11 +6,11 @@ import com.thomaskioko.tvmaniac.core.db.Trailers import com.thomaskioko.tvmaniac.presentation.showdetails.model.Season import com.thomaskioko.tvmaniac.presentation.showdetails.model.Show import com.thomaskioko.tvmaniac.presentation.showdetails.model.Trailer -import com.thomaskioko.tvmaniac.core.db.Seasons as SeasonCache +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId as SeasonCache fun List?.toSimilarShowList(): List = this?.map { Show( - traktId = it.trakt_id, + traktId = it.id.id, tmdbId = it.tmdb_id, title = it.title, overview = it.overview, @@ -27,7 +27,7 @@ fun List?.toSimilarShowList(): List = this?.map { fun ShowById?.toTvShow(): Show = this?.let { Show( - traktId = it.trakt_id, + traktId = it.id.id, tmdbId = it.tmdb_id, title = it.title, overview = it.overview, @@ -39,22 +39,21 @@ fun ShowById?.toTvShow(): Show = this?.let { genres = it.genres, year = it.year, status = it.status, - isFollowed = it.id != null && it.id == it.trakt_id, - // TODO:: Get season count + isFollowed = it.in_watchlist == 1L, ) } ?: Show.EMPTY_SHOW fun List?.toSeasonsList(): List = this?.map { Season( - seasonId = it.id, - tvShowId = it.show_trakt_id, - name = it.name, + seasonId = it.season_id.id, + tvShowId = it.show_id.id, + name = it.season_title, ) } ?: emptyList() fun List?.toTrailerList(): List = this?.map { Trailer( - showId = it.trakt_id, + showId = it.show_id.id, key = it.key, name = it.name, youtubeThumbnailUrl = "https://i.ytimg.com/vi/${it.key}/hqdefault.jpg", diff --git a/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailsStateMachine.kt b/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailsStateMachine.kt index f1d1152b1..9a198ce4b 100644 --- a/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailsStateMachine.kt +++ b/presentation/show-details/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/ShowDetailsStateMachine.kt @@ -3,7 +3,7 @@ package com.thomaskioko.tvmaniac.presentation.showdetails import com.freeletics.flowredux.dsl.ChangedState import com.freeletics.flowredux.dsl.FlowReduxStateMachine import com.freeletics.flowredux.dsl.State -import com.thomaskioko.tvmaniac.core.db.Seasons +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.db.ShowById import com.thomaskioko.tvmaniac.core.db.SimilarShows import com.thomaskioko.tvmaniac.core.db.Trailers @@ -51,7 +51,7 @@ class ShowDetailsStateMachine( updateShowDetails(response, state) } - collectWhileInState(seasonsRepository.observeSeasonsStoreResponse(traktShowId)) { result, state -> + collectWhileInState(seasonsRepository.observeSeasonsByShowId(traktShowId)) { result, state -> updateSeasonDetailsState(result, state) } @@ -164,7 +164,7 @@ class ShowDetailsStateMachine( } private fun updateSeasonDetailsState( - response: Either>, + response: Either>, state: State, ) = when (response) { is Either.Left -> { @@ -193,7 +193,7 @@ class ShowDetailsStateMachine( private suspend fun fetchShowDetails(state: State): ChangedState { val show = discoverRepository.getShowById(traktShowId) val similar = similarShowsRepository.fetchSimilarShows(traktShowId) - val season = seasonsRepository.getSeasons(traktShowId) + val season = seasonsRepository.fetchSeasonsByShowId(traktShowId) val trailers = trailerRepository.fetchTrailersByShowId(traktShowId) return state.mutate { diff --git a/presentation/show-details/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/MockData.kt b/presentation/show-details/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/MockData.kt index 3bfc907d3..45434eabd 100644 --- a/presentation/show-details/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/MockData.kt +++ b/presentation/show-details/src/commonTest/kotlin/com/thomaskioko/tvmaniac/presentation/showdetails/MockData.kt @@ -1,11 +1,12 @@ package com.thomaskioko.tvmaniac.presentation.showdetails +import com.thomaskioko.tvmaniac.core.db.SeasonsByShowId import com.thomaskioko.tvmaniac.core.db.ShowById import com.thomaskioko.tvmaniac.core.db.SimilarShows +import com.thomaskioko.tvmaniac.db.Id import com.thomaskioko.tvmaniac.presentation.showdetails.model.Season import com.thomaskioko.tvmaniac.presentation.showdetails.model.Show import com.thomaskioko.tvmaniac.presentation.showdetails.model.Trailer -import com.thomaskioko.tvmaniac.core.db.Seasons as SeasonCache val show = Show( traktId = 84958, @@ -98,7 +99,7 @@ val similarShowLoaded = ShowDetailsLoaded.SimilarShowsContent( ) val selectedShow = ShowById( - trakt_id = 84958, + id = Id(84958), tmdb_id = 849583, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -117,15 +118,11 @@ val selectedShow = ShowById( poster_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", backdrop_url = "/kEl2t3OhXc3Zb9FBh1AuYzRTgZp.jpg", aired_episodes = 12, - trakt_id_ = 1234, - id = 12345, - created_at = null, - synced = false, - tmdb_id_ = 1232, + in_watchlist = 0, ) val similarShowResult = listOf( SimilarShows( - trakt_id = 184958, + id = Id(184958), tmdb_id = 284958, title = "Loki", overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + @@ -147,17 +144,10 @@ val similarShowResult = listOf( ) val seasons = listOf( - SeasonCache( - id = 84958, - show_trakt_id = 114355, - name = "Season 1", - episode_count = 10, + SeasonsByShowId( + season_id = Id(84958), + show_id = Id(114355), + season_title = "Season 1", season_number = 1, - overview = "After stealing the Tesseract during the events of “Avengers: Endgame,” " + - "an alternate version of Loki is brought to the mysterious Time Variance " + - "Authority, a bureaucratic organization that exists outside of time and " + - "space and monitors the timeline. They give Loki a choice: face being " + - "erased from existence due to being a “time variant”or help fix " + - "the timeline and stop a greater threat.", ), ) diff --git a/presentation/trailers/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/trailers/Mapper.kt b/presentation/trailers/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/trailers/Mapper.kt index c9dd76c40..8caf14feb 100644 --- a/presentation/trailers/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/trailers/Mapper.kt +++ b/presentation/trailers/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/trailers/Mapper.kt @@ -6,7 +6,7 @@ import com.thomaskioko.tvmaniac.presentation.trailers.model.Trailer internal fun List.toTrailerList(): List { return map { Trailer( - showId = it.trakt_id, + showId = it.show_id.id, key = it.key, name = it.name, youtubeThumbnailUrl = "https://i.ytimg.com/vi/${it.key}/hqdefault.jpg", diff --git a/presentation/watchlist/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/watchlist/Mapper.kt b/presentation/watchlist/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/watchlist/Mapper.kt index ac40e560b..82334b07f 100644 --- a/presentation/watchlist/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/watchlist/Mapper.kt +++ b/presentation/watchlist/src/commonMain/kotlin/com/thomaskioko/tvmaniac/presentation/watchlist/Mapper.kt @@ -1,11 +1,11 @@ package com.thomaskioko.tvmaniac.presentation.watchlist -import com.thomaskioko.tvmaniac.core.db.SelectWatchlist +import com.thomaskioko.tvmaniac.core.db.WatchedShow -fun List?.entityToWatchlist(): List { +fun List?.entityToWatchlist(): List { return this?.map { WatchlistItem( - traktId = it.id, + traktId = it.show_id.id, tmdbId = it.tmdb_id, title = it.title, posterImageUrl = it.poster_url, diff --git a/presentation/watchlist/src/commonTest/kotlin/com/thomaskioko/tvmaniac/domain/watchlist/WatchlistStateMachineTest.kt b/presentation/watchlist/src/commonTest/kotlin/com/thomaskioko/tvmaniac/domain/watchlist/WatchlistStateMachineTest.kt index 8d12a4f30..9ed148f15 100644 --- a/presentation/watchlist/src/commonTest/kotlin/com/thomaskioko/tvmaniac/domain/watchlist/WatchlistStateMachineTest.kt +++ b/presentation/watchlist/src/commonTest/kotlin/com/thomaskioko/tvmaniac/domain/watchlist/WatchlistStateMachineTest.kt @@ -1,7 +1,6 @@ package com.thomaskioko.tvmaniac.domain.watchlist import app.cash.turbine.test -import com.thomaskioko.tvmaniac.core.networkutil.Either import com.thomaskioko.tvmaniac.presentation.watchlist.LoadingShows import com.thomaskioko.tvmaniac.presentation.watchlist.WatchlistContent import com.thomaskioko.tvmaniac.presentation.watchlist.WatchlistStateMachine @@ -18,7 +17,7 @@ class WatchlistStateMachineTest { @Test fun initial_state_emits_expected_result() = runTest { - repository.setFollowedResult(Either.Right(data = watchlistResult)) + repository.setFollowedResult(watchlistResult) stateMachine.state.test { awaitItem() shouldBe LoadingShows