mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 16:27:06 +05:30
refactor(model): use Konvert to automatically generate mappings
This commit is contained in:
parent
d4672ae8bd
commit
25382acf0e
8 changed files with 57 additions and 47 deletions
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue