split data service file into more files

This commit is contained in:
Satindar Dhillon 2023-01-16 15:05:30 -08:00
parent 8cd14c7540
commit 245c40e685
6 changed files with 134 additions and 122 deletions

View file

@ -2,6 +2,7 @@ package app.omnivore.omnivore
import android.content.Context
import androidx.room.Room
import app.omnivore.omnivore.dataService.DataService
import app.omnivore.omnivore.networking.Networker
import app.omnivore.omnivore.persistence.AppDatabase
import dagger.Module

View file

@ -0,0 +1,17 @@
package app.omnivore.omnivore.dataService
import android.content.Context
import androidx.room.Room
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.AppDatabase
import javax.inject.Inject
class DataService @Inject constructor(
context: Context,
val networker: Networker
) {
val db = Room.databaseBuilder(
context,
AppDatabase::class.java, "omnivore-database"
).build()
}

View file

@ -0,0 +1,109 @@
package app.omnivore.omnivore.dataService
import android.util.Log
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.entities.*
suspend fun DataService.sync(since: String, cursor: String?, limit: Int = 15): SavedItemSyncResult {
val syncResult = networker.savedItemUpdates(cursor = cursor, limit = limit, since = since) ?: return SavedItemSyncResult.errorResult
val savedItems = syncResult.items.map {
SavedItem(
savedItemId = it.id,
title = it.title,
createdAt = it.createdAt as String,
savedAt = it.savedAt as String,
readAt = it.readAt as String?,
updatedAt = it.updatedAt as String?,
readingProgress = it.readingProgressPercent,
readingProgressAnchor = it.readingProgressAnchorIndex,
imageURLString = it.image,
pageURLString = it.url,
descriptionText = it.description,
publisherURLString = it.originalArticleUrl,
siteName = it.siteName,
author = it.author,
publishDate = it.publishedAt as String?,
slug = it.slug,
isArchived = it.isArchived,
contentReader = it.contentReader.rawValue,
content = null
)
}
db.savedItemDao().insertAll(savedItems)
val labels: MutableList<SavedItemLabel> = mutableListOf()
val crossRefs: MutableList<SavedItemAndSavedItemLabelCrossRef> = mutableListOf()
// save labels
for (item in syncResult.items) {
val itemLabels = (item.labels ?: listOf()).map {
SavedItemLabel(
savedItemLabelId = it.id,
name = it.name,
color = it.color,
createdAt = null,
labelDescription = null
)
}
labels.addAll(itemLabels)
val newCrossRefs = itemLabels.map {
SavedItemAndSavedItemLabelCrossRef(savedItemLabelId = it.savedItemLabelId, savedItemId = item.id)
}
crossRefs.addAll(newCrossRefs)
}
db.savedItemLabelDao().insertAll(labels)
db.savedItemAndSavedItemLabelCrossRefDao().insertAll(crossRefs)
return SavedItemSyncResult(
hasError = false,
hasMoreItems = syncResult.hasMoreItems,
cursor = syncResult.cursor,
count = syncResult.items.size,
savedItemSlugs = syncResult.items.map { it.slug }
)
}
suspend fun DataService.syncSavedItemContent(slug: String) {
val syncResult = networker.savedItem(slug)
val savedItem = syncResult.item ?: return
db.savedItemDao().insert(savedItem)
// Persist Labels
db.savedItemLabelDao().insertAll(syncResult.labels)
val labelCrossRefs = syncResult.labels.map {
SavedItemAndSavedItemLabelCrossRef(savedItemLabelId = it.savedItemLabelId, savedItemId = savedItem.savedItemId)
}
db.savedItemAndSavedItemLabelCrossRefDao().insertAll(labelCrossRefs)
// Persist Highlights
db.highlightDao().insertAll(syncResult.highlights)
val highlightCrossRefs = syncResult.highlights.map {
SavedItemAndHighlightCrossRef(highlightId = it.highlightId, savedItemId = savedItem.savedItemId)
}
db.savedItemAndHighlightCrossRefDao().insertAll(highlightCrossRefs)
Log.d("sync", "saved content for item with id: ${savedItem.savedItemId}")
}
data class SavedItemSyncResult(
val hasError: Boolean,
val hasMoreItems: Boolean,
val count: Int,
val savedItemSlugs: List<String>,
val cursor: String?
) {
companion object {
val errorResult = SavedItemSyncResult(hasError = true, hasMoreItems = true, cursor = null, count = 0, savedItemSlugs = listOf())
}
}

View file

@ -1,118 +1,12 @@
package app.omnivore.omnivore
package app.omnivore.omnivore.dataService
import android.content.Context
import android.util.Log
import androidx.room.Room
import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput
import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput
import app.omnivore.omnivore.models.ServerSyncStatus
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.AppDatabase
import app.omnivore.omnivore.persistence.entities.*
import app.omnivore.omnivore.persistence.entities.Highlight
import app.omnivore.omnivore.persistence.entities.SavedItem
import com.apollographql.apollo3.api.Optional
import javax.inject.Inject
class DataService @Inject constructor(
context: Context,
val networker: Networker
) {
val db = Room.databaseBuilder(
context,
AppDatabase::class.java, "omnivore-database"
).build()
}
suspend fun DataService.sync(since: String, cursor: String?, limit: Int = 15): SavedItemSyncResult {
val syncResult = networker.savedItemUpdates(cursor = cursor, limit = limit, since = since) ?: return SavedItemSyncResult.errorResult
val savedItems = syncResult.items.map {
SavedItem(
savedItemId = it.id,
title = it.title,
createdAt = it.createdAt as String,
savedAt = it.savedAt as String,
readAt = it.readAt as String?,
updatedAt = it.updatedAt as String?,
readingProgress = it.readingProgressPercent,
readingProgressAnchor = it.readingProgressAnchorIndex,
imageURLString = it.image,
pageURLString = it.url,
descriptionText = it.description,
publisherURLString = it.originalArticleUrl,
siteName = it.siteName,
author = it.author,
publishDate = it.publishedAt as String?,
slug = it.slug,
isArchived = it.isArchived,
contentReader = it.contentReader.rawValue,
content = null
)
}
db.savedItemDao().insertAll(savedItems)
val labels: MutableList<SavedItemLabel> = mutableListOf()
val crossRefs: MutableList<SavedItemAndSavedItemLabelCrossRef> = mutableListOf()
// save labels
for (item in syncResult.items) {
val itemLabels = (item.labels ?: listOf()).map {
SavedItemLabel(
savedItemLabelId = it.id,
name = it.name,
color = it.color,
createdAt = null,
labelDescription = null
)
}
labels.addAll(itemLabels)
val newCrossRefs = itemLabels.map {
SavedItemAndSavedItemLabelCrossRef(savedItemLabelId = it.savedItemLabelId, savedItemId = item.id)
}
crossRefs.addAll(newCrossRefs)
}
db.savedItemLabelDao().insertAll(labels)
db.savedItemAndSavedItemLabelCrossRefDao().insertAll(crossRefs)
return SavedItemSyncResult(
hasError = false,
hasMoreItems = syncResult.hasMoreItems,
cursor = syncResult.cursor,
count = syncResult.items.size,
savedItemSlugs = syncResult.items.map { it.slug }
)
}
suspend fun DataService.syncSavedItemContent(slug: String) {
val syncResult = networker.savedItem(slug)
val savedItem = syncResult.item ?: return
db.savedItemDao().insert(savedItem)
// Persist Labels
db.savedItemLabelDao().insertAll(syncResult.labels)
val labelCrossRefs = syncResult.labels.map {
SavedItemAndSavedItemLabelCrossRef(savedItemLabelId = it.savedItemLabelId, savedItemId = savedItem.savedItemId)
}
db.savedItemAndSavedItemLabelCrossRefDao().insertAll(labelCrossRefs)
// Persist Highlights
db.highlightDao().insertAll(syncResult.highlights)
val highlightCrossRefs = syncResult.highlights.map {
SavedItemAndHighlightCrossRef(highlightId = it.highlightId, savedItemId = savedItem.savedItemId)
}
db.savedItemAndHighlightCrossRefDao().insertAll(highlightCrossRefs)
Log.d("sync", "saved content for item with id: ${savedItem.savedItemId}")
}
suspend fun DataService.syncOfflineItemsWithServerIfNeeded() {
val unSyncedSavedItems = db.savedItemDao().getUnSynced()
@ -235,15 +129,3 @@ private suspend fun DataService.syncHighlight(highlight: Highlight) {
else -> return
}
}
data class SavedItemSyncResult(
val hasError: Boolean,
val hasMoreItems: Boolean,
val count: Int,
val savedItemSlugs: List<String>,
val cursor: String?
) {
companion object {
val errorResult = SavedItemSyncResult(hasError = true, hasMoreItems = true, cursor = null, count = 0, savedItemSlugs = listOf())
}
}

View file

@ -8,6 +8,9 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.*
import app.omnivore.omnivore.dataService.DataService
import app.omnivore.omnivore.dataService.sync
import app.omnivore.omnivore.dataService.syncOfflineItemsWithServerIfNeeded
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
import app.omnivore.omnivore.persistence.entities.SavedItemCardDataWithLabels

View file

@ -5,9 +5,9 @@ import androidx.compose.foundation.ScrollState
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.DataService
import app.omnivore.omnivore.DatastoreKeys
import app.omnivore.omnivore.DatastoreRepository
import app.omnivore.omnivore.dataService.DataService
import app.omnivore.omnivore.persistence.entities.SavedItem
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.ui.library.SavedItemAction