From 245c40e6856b40f4fb64a2ad9e8dc4976084f9f3 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 16 Jan 2023 15:05:30 -0800 Subject: [PATCH] split data service file into more files --- .../java/app/omnivore/omnivore/AppModule.kt | 1 + .../omnivore/dataService/DataService.kt | 17 +++ .../omnivore/dataService/LibrarySync.kt | 109 +++++++++++++++ .../SyncOfflineChanges.kt} | 124 +----------------- .../omnivore/ui/library/LibraryViewModel.kt | 3 + .../omnivore/ui/reader/WebReaderViewModel.kt | 2 +- 6 files changed, 134 insertions(+), 122 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/DataService.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibrarySync.kt rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{DataService.kt => dataService/SyncOfflineChanges.kt} (52%) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt index c31cf9457..a84f737f5 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt @@ -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 diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/DataService.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/DataService.kt new file mode 100644 index 000000000..f0143e4d2 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/DataService.kt @@ -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() +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibrarySync.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibrarySync.kt new file mode 100644 index 000000000..a1030378f --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibrarySync.kt @@ -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 = mutableListOf() + val crossRefs: MutableList = 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, + val cursor: String? +) { + companion object { + val errorResult = SavedItemSyncResult(hasError = true, hasMoreItems = true, cursor = null, count = 0, savedItemSlugs = listOf()) + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SyncOfflineChanges.kt similarity index 52% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SyncOfflineChanges.kt index cfe12257c..c3a6fd263 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SyncOfflineChanges.kt @@ -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 = mutableListOf() - val crossRefs: MutableList = 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, - val cursor: String? -) { - companion object { - val errorResult = SavedItemSyncResult(hasError = true, hasMoreItems = true, cursor = null, count = 0, savedItemSlugs = listOf()) - } -} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 84da2262a..1031fc40e 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -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 diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt index 21835f088..3a911562d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt @@ -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