From ebf80ffc5aa8307e07c23ee45a9ad337fb8479d7 Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <mail@justjanne.de>
Date: Fri, 29 Nov 2024 15:13:33 +0100
Subject: [PATCH] wip: persistence layer

---
 gradle/libs.versions.toml                     |  6 +++
 libquassel-client/build.gradle.kts            | 15 ++++++-
 .../libquassel/client/QuasselApiTest.kt       | 41 ++++++++++++++++++-
 libquassel-persistence/build.gradle.kts       | 31 ++++++++++++++
 .../libquassel/persistence/AppDatabase.kt     | 18 ++++++++
 .../libquassel/persistence/TodoDao.kt         | 27 ++++++++++++
 .../libquassel/persistence/TodoEntity.kt      | 20 +++++++++
 settings.gradle.kts                           |  1 +
 8 files changed, 156 insertions(+), 3 deletions(-)
 create mode 100644 libquassel-persistence/build.gradle.kts
 create mode 100644 libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/AppDatabase.kt
 create mode 100644 libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoDao.kt
 create mode 100644 libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoEntity.kt

diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 6e07830..530f548 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,7 +13,9 @@ kotlinx-coroutines = "1.9.0"
 kotlinx-serialization = "2.0.21"
 ktlint = "12.1.1"
 nexus-publish = "2.0.0"
+room = "2.7.0-alpha07"
 slf4j = "1.7.30"
+sqlite = "2.5.0-alpha07"
 threetenbp = "1.7.0"
 
 [libraries]
@@ -36,6 +38,10 @@ junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref
 junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit"}
 junit-kotlin = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin"}
 
+room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
+room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
+sqlite = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
+
 nexus-publish-gradlePlugin = { module = "io.github.gradle-nexus:publish-plugin", version.ref = "nexus-publish" }
 kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
 dokka-gradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" }
diff --git a/libquassel-client/build.gradle.kts b/libquassel-client/build.gradle.kts
index 6bf17dc..57e714e 100644
--- a/libquassel-client/build.gradle.kts
+++ b/libquassel-client/build.gradle.kts
@@ -12,10 +12,21 @@ plugins {
   id("justjanne.publication")
 }
 
+repositories {
+  google()
+  mavenCentral()
+}
+
 dependencies {
-  api(project(":libquassel-protocol"))
   api(project(":libquassel-api"))
-  implementation(libs.slf4j)
+  api(project(":libquassel-persistence"))
+  api(project(":libquassel-protocol"))
+
   implementation(libs.dagger.core)
   ksp(libs.dagger.compiler)
+
+  implementation(libs.slf4j)
+
+  testImplementation(libs.room.runtime)
+  testImplementation(libs.sqlite)
 }
diff --git a/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/QuasselApiTest.kt b/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/QuasselApiTest.kt
index eb3af28..0fa83d8 100644
--- a/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/QuasselApiTest.kt
+++ b/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/QuasselApiTest.kt
@@ -9,6 +9,8 @@
 
 package de.justjanne.libquassel.client
 
+import androidx.room.Room
+import androidx.sqlite.driver.bundled.BundledSQLiteDriver
 import dagger.Binds
 import dagger.Component
 import dagger.Module
@@ -28,8 +30,25 @@ import de.justjanne.libquassel.backend.IrcUserPersister
 import de.justjanne.libquassel.backend.NetworkConfigPersister
 import de.justjanne.libquassel.backend.NetworkPersister
 import de.justjanne.libquassel.backend.RpcPersister
+import de.justjanne.libquassel.persistence.AppDatabase
+import de.justjanne.libquassel.persistence.TodoEntity
 import de.justjanne.libquassel.protocol.api.ObjectName
-import de.justjanne.libquassel.protocol.api.client.*
+import de.justjanne.libquassel.protocol.api.client.AliasManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.BacklogManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.BufferSyncerClientApi
+import de.justjanne.libquassel.protocol.api.client.BufferViewConfigClientApi
+import de.justjanne.libquassel.protocol.api.client.BufferViewManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.CertManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.CoreInfoClientApi
+import de.justjanne.libquassel.protocol.api.client.HighlightRuleManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.IdentityClientApi
+import de.justjanne.libquassel.protocol.api.client.IgnoreListManagerClientApi
+import de.justjanne.libquassel.protocol.api.client.IrcChannelClientApi
+import de.justjanne.libquassel.protocol.api.client.IrcListHelperClientApi
+import de.justjanne.libquassel.protocol.api.client.IrcUserClientApi
+import de.justjanne.libquassel.protocol.api.client.NetworkClientApi
+import de.justjanne.libquassel.protocol.api.client.NetworkConfigClientApi
+import de.justjanne.libquassel.protocol.api.client.RpcClientApi
 import de.justjanne.libquassel.protocol.api.dispatcher.ClientDispatcherModule
 import de.justjanne.libquassel.protocol.api.dispatcher.RpcDispatcher
 import de.justjanne.libquassel.protocol.api.dispatcher.SyncHandler
@@ -54,6 +73,8 @@ import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.variant.QVariantList
 import de.justjanne.libquassel.protocol.variant.QVariant_
 import de.justjanne.libquassel.protocol.variant.qVariant
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
 import org.junit.jupiter.api.Test
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -148,4 +169,22 @@ class QuasselApiTest {
     client.api().identity.requestUpdate(ObjectName(""), emptyMap())
     println("hi!")
   }
+
+  @Test
+  fun testDb() = runBlocking {
+    val db = Room.inMemoryDatabaseBuilder<AppDatabase>()
+      .setDriver(BundledSQLiteDriver())
+      .setQueryCoroutineContext(Dispatchers.IO)
+      .build()
+
+    val dao = db.getDao()
+    println(dao.count())
+    dao.insert(
+      TodoEntity(
+        title = "kids",
+        content = "bring kids home from school"
+      )
+    )
+    println(dao.count())
+  }
 }
diff --git a/libquassel-persistence/build.gradle.kts b/libquassel-persistence/build.gradle.kts
new file mode 100644
index 0000000..8f96dc5
--- /dev/null
+++ b/libquassel-persistence/build.gradle.kts
@@ -0,0 +1,31 @@
+/*
+ * libquassel
+ * Copyright (c) 2024 Janne Mareike Koschinski
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+plugins {
+  id("justjanne.kotlin")
+  id("justjanne.publication")
+}
+
+repositories {
+  google()
+  mavenCentral()
+}
+
+dependencies {
+  api(project(":libquassel-protocol"))
+  api(project(":libquassel-api"))
+
+  implementation(libs.dagger.core)
+  ksp(libs.dagger.compiler)
+
+  implementation(libs.room.runtime)
+  ksp(libs.room.compiler)
+
+  implementation(libs.slf4j)
+}
diff --git a/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/AppDatabase.kt b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/AppDatabase.kt
new file mode 100644
index 0000000..0d802f6
--- /dev/null
+++ b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/AppDatabase.kt
@@ -0,0 +1,18 @@
+/*
+ * libquassel
+ * Copyright (c) 2024 Janne Mareike Koschinski
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+package de.justjanne.libquassel.persistence
+
+import androidx.room.Database
+import androidx.room.RoomDatabase
+
+@Database(entities = [TodoEntity::class], version = 1)
+abstract class AppDatabase : RoomDatabase() {
+  abstract fun getDao(): TodoDao
+}
diff --git a/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoDao.kt b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoDao.kt
new file mode 100644
index 0000000..d4f7529
--- /dev/null
+++ b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoDao.kt
@@ -0,0 +1,27 @@
+/*
+ * libquassel
+ * Copyright (c) 2024 Janne Mareike Koschinski
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+package de.justjanne.libquassel.persistence
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.Query
+import kotlinx.coroutines.flow.Flow
+
+@Dao
+interface TodoDao {
+  @Insert
+  suspend fun insert(item: TodoEntity)
+
+  @Query("SELECT count(*) FROM TodoEntity")
+  suspend fun count(): Int
+
+  @Query("SELECT * FROM TodoEntity")
+  fun getAllAsFlow(): Flow<List<TodoEntity>>
+}
diff --git a/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoEntity.kt b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoEntity.kt
new file mode 100644
index 0000000..1c69d5e
--- /dev/null
+++ b/libquassel-persistence/src/main/kotlin/de/justjanne/libquassel/persistence/TodoEntity.kt
@@ -0,0 +1,20 @@
+/*
+ * libquassel
+ * Copyright (c) 2024 Janne Mareike Koschinski
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+package de.justjanne.libquassel.persistence
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity
+data class TodoEntity(
+  @PrimaryKey(autoGenerate = true) val id: Long = 0,
+  val title: String,
+  val content: String
+)
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 4b191f1..291dc88 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -15,6 +15,7 @@ include(
   ":libquassel-annotations",
   ":libquassel-api",
   ":libquassel-client",
+  ":libquassel-persistence",
   ":libquassel-generator",
   ":libquassel-irc",
   ":libquassel-protocol"
-- 
GitLab