update db for saved item property changes before sending updates to serevr

This commit is contained in:
Satindar Dhillon 2023-01-17 21:00:06 -08:00
parent 23f1ccde1e
commit bb1efac336
5 changed files with 162 additions and 21 deletions

View file

@ -0,0 +1,118 @@
package app.omnivore.omnivore.dataService
import app.omnivore.omnivore.models.ServerSyncStatus
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.entities.Highlight
import app.omnivore.omnivore.persistence.entities.SavedItemAndHighlightCrossRef
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
suspend fun DataService.createWebHighlight(jsonString: String) {
val createHighlightInput = Gson().fromJson(jsonString, CreateHighlightParams::class.java).asCreateHighlightInput()
withContext(Dispatchers.IO) {
val highlight = Highlight(
highlightId = createHighlightInput.id,
shortId = createHighlightInput.shortId,
quote = createHighlightInput.quote,
prefix = null,
suffix = null,
patch = createHighlightInput.patch,
annotation = createHighlightInput.annotation.getOrNull(),
createdAt = null,
updatedAt = null,
createdByMe = false
)
highlight.serverSyncStatus = ServerSyncStatus.NEEDS_CREATION.rawValue
val crossRef = SavedItemAndHighlightCrossRef(
highlightId = createHighlightInput.id,
savedItemId = createHighlightInput.articleId
)
db.savedItemAndHighlightCrossRefDao().insertAll(listOf(crossRef))
db.highlightDao().update(highlight)
val newHighlight = networker.createHighlight(createHighlightInput)
newHighlight?.let {
db.highlightDao().update(it)
}
}
}
suspend fun DataService.mergeWebHighlights(jsonString: String) {
val mergeHighlightInput = Gson().fromJson(jsonString, MergeHighlightsParams::class.java).asMergeHighlightInput()
withContext(Dispatchers.IO) {
val highlight = db.highlightDao().findById(highlightId = mergeHighlightInput.id) ?: return@withContext
highlight.shortId = mergeHighlightInput.shortId
highlight.quote = mergeHighlightInput.quote
highlight.patch = mergeHighlightInput.patch
highlight.prefix = mergeHighlightInput.prefix.getOrNull()
highlight.annotation = mergeHighlightInput.annotation.getOrNull()
highlight.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue
for (highlightID in mergeHighlightInput.overlapHighlightIdList) {
deleteHighlight(highlightID)
}
val crossRef = SavedItemAndHighlightCrossRef(
highlightId = mergeHighlightInput.id,
savedItemId = mergeHighlightInput.articleId
)
db.savedItemAndHighlightCrossRefDao().insertAll(listOf(crossRef))
db.highlightDao().update(highlight)
val isUpdatedOnServer = networker.mergeHighlights(mergeHighlightInput)
if (isUpdatedOnServer) {
highlight.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue
db.highlightDao().update(highlight)
}
}
}
suspend fun DataService.updateWebHighlight(jsonString: String) {
val updateHighlightParams = Gson().fromJson(jsonString, UpdateHighlightParams::class.java).asUpdateHighlightInput()
withContext(Dispatchers.IO) {
val highlight = db.highlightDao().findById(highlightId = updateHighlightParams.highlightId) ?: return@withContext
highlight.annotation = updateHighlightParams.annotation.getOrNull()
highlight.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue
db.highlightDao().update(highlight)
val isUpdatedOnServer = networker.updateHighlight(updateHighlightParams)
if (isUpdatedOnServer) {
highlight.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue
db.highlightDao().update(highlight)
}
}
}
suspend fun DataService.deleteHighlights(jsonString: String) {
val highlightIDs = Gson().fromJson(jsonString, DeleteHighlightParams::class.java).asIdList()
for (highlightID in highlightIDs) {
deleteHighlight(highlightID)
}
}
private suspend fun DataService.deleteHighlight(highlightID: String) {
withContext(Dispatchers.IO) {
val highlight = db.highlightDao().findById(highlightId = highlightID) ?: return@withContext
highlight.serverSyncStatus = ServerSyncStatus.NEEDS_DELETION.rawValue
db.highlightDao().update(highlight)
val isUpdatedOnServer = networker.deleteHighlights(listOf(highlightID))
if (isUpdatedOnServer) {
db.highlightDao().deleteById(highlightId = highlightID)
}
}
}

View file

@ -0,0 +1,28 @@
package app.omnivore.omnivore.dataService
import app.omnivore.omnivore.models.ServerSyncStatus
import app.omnivore.omnivore.networking.ReadingProgressParams
import app.omnivore.omnivore.networking.updateReadingProgress
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
suspend fun DataService.updateWebReadingProgress(jsonString: String) {
val readingProgressParams = Gson().fromJson(jsonString, ReadingProgressParams::class.java)
val savedItemId = readingProgressParams.id ?: return
withContext(Dispatchers.IO) {
val savedItem = db.savedItemDao().findById(savedItemId) ?: return@withContext
savedItem.readingProgress = readingProgressParams.readingProgressPercent ?: 0.0
savedItem.readingProgressAnchor = readingProgressParams.readingProgressAnchorIndex ?: 0
savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue
db.savedItemDao().update(savedItem)
val isUpdatedOnServer = networker.updateReadingProgress(readingProgressParams)
if (isUpdatedOnServer) {
savedItem.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue
db.savedItemDao().update(savedItem)
}
}
}

View file

@ -7,15 +7,15 @@ import app.omnivore.omnivore.models.ServerSyncStatus
@Entity
data class Highlight(
@PrimaryKey val highlightId: String,
val annotation: String?,
var annotation: String?,
val createdAt: String?,
val createdByMe: Boolean,
val markedForDeletion: Boolean = false,
val patch: String,
val prefix: String?,
val quote: String,
var patch: String,
var prefix: String?,
var quote: String,
var serverSyncStatus: Int = ServerSyncStatus.IS_SYNCED.rawValue,
val shortId: String,
var shortId: String,
val suffix: String?,
val updatedAt: String?
@ -84,6 +84,9 @@ interface HighlightDao {
@Query("DELETE FROM highlight WHERE highlightId = :highlightId")
fun deleteById(highlightId: String)
@Query("SELECT * FROM highlight WHERE highlightId = :highlightId")
fun findById(highlightId: String): Highlight?
@Update
fun update(highlight: Highlight)
}

View file

@ -13,8 +13,8 @@ data class SavedItem(
val savedAt: String,
val readAt: String?,
val updatedAt: String?,
val readingProgress: Double,
val readingProgressAnchor: Int,
var readingProgress: Double,
var readingProgressAnchor: Int,
val imageURLString: String?,
val pageURLString: String,
val descriptionText: String?,

View file

@ -7,10 +7,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.DatastoreKeys
import app.omnivore.omnivore.DatastoreRepository
import app.omnivore.omnivore.dataService.DataService
import app.omnivore.omnivore.dataService.archiveSavedItem
import app.omnivore.omnivore.dataService.deleteSavedItem
import app.omnivore.omnivore.dataService.unarchiveSavedItem
import app.omnivore.omnivore.dataService.*
import app.omnivore.omnivore.persistence.entities.SavedItem
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.ui.library.SavedItemAction
@ -124,28 +121,24 @@ class WebReaderViewModel @Inject constructor(
when (actionID) {
"createHighlight" -> {
viewModelScope.launch {
val isHighlightSynced = networker.createWebHighlight(jsonString)
Log.d("Network", "isHighlightSynced = $isHighlightSynced")
dataService.createWebHighlight(jsonString)
}
}
"deleteHighlight" -> {
Log.d("Loggo", "receive delete highlight action: $jsonString")
viewModelScope.launch {
val isHighlightDeletionSynced = networker.deleteHighlight(jsonString)
Log.d("Network", "isHighlightDeletionSynced = $isHighlightDeletionSynced")
dataService.deleteHighlights(jsonString)
}
}
"updateHighlight" -> {
Log.d("Loggo", "receive update highlight action: $jsonString")
viewModelScope.launch {
val isHighlightUpdateSynced = networker.updateWebHighlight(jsonString)
Log.d("Network", "isHighlightUpdateSynced = $isHighlightUpdateSynced")
dataService.updateWebHighlight(jsonString)
}
}
"articleReadingProgress" -> {
viewModelScope.launch {
val isReadingProgressSynced = networker.updateWebReadingProgress(jsonString)
Log.d("Network", "isReadingProgressSynced = $isReadingProgressSynced")
dataService.updateWebReadingProgress(jsonString)
}
}
"annotate" -> {
@ -161,8 +154,7 @@ class WebReaderViewModel @Inject constructor(
}
"mergeHighlight" -> {
viewModelScope.launch {
val isHighlightSynced = networker.mergeWebHighlights(jsonString)
Log.d("Network", "isMergedHighlightSynced = $isHighlightSynced")
dataService.mergeWebHighlights(jsonString)
}
}
else -> {