From f54d0fd8a009bbf926ba66b8e13852e2ffe20a7d Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 10 Jan 2025 15:19:45 +0100 Subject: [PATCH] refactor: bind subscriptions and feed repositories to interfaces --- .../libretube/api/SubscriptionHelper.kt | 105 ++++-------------- .../repo/AccountSubscriptionsRepository.kt | 36 ++++++ .../github/libretube/repo/FeedRepository.kt | 7 ++ .../repo/LocalSubscriptionsRepository.kt | 39 +++++++ .../repo/PipedAccountFeedRepository.kt | 13 +++ .../repo/PipedNoAccountFeedRepository.kt | 23 ++++ .../libretube/repo/SubscriptionsRepository.kt | 11 ++ 7 files changed, 150 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/repo/AccountSubscriptionsRepository.kt create mode 100644 app/src/main/java/com/github/libretube/repo/FeedRepository.kt create mode 100644 app/src/main/java/com/github/libretube/repo/LocalSubscriptionsRepository.kt create mode 100644 app/src/main/java/com/github/libretube/repo/PipedAccountFeedRepository.kt create mode 100644 app/src/main/java/com/github/libretube/repo/PipedNoAccountFeedRepository.kt create mode 100644 app/src/main/java/com/github/libretube/repo/SubscriptionsRepository.kt diff --git a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt index 199c50d5d..15d142ca8 100644 --- a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt +++ b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt @@ -1,16 +1,15 @@ package com.github.libretube.api import android.content.Context -import android.util.Log import com.github.libretube.R -import com.github.libretube.api.obj.StreamItem -import com.github.libretube.api.obj.Subscribe -import com.github.libretube.api.obj.Subscription import com.github.libretube.constants.PreferenceKeys -import com.github.libretube.db.DatabaseHolder.Database -import com.github.libretube.db.obj.LocalSubscription -import com.github.libretube.extensions.TAG import com.github.libretube.helpers.PreferenceHelper +import com.github.libretube.repo.AccountSubscriptionsRepository +import com.github.libretube.repo.FeedRepository +import com.github.libretube.repo.LocalSubscriptionsRepository +import com.github.libretube.repo.PipedAccountFeedRepository +import com.github.libretube.repo.PipedNoAccountFeedRepository +import com.github.libretube.repo.SubscriptionsRepository import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.runBlocking @@ -19,28 +18,24 @@ object SubscriptionHelper { * The maximum number of channel IDs that can be passed via a GET request for fetching * the subscriptions list and the feed */ - private const val GET_SUBSCRIPTIONS_LIMIT = 100 + const val GET_SUBSCRIPTIONS_LIMIT = 100 + private val token get() = PreferenceHelper.getToken() - - suspend fun subscribe(channelId: String) { - if (token.isNotEmpty()) { - runCatching { - RetrofitInstance.authApi.subscribe(token, Subscribe(channelId)) - } - } else { - Database.localSubscriptionDao().insert(LocalSubscription(channelId)) - } + private val subscriptionsRepository: SubscriptionsRepository get() = when { + token.isNotEmpty() -> AccountSubscriptionsRepository() + else -> LocalSubscriptionsRepository() + } + private val feedRepository: FeedRepository get() = when { + token.isNotEmpty() -> PipedAccountFeedRepository() + else -> PipedNoAccountFeedRepository() } - suspend fun unsubscribe(channelId: String) { - if (token.isNotEmpty()) { - runCatching { - RetrofitInstance.authApi.unsubscribe(token, Subscribe(channelId)) - } - } else { - Database.localSubscriptionDao().delete(LocalSubscription(channelId)) - } - } + suspend fun subscribe(channelId: String) = subscriptionsRepository.subscribe(channelId) + suspend fun unsubscribe(channelId: String) = subscriptionsRepository.unsubscribe(channelId) + suspend fun isSubscribed(channelId: String) = subscriptionsRepository.isSubscribed(channelId) + suspend fun importSubscriptions(newChannels: List) = subscriptionsRepository.importSubscriptions(newChannels) + suspend fun getSubscriptions() = subscriptionsRepository.getSubscriptions() + suspend fun getFeed() = feedRepository.getFeed(false) fun handleUnsubscribe( context: Context, @@ -68,62 +63,4 @@ object SubscriptionHelper { .setNegativeButton(R.string.cancel, null) .show() } - - suspend fun isSubscribed(channelId: String): Boolean? { - if (token.isNotEmpty()) { - val isSubscribed = try { - RetrofitInstance.authApi.isSubscribed(channelId, token) - } catch (e: Exception) { - Log.e(TAG(), e.toString()) - return null - } - return isSubscribed.subscribed - } else { - return Database.localSubscriptionDao().includes(channelId) - } - } - - suspend fun importSubscriptions(newChannels: List) { - if (token.isNotEmpty()) { - runCatching { - RetrofitInstance.authApi.importSubscriptions(false, token, newChannels) - } - } else { - Database.localSubscriptionDao().insertAll(newChannels.map { LocalSubscription(it) }) - } - } - - suspend fun getSubscriptions(): List { - return if (token.isNotEmpty()) { - RetrofitInstance.authApi.subscriptions(token) - } else { - val subscriptions = Database.localSubscriptionDao().getAll().map { it.channelId } - when { - subscriptions.size > GET_SUBSCRIPTIONS_LIMIT -> - RetrofitInstance.authApi - .unauthenticatedSubscriptions(subscriptions) - - else -> RetrofitInstance.authApi.unauthenticatedSubscriptions( - subscriptions.joinToString(",") - ) - } - } - } - - suspend fun getFeed(): List { - return if (token.isNotEmpty()) { - RetrofitInstance.authApi.getFeed(token) - } else { - val subscriptions = Database.localSubscriptionDao().getAll().map { it.channelId } - when { - subscriptions.size > GET_SUBSCRIPTIONS_LIMIT -> - RetrofitInstance.authApi - .getUnauthenticatedFeed(subscriptions) - - else -> RetrofitInstance.authApi.getUnauthenticatedFeed( - subscriptions.joinToString(",") - ) - } - } - } } diff --git a/app/src/main/java/com/github/libretube/repo/AccountSubscriptionsRepository.kt b/app/src/main/java/com/github/libretube/repo/AccountSubscriptionsRepository.kt new file mode 100644 index 000000000..f9264665b --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/AccountSubscriptionsRepository.kt @@ -0,0 +1,36 @@ +package com.github.libretube.repo + +import com.github.libretube.api.RetrofitInstance +import com.github.libretube.api.obj.Subscribe +import com.github.libretube.api.obj.Subscription +import com.github.libretube.helpers.PreferenceHelper + +class AccountSubscriptionsRepository: SubscriptionsRepository { + private val token get() = PreferenceHelper.getToken() + + override suspend fun subscribe(channelId: String) { + runCatching { + RetrofitInstance.authApi.subscribe(token, Subscribe(channelId)) + } + } + + override suspend fun unsubscribe(channelId: String) { + runCatching { + RetrofitInstance.authApi.unsubscribe(token, Subscribe(channelId)) + } + } + + override suspend fun isSubscribed(channelId: String): Boolean? { + return runCatching { + RetrofitInstance.authApi.isSubscribed(channelId, token) + }.getOrNull()?.subscribed + } + + override suspend fun importSubscriptions(newChannels: List) { + RetrofitInstance.authApi.importSubscriptions(false, token, newChannels) + } + + override suspend fun getSubscriptions(): List { + return RetrofitInstance.authApi.subscriptions(token) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/FeedRepository.kt b/app/src/main/java/com/github/libretube/repo/FeedRepository.kt new file mode 100644 index 000000000..d679a7b5a --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/FeedRepository.kt @@ -0,0 +1,7 @@ +package com.github.libretube.repo + +import com.github.libretube.api.obj.StreamItem + +interface FeedRepository { + suspend fun getFeed(forceRefresh: Boolean): List +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/LocalSubscriptionsRepository.kt b/app/src/main/java/com/github/libretube/repo/LocalSubscriptionsRepository.kt new file mode 100644 index 000000000..93cf8bd08 --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/LocalSubscriptionsRepository.kt @@ -0,0 +1,39 @@ +package com.github.libretube.repo + +import com.github.libretube.api.RetrofitInstance +import com.github.libretube.api.SubscriptionHelper.GET_SUBSCRIPTIONS_LIMIT +import com.github.libretube.api.obj.Subscription +import com.github.libretube.db.DatabaseHolder.Database +import com.github.libretube.db.obj.LocalSubscription + +class LocalSubscriptionsRepository: SubscriptionsRepository { + override suspend fun subscribe(channelId: String) { + Database.localSubscriptionDao().insert(LocalSubscription(channelId)) + } + + override suspend fun unsubscribe(channelId: String) { + Database.localSubscriptionDao().delete(LocalSubscription(channelId)) + } + + override suspend fun isSubscribed(channelId: String): Boolean { + return Database.localSubscriptionDao().includes(channelId) + } + + override suspend fun importSubscriptions(newChannels: List) { + Database.localSubscriptionDao().insertAll(newChannels.map { LocalSubscription(it) }) + } + + override suspend fun getSubscriptions(): List { + val subscriptions = Database.localSubscriptionDao().getAll().map { it.channelId } + + return when { + subscriptions.size > GET_SUBSCRIPTIONS_LIMIT -> + RetrofitInstance.authApi + .unauthenticatedSubscriptions(subscriptions) + + else -> RetrofitInstance.authApi.unauthenticatedSubscriptions( + subscriptions.joinToString(",") + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/PipedAccountFeedRepository.kt b/app/src/main/java/com/github/libretube/repo/PipedAccountFeedRepository.kt new file mode 100644 index 000000000..94cd28c7f --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/PipedAccountFeedRepository.kt @@ -0,0 +1,13 @@ +package com.github.libretube.repo + +import com.github.libretube.api.RetrofitInstance +import com.github.libretube.api.obj.StreamItem +import com.github.libretube.helpers.PreferenceHelper + +class PipedAccountFeedRepository: FeedRepository { + override suspend fun getFeed(forceRefresh: Boolean): List { + val token = PreferenceHelper.getToken() + + return RetrofitInstance.authApi.getFeed(token) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/PipedNoAccountFeedRepository.kt b/app/src/main/java/com/github/libretube/repo/PipedNoAccountFeedRepository.kt new file mode 100644 index 000000000..153636cfc --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/PipedNoAccountFeedRepository.kt @@ -0,0 +1,23 @@ +package com.github.libretube.repo + +import com.github.libretube.api.RetrofitInstance +import com.github.libretube.api.SubscriptionHelper +import com.github.libretube.api.SubscriptionHelper.GET_SUBSCRIPTIONS_LIMIT +import com.github.libretube.api.obj.StreamItem +import com.github.libretube.extensions.toID + +class PipedNoAccountFeedRepository: FeedRepository { + override suspend fun getFeed(forceRefresh: Boolean): List { + val subscriptions = SubscriptionHelper.getSubscriptions().map { it.url.toID() } + + return when { + subscriptions.size > GET_SUBSCRIPTIONS_LIMIT -> + RetrofitInstance.authApi + .getUnauthenticatedFeed(subscriptions) + + else -> RetrofitInstance.authApi.getUnauthenticatedFeed( + subscriptions.joinToString(",") + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/SubscriptionsRepository.kt b/app/src/main/java/com/github/libretube/repo/SubscriptionsRepository.kt new file mode 100644 index 000000000..4138b6c81 --- /dev/null +++ b/app/src/main/java/com/github/libretube/repo/SubscriptionsRepository.kt @@ -0,0 +1,11 @@ +package com.github.libretube.repo + +import com.github.libretube.api.obj.Subscription + +interface SubscriptionsRepository { + suspend fun subscribe(channelId: String) + suspend fun unsubscribe(channelId: String) + suspend fun isSubscribed(channelId: String): Boolean? + suspend fun importSubscriptions(newChannels: List) + suspend fun getSubscriptions(): List +} \ No newline at end of file