mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 22:17:03 +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.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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
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"
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue