mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
refactor(extension/repo): Refactor the ExtensionRepoService to use DTOs
Co-authored-by: MajorTanya <39014446+MajorTanya@users.noreply.github.com>
This commit is contained in:
parent
c7405e0b33
commit
da99cf5cfa
10 changed files with 43 additions and 61 deletions
|
@ -1,6 +0,0 @@
|
|||
package yokai.domain.extension.repo.exception
|
||||
|
||||
import java.io.IOException
|
||||
|
||||
class FetchExtensionRepoException(throwable: Throwable) :
|
||||
IOException("Failed to retrieve Extension Repo Details", throwable)
|
|
@ -5,7 +5,6 @@ import eu.kanade.tachiyomi.network.NetworkHelper
|
|||
import okhttp3.OkHttpClient
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import yokai.domain.extension.repo.ExtensionRepoRepository
|
||||
import yokai.domain.extension.repo.exception.FetchExtensionRepoException
|
||||
import yokai.domain.extension.repo.exception.SaveExtensionRepoException
|
||||
import yokai.domain.extension.repo.model.ExtensionRepo
|
||||
import yokai.domain.extension.repo.service.ExtensionRepoService
|
||||
|
@ -28,11 +27,7 @@ class CreateExtensionRepo(
|
|||
}
|
||||
|
||||
val baseUrl = repoUrl.removeSuffix("/index.min.json")
|
||||
return try {
|
||||
extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl
|
||||
} catch (e: FetchExtensionRepoException) {
|
||||
Result.RepoFetchFailed
|
||||
}
|
||||
return extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl
|
||||
}
|
||||
|
||||
private suspend fun insert(repo: ExtensionRepo): Result {
|
||||
|
@ -79,7 +74,6 @@ class CreateExtensionRepo(
|
|||
data class DuplicateFingerprint(val oldRepo: ExtensionRepo, val newRepo: ExtensionRepo) : Result
|
||||
data object InvalidUrl : Result
|
||||
data object RepoAlreadyExists : Result
|
||||
data object RepoFetchFailed : Result
|
||||
data object Success : Result
|
||||
data object Error : Result
|
||||
}
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
package yokai.domain.extension.repo.interactor
|
||||
|
||||
import co.touchlab.kermit.Logger
|
||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import yokai.domain.extension.repo.ExtensionRepoRepository
|
||||
import yokai.domain.extension.repo.exception.FetchExtensionRepoException
|
||||
import yokai.domain.extension.repo.model.ExtensionRepo
|
||||
import yokai.domain.extension.repo.service.ExtensionRepoService
|
||||
|
||||
|
@ -23,18 +21,7 @@ class UpdateExtensionRepo(
|
|||
}
|
||||
|
||||
suspend fun await(repo: ExtensionRepo) {
|
||||
val newRepo = try {
|
||||
extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return
|
||||
} catch (e: Exception) {
|
||||
when (e) {
|
||||
is FetchExtensionRepoException -> {
|
||||
// TODO: A way to show user that a repo failed to update
|
||||
Logger.e(e) { "Failed to fetch repo details" }
|
||||
return
|
||||
}
|
||||
else -> throw e
|
||||
}
|
||||
}
|
||||
val newRepo = extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return
|
||||
if (
|
||||
repo.signingKeyFingerprint.startsWith("NOFINGERPRINT") ||
|
||||
repo.signingKeyFingerprint == newRepo.signingKeyFingerprint
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
package yokai.domain.extension.repo.model
|
||||
|
||||
data class ExtensionRepo(
|
||||
val baseUrl: String,
|
||||
val name: String,
|
||||
val shortName: String?,
|
||||
val website: String,
|
||||
val signingKeyFingerprint: String,
|
||||
)
|
|
@ -1,20 +1,15 @@
|
|||
package yokai.domain.extension.repo.service
|
||||
|
||||
import androidx.core.net.toUri
|
||||
import co.touchlab.kermit.Logger
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.HttpException
|
||||
import eu.kanade.tachiyomi.network.awaitSuccess
|
||||
import eu.kanade.tachiyomi.network.parseAs
|
||||
import eu.kanade.tachiyomi.util.system.withIOContext
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonObject
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
import okhttp3.OkHttpClient
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import yokai.domain.extension.repo.exception.FetchExtensionRepoException
|
||||
import yokai.domain.extension.repo.model.ExtensionRepo
|
||||
import java.net.UnknownHostException
|
||||
|
||||
class ExtensionRepoService(
|
||||
private val client: OkHttpClient,
|
||||
|
@ -29,35 +24,16 @@ class ExtensionRepoService(
|
|||
val url = "$repo/repo.json".toUri()
|
||||
|
||||
try {
|
||||
val response = with(json) {
|
||||
with(json) {
|
||||
client.newCall(GET(url.toString()))
|
||||
.awaitSuccess()
|
||||
.parseAs<JsonObject>()
|
||||
.parseAs<ExtensionRepoMetaDto>()
|
||||
.toExtensionRepo(baseUrl = repo)
|
||||
}
|
||||
response["meta"]
|
||||
?.jsonObject
|
||||
?.let { jsonToExtensionRepo(baseUrl = repo, it) }
|
||||
} catch (e: Exception) {
|
||||
when (e) {
|
||||
is HttpException -> null
|
||||
is UnknownHostException -> throw FetchExtensionRepoException(e)
|
||||
else -> throw e
|
||||
}
|
||||
Logger.e(e) { "Failed to fetch repo details" }
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun jsonToExtensionRepo(baseUrl: String, obj: JsonObject): ExtensionRepo? {
|
||||
return try {
|
||||
ExtensionRepo(
|
||||
baseUrl = baseUrl,
|
||||
name = obj["name"]!!.jsonPrimitive.content,
|
||||
shortName = obj["shortName"]?.jsonPrimitive?.content,
|
||||
website = obj["website"]!!.jsonPrimitive.content,
|
||||
signingKeyFingerprint = obj["signingKeyFingerprint"]!!.jsonPrimitive.content,
|
||||
)
|
||||
} catch (_: NullPointerException) {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,6 @@ class ExtensionRepoViewModel :
|
|||
is CreateExtensionRepo.Result.Success -> internalEvent.value = ExtensionRepoEvent.Success
|
||||
is CreateExtensionRepo.Result.Error -> internalEvent.value = ExtensionRepoEvent.InvalidUrl
|
||||
is CreateExtensionRepo.Result.RepoAlreadyExists -> internalEvent.value = ExtensionRepoEvent.RepoAlreadyExists
|
||||
is CreateExtensionRepo.Result.RepoFetchFailed -> internalEvent.value = ExtensionRepoEvent.RepoFetchFailed
|
||||
is CreateExtensionRepo.Result.DuplicateFingerprint -> {
|
||||
internalEvent.value = ExtensionRepoEvent.ShowDialog(RepoDialog.Conflict(result.oldRepo, result.newRepo))
|
||||
}
|
||||
|
@ -94,7 +93,6 @@ sealed class ExtensionRepoEvent {
|
|||
sealed class LocalizedMessage(val stringRes: StringResource) : ExtensionRepoEvent()
|
||||
data object InvalidUrl : LocalizedMessage(MR.strings.invalid_repo_url)
|
||||
data object RepoAlreadyExists : LocalizedMessage(MR.strings.repo_already_exists)
|
||||
data object RepoFetchFailed : LocalizedMessage(MR.strings.repo_fetch_failed)
|
||||
data class ShowDialog(val dialog: RepoDialog) : ExtensionRepoEvent()
|
||||
data object NoOp : ExtensionRepoEvent()
|
||||
data object Success : ExtensionRepoEvent()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue