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

View file

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

View file

@ -15,8 +15,8 @@ import com.slack.eithernet.ApiResult.Success
import com.squareup.anvil.annotations.optional.ForScope import com.squareup.anvil.annotations.optional.ForScope
import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository
import dev.msfjarvis.claw.api.LobstersApi import dev.msfjarvis.claw.api.LobstersApi
import dev.msfjarvis.claw.common.posts.toDbModel
import dev.msfjarvis.claw.model.LobstersPostDetails import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.toSavedPost
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
@ -40,7 +40,7 @@ constructor(
.first() .first()
.map { post -> lobstersApi.getPostDetails(post.shortId) } .map { post -> lobstersApi.getPostDetails(post.shortId) }
.filterIsInstance<Success<LobstersPostDetails>>() .filterIsInstance<Success<LobstersPostDetails>>()
.map { result -> result.value.toDbModel() } .map { result -> result.value.toSavedPost() }
.let { savedPostsRepository.savePosts(it) } .let { savedPostsRepository.savePosts(it) }
return Result.success() 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" coroutines = "1.7.3"
dagger = "2.48" dagger = "2.48"
junit = "5.10.0" junit = "5.10.0"
konvert = "2.2.0"
kotlin = "1.9.10" kotlin = "1.9.10"
retrofit = "2.9.0" retrofit = "2.9.0"
richtext = "0.17.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-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-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-legacy = "junit:junit:4.13.2" 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-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-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", 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" anvil = "com.squareup.anvil:2.4.8"
baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" } baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } 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" licensee = "app.cash.licensee:1.7.0"
modulegraph = "dev.iurysouza.modulegraph:0.4.0" modulegraph = "dev.iurysouza.modulegraph:0.4.0"
modulegraphassert = "com.jraska.module.graph.assertion:2.5.0" modulegraphassert = "com.jraska.module.graph.assertion:2.5.0"

View file

@ -5,9 +5,19 @@
* https://opensource.org/licenses/MIT. * https://opensource.org/licenses/MIT.
*/ */
plugins { 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.kotlin.serialization)
alias(libs.plugins.poko) 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 package dev.msfjarvis.claw.model
import dev.drewhamilton.poko.Poko 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.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@Poko @Poko
@KonvertTo(
value = SavedPost::class,
mappings =
[
Mapping(
target = "submitterName",
expression = "it.submitter.username",
),
Mapping(
target = "submitterAvatarUrl",
expression = "it.submitter.avatarUrl",
),
],
)
class LobstersPost( class LobstersPost(
val shortId: String, val shortId: String,
val createdAt: String, val createdAt: String,

View file

@ -9,11 +9,28 @@
package dev.msfjarvis.claw.model package dev.msfjarvis.claw.model
import dev.drewhamilton.poko.Poko 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.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@Poko @Poko
@KonvertTo(
value = SavedPost::class,
mappings =
[
Mapping(
target = "submitterName",
expression = "it.submitter.username",
),
Mapping(
target = "submitterAvatarUrl",
expression = "it.submitter.avatarUrl",
),
],
)
class LobstersPostDetails( class LobstersPostDetails(
val shortId: String, val shortId: String,
val createdAt: String, val createdAt: String,