From 96c25c428ddf523645018e72988b9dc05d66b1e5 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 23 Sep 2020 16:27:41 +0530 Subject: [PATCH] data: add database for lobsters posts Signed-off-by: Harsh Shandilya --- build.gradle | 1 + data/build.gradle | 5 +- .../data/source/LobstersApiTypeConverters.kt | 63 +++++++++++++++++++ .../lobsters/data/source/PostsDao.kt | 23 +++++++ .../lobsters/data/source/PostsDatabase.kt | 21 +++++++ model/build.gradle | 1 - 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt create mode 100644 data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt create mode 100644 data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt diff --git a/build.gradle b/build.gradle index 8f992308..0f5d9438 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ buildscript { dagger_version = '2.29.1' hilt_version = '2.29-alpha' kotlin_version = '1.4.10' + moshi_version = '1.9.3' room_version = '2.3.0-alpha02' } repositories { diff --git a/data/build.gradle b/data/build.gradle index 97b4eaca..ab8d749c 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -4,7 +4,10 @@ plugins { } dependencies { + implementation project(":model") kapt "androidx.room:room-compiler:$room_version" api "androidx.room:room-runtime:$room_version" - api "androidx.room:room-ktx:$room_version" + implementation "androidx.room:room-ktx:$room_version" + implementation "com.squareup.moshi:moshi:$moshi_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" } diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt new file mode 100644 index 00000000..11dd1f9a --- /dev/null +++ b/data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt @@ -0,0 +1,63 @@ +package dev.msfjarvis.lobsters.data.source + +import androidx.room.TypeConverter +import com.squareup.moshi.Moshi +import dev.msfjarvis.lobsters.model.KeybaseSignature +import dev.msfjarvis.lobsters.model.KeybaseSignatureJsonAdapter +import dev.msfjarvis.lobsters.model.LobstersPost +import dev.msfjarvis.lobsters.model.LobstersPostJsonAdapter +import dev.msfjarvis.lobsters.model.Submitter +import dev.msfjarvis.lobsters.model.SubmitterJsonAdapter + +object LobstersApiTypeConverters { + private val moshi = Moshi.Builder().build() + private const val SEPARATOR = "," + + @TypeConverter + @JvmStatic + fun toSubmitterUser(value: String?): Submitter? { + return value?.let { SubmitterJsonAdapter(moshi).fromJson(value) } + } + + @TypeConverter + @JvmStatic + fun fromSubmitterUser(value: Submitter?): String? { + return value?.let { SubmitterJsonAdapter(moshi).toJson(value) } + } + + @TypeConverter + @JvmStatic + fun toKeybaseSignature(value: String?): KeybaseSignature? { + return value?.let { KeybaseSignatureJsonAdapter(moshi).fromJson(value) } + } + + @TypeConverter + @JvmStatic + fun fromKeybaseSignature(value: KeybaseSignature?): String? { + return value?.let { KeybaseSignatureJsonAdapter(moshi).toJson(value) } + } + + @TypeConverter + @JvmStatic + fun toLobstersPost(value: String?): LobstersPost? { + return value?.let { LobstersPostJsonAdapter(moshi).fromJson(value) } + } + + @TypeConverter + @JvmStatic + fun fromLobstersPost(value: LobstersPost?): String? { + return value?.let { LobstersPostJsonAdapter(moshi).toJson(value) } + } + + @TypeConverter + @JvmStatic + fun toTagList(value: String?): List? { + return value?.split(SEPARATOR) + } + + @TypeConverter + @JvmStatic + fun fromTagList(value: List?): String? { + return value?.joinToString(SEPARATOR) + } +} diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt new file mode 100644 index 00000000..9247ebe2 --- /dev/null +++ b/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt @@ -0,0 +1,23 @@ +package dev.msfjarvis.lobsters.data.source + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import dev.msfjarvis.lobsters.model.LobstersPost +import kotlinx.coroutines.flow.Flow + +@Dao +abstract class PostsDao { + @Query("SELECT * FROM lobsters_posts") + abstract fun loadPosts(): Flow> + + @Insert + abstract suspend fun insertPosts(vararg posts: LobstersPost) + + @Delete + abstract suspend fun deletePosts(vararg posts: LobstersPost) + + @Query("DELETE FROM lobsters_posts") + abstract suspend fun deleteAllPosts() +} diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt new file mode 100644 index 00000000..0640e663 --- /dev/null +++ b/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt @@ -0,0 +1,21 @@ +package dev.msfjarvis.lobsters.data.source + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import dev.msfjarvis.lobsters.model.LobstersPost + +@Database( + entities = [ + LobstersPost::class, + ], + version = 1, + exportSchema = false, +) +@TypeConverters( + LobstersApiTypeConverters::class, + DateTimeTypeConverters::class, +) +abstract class PostsDatabase : RoomDatabase() { + abstract fun postsDao(): PostsDao +} diff --git a/model/build.gradle b/model/build.gradle index 51aade2d..182b824c 100644 --- a/model/build.gradle +++ b/model/build.gradle @@ -4,7 +4,6 @@ plugins { } dependencies { - def moshi_version = "1.9.3" api "androidx.room:room-runtime:$room_version" kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version" implementation "com.squareup.moshi:moshi:$moshi_version"