Refactor the ExtensionRepoService to use DTOs (#573)

* Refactor the ExtensionRepoService to use DTOs

Slightly refactored the `ExtensionRepoService` so it uses a DTO with
`parseAs` to avoid parsing the JSON response by hand.

The default Json instance Injekt provides here has
`ignoreUnknownKeys` enabled, so the `ExtensionRepoMetaDto` only
specifies the meta key of the response content.

The extension function `toExtensionRepo` allows for mapping the new
DTO to the `domain` `ExtensionRepo` data class.

* Implement feedback

- Removed SerialName of the ExtensionRepoMetaDto property and renamed
it `meta`, same as the incoming attribute.
- Added a more general catch clause that also logs the occurring
Exception

Detekt likes to complain about TooGenericExceptionCaught, hence the
Suppress annotation on the function.
This commit is contained in:
MajorTanya 2024-03-23 16:03:44 +01:00 committed by GitHub
parent 9672ea8b1b
commit 8c437ceecf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 24 deletions

View file

@ -0,0 +1,27 @@
package mihon.domain.extensionrepo.service
import kotlinx.serialization.Serializable
import mihon.domain.extensionrepo.model.ExtensionRepo
@Serializable
data class ExtensionRepoMetaDto(
val meta: ExtensionRepoDto,
)
@Serializable
data class ExtensionRepoDto(
val name: String,
val shortName: String?,
val website: String,
val signingKeyFingerprint: String,
)
fun ExtensionRepoMetaDto.toExtensionRepo(baseUrl: String): ExtensionRepo {
return ExtensionRepo(
baseUrl = baseUrl,
name = meta.name,
shortName = meta.shortName,
website = meta.website,
signingKeyFingerprint = meta.signingKeyFingerprint,
)
}

View file

@ -2,16 +2,14 @@ package mihon.domain.extensionrepo.service
import androidx.core.net.toUri import androidx.core.net.toUri
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.HttpException
import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs import eu.kanade.tachiyomi.network.parseAs
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject import logcat.LogPriority
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import mihon.domain.extensionrepo.model.ExtensionRepo import mihon.domain.extensionrepo.model.ExtensionRepo
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withIOContext
import tachiyomi.core.common.util.system.logcat
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class ExtensionRepoService( class ExtensionRepoService(
@ -20,6 +18,7 @@ class ExtensionRepoService(
private val json: Json by injectLazy() private val json: Json by injectLazy()
@Suppress("TooGenericExceptionCaught")
suspend fun fetchRepoDetails( suspend fun fetchRepoDetails(
repo: String, repo: String,
): ExtensionRepo? { ): ExtensionRepo? {
@ -27,31 +26,16 @@ class ExtensionRepoService(
val url = "$repo/repo.json".toUri() val url = "$repo/repo.json".toUri()
try { try {
val response = with(json) { with(json) {
client.newCall(GET(url.toString())) client.newCall(GET(url.toString()))
.awaitSuccess() .awaitSuccess()
.parseAs<JsonObject>() .parseAs<ExtensionRepoMetaDto>()
.toExtensionRepo(baseUrl = repo)
} }
response["meta"] } catch (e: Exception) {
?.jsonObject logcat(LogPriority.ERROR, e) { "Failed to fetch repo details" }
?.let { jsonToExtensionRepo(baseUrl = repo, it) }
} catch (_: HttpException) {
null 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
}
}
} }