From 1ae0cbb95d8f33510e22654dba7cdaf6e4fa62c9 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 11 Jan 2023 03:04:23 +0530 Subject: [PATCH] feat(database): add a table for post comments --- .../claw/database/injection/DatabaseModule.kt | 11 ++-- .../msfjarvis/claw/database/local/Database.kt | 20 -------- .../model/{TagsAdapter.kt => CSVAdapter.kt} | 4 +- database/src/main/sqldelight/databases/1.db | Bin 16384 -> 24576 bytes .../claw/database/local/PostComments.sq | 17 +++++++ .../database/local/PostCommentsQueriesTest.kt | 47 ++++++++++++++++++ .../database/local/SavedPostQueriesTest.kt | 5 +- 7 files changed, 77 insertions(+), 27 deletions(-) delete mode 100644 database/src/main/kotlin/dev/msfjarvis/claw/database/local/Database.kt rename database/src/main/kotlin/dev/msfjarvis/claw/database/model/{TagsAdapter.kt => CSVAdapter.kt} (83%) create mode 100644 database/src/main/sqldelight/dev/msfjarvis/claw/database/local/PostComments.sq create mode 100644 database/src/test/kotlin/dev/msfjarvis/claw/database/local/PostCommentsQueriesTest.kt diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt index 549fc5a8..ce668538 100644 --- a/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/injection/DatabaseModule.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2022 Harsh Shandilya. + * Copyright © 2021-2023 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. @@ -15,8 +15,9 @@ import com.squareup.anvil.annotations.ContributesTo import dagger.Module import dagger.Provides import dev.msfjarvis.claw.database.LobstersDatabase +import dev.msfjarvis.claw.database.local.PostComments import dev.msfjarvis.claw.database.local.SavedPost -import dev.msfjarvis.claw.database.model.TagsAdapter +import dev.msfjarvis.claw.database.model.CSVAdapter @Module @ContributesTo(ApplicationScope::class) @@ -27,6 +28,10 @@ object DatabaseModule { @Provides fun provideDatabase(@ForScope(ApplicationScope::class) context: Context): LobstersDatabase { val driver = AndroidSqliteDriver(LobstersDatabase.Schema, context, LOBSTERS_DATABASE_NAME) - return LobstersDatabase(driver, SavedPost.Adapter(IntColumnAdapter, TagsAdapter())) + return LobstersDatabase( + driver, + PostComments.Adapter(CSVAdapter()), + SavedPost.Adapter(IntColumnAdapter, CSVAdapter()), + ) } } diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/local/Database.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/local/Database.kt deleted file mode 100644 index 96edb1ad..00000000 --- a/database/src/main/kotlin/dev/msfjarvis/claw/database/local/Database.kt +++ /dev/null @@ -1,20 +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.database.local - -import android.content.Context -import app.cash.sqldelight.adapter.primitive.IntColumnAdapter -import app.cash.sqldelight.driver.android.AndroidSqliteDriver -import dev.msfjarvis.claw.database.LobstersDatabase -import dev.msfjarvis.claw.database.model.TagsAdapter - -internal const val LobstersDatabaseName = "SavedPosts.db" - -fun createDatabase(context: Context): LobstersDatabase { - val driver = AndroidSqliteDriver(LobstersDatabase.Schema, context, LobstersDatabaseName) - return LobstersDatabase(driver, SavedPost.Adapter(IntColumnAdapter, TagsAdapter())) -} diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/model/TagsAdapter.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/model/CSVAdapter.kt similarity index 83% rename from database/src/main/kotlin/dev/msfjarvis/claw/database/model/TagsAdapter.kt rename to database/src/main/kotlin/dev/msfjarvis/claw/database/model/CSVAdapter.kt index 4c20cc2a..0488d658 100644 --- a/database/src/main/kotlin/dev/msfjarvis/claw/database/model/TagsAdapter.kt +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/model/CSVAdapter.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2022 Harsh Shandilya. + * Copyright © 2021-2023 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. @@ -8,7 +8,7 @@ package dev.msfjarvis.claw.database.model import app.cash.sqldelight.ColumnAdapter -class TagsAdapter : ColumnAdapter, String> { +class CSVAdapter : ColumnAdapter, String> { override fun decode(databaseValue: String): List { return databaseValue.split(SEPARATOR) } diff --git a/database/src/main/sqldelight/databases/1.db b/database/src/main/sqldelight/databases/1.db index 908d4844d76e726220a0756e001fac78b111b7bb..3724e2df64565af2106204806f5162eb4b8d3ebe 100644 GIT binary patch delta 270 zcmZo@U~D+RI6+#GiGhKEjR65bd=@AdB+fXoP+63TLC^URFaHk)7Tzxmd@K2n@_ykf z*jU)W>r%zcF0QJ|*l1pon3R(mkY8NloS&PUnpaYc%w}~Ca&-)GRS0o(@^Mu_meDB4 zFP{98PcB#?8KTcKrC1@vH6ld8&p$-LFVx3J)0~A(+*_5AAu}%}wW7E%C$l6qKC!eU tAIy(OHZ0x{na8$yC0`=rCV_AKixd>tctL&=*eodUo_}HhHyalU7XSvHOu7I7 delta 84 zcmZoTz}V2hI6+#Gk%57Mg#iJO`5 NOT NULL +); + +rememberComments: +INSERT OR REPLACE +INTO PostComments +VALUES ?; + +getCommentIds: +SELECT * +FROM PostComments +WHERE postId = ?; diff --git a/database/src/test/kotlin/dev/msfjarvis/claw/database/local/PostCommentsQueriesTest.kt b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/PostCommentsQueriesTest.kt new file mode 100644 index 00000000..823cc57b --- /dev/null +++ b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/PostCommentsQueriesTest.kt @@ -0,0 +1,47 @@ +/* + * Copyright © 2023 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.database.local + +import app.cash.sqldelight.adapter.primitive.IntColumnAdapter +import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver +import dev.msfjarvis.claw.database.LobstersDatabase +import dev.msfjarvis.claw.database.model.CSVAdapter +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import java.util.UUID + +class PostCommentsQueriesTest : FunSpec() { + private lateinit var postQueries: PostCommentsQueries + init { + beforeEach { + val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) + LobstersDatabase.Schema.create(driver) + val database = + LobstersDatabase( + driver, + PostComments.Adapter(CSVAdapter()), + SavedPost.Adapter(IntColumnAdapter, CSVAdapter()), + ) + postQueries = database.postCommentsQueries + } + + test("get non-existent post") { + val ids = postQueries.getCommentIds(UUID.randomUUID().toString()).executeAsOneOrNull() + ids shouldBe null + } + + test("put and get post comments") { + val postId = UUID.randomUUID().toString() + val comments = PostComments(postId, List(10) { UUID.randomUUID().toString() }) + postQueries.rememberComments(comments) + + val ids = postQueries.getCommentIds(postId).executeAsOne().commentIds + ids shouldHaveSize 10 + } + } +} diff --git a/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SavedPostQueriesTest.kt b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SavedPostQueriesTest.kt index 8a12216b..30cdecb1 100644 --- a/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SavedPostQueriesTest.kt +++ b/database/src/test/kotlin/dev/msfjarvis/claw/database/local/SavedPostQueriesTest.kt @@ -9,7 +9,7 @@ package dev.msfjarvis.claw.database.local import app.cash.sqldelight.adapter.primitive.IntColumnAdapter import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import dev.msfjarvis.claw.database.LobstersDatabase -import dev.msfjarvis.claw.database.model.TagsAdapter +import dev.msfjarvis.claw.database.model.CSVAdapter import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldHaveSize @@ -26,7 +26,8 @@ class SavedPostQueriesTest : FunSpec() { val database = LobstersDatabase( driver, - SavedPost.Adapter(IntColumnAdapter, TagsAdapter()), + PostComments.Adapter(CSVAdapter()), + SavedPost.Adapter(IntColumnAdapter, CSVAdapter()), ) postQueries = database.savedPostQueries }