refactor(model): use Konvert to automatically generate mappings

This commit is contained in:
Harsh Shandilya 2023-09-09 13:31:19 +05:30
parent d4672ae8bd
commit 25382acf0e
No known key found for this signature in database
8 changed files with 57 additions and 47 deletions

View file

@ -21,6 +21,7 @@ plugins {
alias(libs.plugins.baselineprofile)
alias(libs.plugins.licensee)
alias(libs.plugins.tracelog)
alias(libs.plugins.ksp)
}
android {
@ -81,6 +82,7 @@ dependencies {
implementation(libs.copydown)
implementation(libs.dagger)
implementation(libs.jsoup)
implementation(libs.konvert.api)
implementation(libs.kotlinx.collections.immutable)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.napier)
@ -94,6 +96,7 @@ dependencies {
implementation(projects.model)
kapt(libs.dagger.compiler)
ksp(libs.konvert.processor)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.okhttp.mockwebserver)

View file

@ -30,11 +30,11 @@ import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.itemContentType
import androidx.paging.compose.itemKey
import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.posts.toDbModel
import dev.msfjarvis.claw.common.ui.NetworkError
import dev.msfjarvis.claw.common.ui.ProgressBar
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost
import dev.msfjarvis.claw.model.toSavedPost
@OptIn(ExperimentalMaterialApi::class)
@Composable
@ -68,7 +68,7 @@ fun NetworkPosts(
) { index ->
val item = lazyPagingItems[index]
if (item != null) {
val dbModel = item.toDbModel()
val dbModel = item.toSavedPost()
ListItem(
item = dbModel,
isSaved = isPostSaved,

View file

@ -15,8 +15,8 @@ import com.slack.eithernet.ApiResult.Success
import com.squareup.anvil.annotations.optional.ForScope
import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository
import dev.msfjarvis.claw.api.LobstersApi
import dev.msfjarvis.claw.common.posts.toDbModel
import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.toSavedPost
import javax.inject.Inject
import kotlinx.coroutines.flow.first
@ -40,7 +40,7 @@ constructor(
.first()
.map { post -> lobstersApi.getPostDetails(post.shortId) }
.filterIsInstance<Success<LobstersPostDetails>>()
.map { result -> result.value.toDbModel() }
.map { result -> result.value.toSavedPost() }
.let { savedPostsRepository.savePosts(it) }
return Result.success()
}

View file

@ -1,41 +0,0 @@
/*
* Copyright © 2021-2022 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.common.posts
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost
import dev.msfjarvis.claw.model.LobstersPostDetails
fun LobstersPost.toDbModel(): SavedPost {
return SavedPost(
shortId = shortId,
title = title,
url = url,
createdAt = createdAt,
commentCount = commentCount,
commentsUrl = commentsUrl,
submitterName = submitter.username,
submitterAvatarUrl = submitter.avatarUrl,
tags = tags,
description = description,
)
}
fun LobstersPostDetails.toDbModel(): SavedPost {
return SavedPost(
shortId = shortId,
title = title,
url = url,
createdAt = createdAt,
commentCount = commentCount,
commentsUrl = commentsUrl,
submitterName = submitter.username,
submitterAvatarUrl = submitter.avatarUrl,
tags = tags,
description = description,
)
}

View file

@ -7,6 +7,7 @@ composeCompiler = "1.5.3-dev-k1.9.10-593b4c95fce"
coroutines = "1.7.3"
dagger = "2.48"
junit = "5.10.0"
konvert = "2.2.0"
kotlin = "1.9.10"
retrofit = "2.9.0"
richtext = "0.17.0"
@ -68,6 +69,8 @@ jsoup = "org.jsoup:jsoup:1.16.1"
junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-legacy = "junit:junit:4.13.2"
konvert-api = { module = "io.mcarle:konvert-api", version.ref = "konvert" }
konvert-processor = { module = "io.mcarle:konvert", version.ref = "konvert" }
kotlinx-collections-immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5"
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
@ -97,6 +100,7 @@ android-test = { id = "com.android.test", version.ref = "agp" }
anvil = "com.squareup.anvil:2.4.8"
baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = "com.google.devtools.ksp:1.9.10-1.0.13"
licensee = "app.cash.licensee:1.7.0"
modulegraph = "dev.iurysouza.modulegraph:0.4.0"
modulegraphassert = "com.jraska.module.graph.assertion:2.5.0"

View file

@ -5,9 +5,19 @@
* https://opensource.org/licenses/MIT.
*/
plugins {
id("dev.msfjarvis.claw.kotlin-jvm")
id("dev.msfjarvis.claw.android-library")
id("dev.msfjarvis.claw.kotlin-android")
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.poko)
alias(libs.plugins.ksp)
}
dependencies { implementation(libs.kotlinx.serialization.core) }
android { namespace = "dev.msfjarvis.claw.model" }
dependencies {
implementation(libs.kotlinx.serialization.core)
implementation(libs.konvert.api)
implementation(projects.database)
ksp(libs.konvert.processor)
}

View file

@ -9,11 +9,28 @@
package dev.msfjarvis.claw.model
import dev.drewhamilton.poko.Poko
import dev.msfjarvis.claw.database.local.SavedPost
import io.mcarle.konvert.api.KonvertTo
import io.mcarle.konvert.api.Mapping
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@Poko
@KonvertTo(
value = SavedPost::class,
mappings =
[
Mapping(
target = "submitterName",
expression = "it.submitter.username",
),
Mapping(
target = "submitterAvatarUrl",
expression = "it.submitter.avatarUrl",
),
],
)
class LobstersPost(
val shortId: String,
val createdAt: String,

View file

@ -9,11 +9,28 @@
package dev.msfjarvis.claw.model
import dev.drewhamilton.poko.Poko
import dev.msfjarvis.claw.database.local.SavedPost
import io.mcarle.konvert.api.KonvertTo
import io.mcarle.konvert.api.Mapping
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@Poko
@KonvertTo(
value = SavedPost::class,
mappings =
[
Mapping(
target = "submitterName",
expression = "it.submitter.username",
),
Mapping(
target = "submitterAvatarUrl",
expression = "it.submitter.avatarUrl",
),
],
)
class LobstersPostDetails(
val shortId: String,
val createdAt: String,