aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/db
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2019-03-06 17:42:31 -0500
committerAllan Wang <me@allanwang.ca>2019-03-06 17:42:31 -0500
commit8b70d80070209eb19791eecf207a8fdefea17a4e (patch)
tree41ed8afcbe74d138fc6dbf601c5e6e33486e8969 /app/src/main/kotlin/com/pitchedapps/frost/db
parent9a1d9719ad6559054ea1bc4f21f8559559eb9cda (diff)
downloadfrost-8b70d80070209eb19791eecf207a8fdefea17a4e.tar.gz
frost-8b70d80070209eb19791eecf207a8fdefea17a4e.tar.bz2
frost-8b70d80070209eb19791eecf207a8fdefea17a4e.zip
Make db entities immutable
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/db')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/CookiesDb.kt6
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/Database.kt7
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt28
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt64
4 files changed, 90 insertions, 15 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/CookiesDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/CookiesDb.kt
index 128abae3..34a88011 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/CookiesDb.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/CookiesDb.kt
@@ -38,9 +38,9 @@ import kotlinx.android.parcel.Parcelize
@Parcelize
data class CookieEntity(
@androidx.room.PrimaryKey
- var id: Long,
- var name: String?,
- var cookie: String?
+ val id: Long,
+ val name: String?,
+ val cookie: String?
) : Parcelable {
override fun toString(): String = "CookieEntity(${hashCode()})"
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/Database.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/Database.kt
index 161ed93d..a37c2ee9 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/Database.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/Database.kt
@@ -10,9 +10,14 @@ import org.koin.standalone.StandAloneContext
interface FrostPrivateDao {
fun cookieDao(): CookieDao
+ fun notifDao(): NotificationDao
}
-@Database(entities = [CookieEntity::class], version = 1, exportSchema = true)
+@Database(
+ entities = [CookieEntity::class, NotificationInfoEntity::class, NotificationEntity::class],
+ version = 1,
+ exportSchema = true
+)
abstract class FrostPrivateDatabase : RoomDatabase(), FrostPrivateDao {
companion object {
const val DATABASE_NAME = "frost-priv-db"
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
index 44e62938..582d57fb 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
@@ -33,7 +33,7 @@ import com.raizlabs.android.dbflow.kotlinextensions.fastSave
import com.raizlabs.android.dbflow.kotlinextensions.from
import com.raizlabs.android.dbflow.kotlinextensions.select
import com.raizlabs.android.dbflow.structure.BaseModel
-import kotlinx.coroutines.NonCancellable
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
/**
@@ -41,42 +41,48 @@ import kotlinx.coroutines.withContext
*/
@Entity(tableName = "tabs")
-data class FbTabEntity(@androidx.room.PrimaryKey var position: Int, var tab: FbItem)
+data class FbTabEntity(@androidx.room.PrimaryKey val position: Int, val tab: FbItem)
@Dao
interface FbTabDao {
@Query("SELECT * FROM tabs ORDER BY position ASC")
- suspend fun _selectAll(): List<FbTabEntity>
+ fun _selectAll(): List<FbTabEntity>
@Query("DELETE FROM tabs")
- suspend fun _deleteAll()
+ fun _deleteAll()
@Insert(onConflict = OnConflictStrategy.REPLACE)
- suspend fun _insertAll(items: List<FbTabEntity>)
+ fun _insertAll(items: List<FbTabEntity>)
+
+ @Transaction
+ fun _save(items: List<FbTabEntity>) {
+ _deleteAll()
+ _insertAll(items)
+ }
}
/**
* Saving tabs operates by deleting all db items and saving the new list.
* Transactions can't be done with suspensions in room as switching threads during the process
* may result in a deadlock.
- * In this case, there may be a chance that the 'transaction' completes partially,
- * but we'll just fallback to the default anyways.
+ * That's why we disallow thread switching within the transaction, but wrap the entire thing in a coroutine
*/
suspend fun FbTabDao.save(items: List<FbItem>) {
- withContext(NonCancellable) {
- _deleteAll()
+ withContext(Dispatchers.IO) {
val entities = (items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem ->
FbTabEntity(
index,
fbItem
)
}
- _insertAll(entities)
+ _save(entities)
}
}
-suspend fun FbTabDao.selectAll(): List<FbItem> = _selectAll().map { it.tab }.takeIf { it.isNotEmpty() } ?: defaultTabs()
+suspend fun FbTabDao.selectAll(): List<FbItem> = withContext(Dispatchers.IO) {
+ _selectAll().map { it.tab }.takeIf { it.isNotEmpty() } ?: defaultTabs()
+}
object FbItemConverter {
@androidx.room.TypeConverter
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt
index 5b501792..56c3c5ac 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt
@@ -16,6 +16,16 @@
*/
package com.pitchedapps.frost.db
+import androidx.room.Dao
+import androidx.room.Embedded
+import androidx.room.Entity
+import androidx.room.ForeignKey
+import androidx.room.Ignore
+import androidx.room.Index
+import androidx.room.Insert
+import androidx.room.Query
+import androidx.room.Relation
+import androidx.room.Transaction
import com.pitchedapps.frost.utils.L
import com.raizlabs.android.dbflow.annotation.ConflictAction
import com.raizlabs.android.dbflow.annotation.Database
@@ -32,6 +42,60 @@ import com.raizlabs.android.dbflow.sql.SQLiteType
import com.raizlabs.android.dbflow.sql.migration.AlterTableMigration
import com.raizlabs.android.dbflow.structure.BaseModel
+@Entity(
+ tableName = "notification_info",
+ foreignKeys = [ForeignKey(
+ entity = CookieEntity::class,
+ parentColumns = ["id"], childColumns = ["id"], onDelete = ForeignKey.CASCADE
+ )]
+)
+data class NotificationInfoEntity(
+ @androidx.room.PrimaryKey val id: Long,
+ val epoch: Long,
+ val epochIm: Long
+)
+
+@Entity(
+ tableName = "notifications",
+ foreignKeys = [ForeignKey(
+ entity = NotificationInfoEntity::class,
+ parentColumns = ["id"],
+ childColumns = ["userId"],
+ onDelete = ForeignKey.CASCADE
+ )],
+ indices = [Index("userId")]
+)
+data class NotificationEntity(
+ @androidx.room.PrimaryKey var id: Long,
+ val userId: Long,
+ val href: String,
+ val title: String?,
+ val text: String,
+ val timestamp: Long,
+ val profileUrl: String?
+) {
+ @Ignore
+ val notifId = Math.abs(id.toInt())
+}
+
+data class NotificationInfo(
+ @Embedded
+ val info: NotificationInfoEntity,
+ @Relation(parentColumn = "id", entityColumn = "userId")
+ val notifications: List<NotificationEntity> = emptyList()
+)
+
+@Dao
+interface NotificationDao {
+
+ @Query("SELECT * FROM notification_info WHERE id = :id")
+ fun selectById(id: Long): NotificationInfo?
+
+ @Transaction
+ @Insert
+ fun insertInfo(info: NotificationInfoEntity)
+}
+
/**
* Created by Allan Wang on 2017-05-30.
*/