diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 08a38591..46c416a4 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -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) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt index 79909258..74172cca 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt @@ -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, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt index 772fe537..8bed1f92 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt @@ -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>() - .map { result -> result.value.toDbModel() } + .map { result -> result.value.toSavedPost() } .let { savedPostsRepository.savePosts(it) } return Result.success() } diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/ext.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/ext.kt deleted file mode 100644 index f6b8c5b2..00000000 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/ext.kt +++ /dev/null @@ -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, - ) -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cf1f1fb5..9c706798 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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" diff --git a/model/build.gradle.kts b/model/build.gradle.kts index 84ac8123..d476effe 100644 --- a/model/build.gradle.kts +++ b/model/build.gradle.kts @@ -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) +} diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPost.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPost.kt index f43b461c..1a1a85b0 100644 --- a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPost.kt +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPost.kt @@ -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, diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt index efd8b5df..4b13cbda 100644 --- a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt @@ -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,