Add Nextcloud initial synchronization

This commit is contained in:
Shinokuni 2024-06-16 13:22:19 +02:00
parent 9a63c1a777
commit 5bff505fc3
3 changed files with 62 additions and 7 deletions

View File

@ -3,6 +3,6 @@ package com.readrops.api.services.nextcloudnews
import com.readrops.api.services.Credentials import com.readrops.api.services.Credentials
class NextNewsCredentials(login: String?, password: String?, url: String): class NextNewsCredentials(login: String?, password: String?, url: String):
Credentials((login != null && password != null).let { Credentials(if (login != null && password != null) {
okhttp3.Credentials.basic(login!!, password!!) okhttp3.Credentials.basic(login, password)
}, url) } else null, url)

View File

@ -2,10 +2,15 @@ package com.readrops.app.compose.repositories
import com.readrops.api.services.Credentials import com.readrops.api.services.Credentials
import com.readrops.api.services.SyncResult import com.readrops.api.services.SyncResult
import com.readrops.api.services.SyncType
import com.readrops.api.services.nextcloudnews.NewNextcloudNewsDataSource import com.readrops.api.services.nextcloudnews.NewNextcloudNewsDataSource
import com.readrops.api.services.nextcloudnews.NextcloudNewsSyncData
import com.readrops.api.utils.AuthInterceptor import com.readrops.api.utils.AuthInterceptor
import com.readrops.app.compose.util.Utils
import com.readrops.db.Database import com.readrops.db.Database
import com.readrops.db.entities.Feed import com.readrops.db.entities.Feed
import com.readrops.db.entities.Folder
import com.readrops.db.entities.Item
import com.readrops.db.entities.account.Account import com.readrops.db.entities.account.Account
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.get import org.koin.core.component.get
@ -27,12 +32,15 @@ class NextcloudNewsRepository(
override suspend fun synchronize( override suspend fun synchronize(
selectedFeeds: List<Feed>, selectedFeeds: List<Feed>,
onUpdate: (Feed) -> Unit onUpdate: (Feed) -> Unit
): Pair<SyncResult, ErrorResult> { ): Pair<SyncResult, ErrorResult> = throw NotImplementedError("This method can't be called here")
TODO("Not yet implemented")
}
override suspend fun synchronize(): SyncResult { override suspend fun synchronize(): SyncResult {
TODO("Not yet implemented") return dataSource.synchronize(SyncType.INITIAL_SYNC, NextcloudNewsSyncData()).apply {
insertFolders(folders)
insertFeeds(feeds)
insertItems(items, true)
}
} }
override suspend fun insertNewFeeds( override suspend fun insertNewFeeds(
@ -41,4 +49,45 @@ class NextcloudNewsRepository(
): ErrorResult { ): ErrorResult {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
private suspend fun insertFolders(folders: List<Folder>) {
folders.forEach { it.accountId = account.id }
database.newFolderDao().upsertFolders(folders, account)
}
private suspend fun insertFeeds(feeds: List<Feed>): List<Long> {
feeds.forEach { it.accountId = account.id }
return database.newFeedDao().upsertFeeds(feeds, account)
}
private suspend fun insertItems(items: List<Item>, initialSync: Boolean) {
val itemsToInsert = arrayListOf<Item>()
val itemsFeedsIds = mutableMapOf<String?, Int>()
for (item in items) {
val feedId: Int
if (itemsFeedsIds.containsKey(item.feedRemoteId)) {
feedId = itemsFeedsIds.getValue(item.feedRemoteId)
} else {
feedId =
database.newFeedDao().selectRemoteFeedLocalId(item.feedRemoteId!!, account.id)
itemsFeedsIds[item.feedRemoteId] = feedId
}
if (!initialSync && feedId > 0 && database.newItemDao()
.itemExists(item.remoteId!!, feedId)
) {
database.newItemDao()
.updateReadAndStarState(item.remoteId!!, item.isRead, item.isStarred)
}
item.feedId = feedId
item.readTime = Utils.readTimeFromString(item.content.orEmpty())
itemsToInsert += item
}
if (itemsToInsert.isNotEmpty()) {
database.newItemDao().insert(itemsToInsert)
}
}
} }

View File

@ -28,6 +28,9 @@ abstract class NewItemDao : NewBaseDao<Item> {
@Query("Update Item Set starred = :starred Where id = :itemId") @Query("Update Item Set starred = :starred Where id = :itemId")
abstract suspend fun updateStarState(itemId: Int, starred: Boolean) abstract suspend fun updateStarState(itemId: Int, starred: Boolean)
@Query("Update Item set read = :read, starred = :starred Where remoteId = :remoteId")
abstract suspend fun updateReadAndStarState(remoteId: String, read: Boolean, starred: Boolean)
@Query("Update Item set read = 1 Where feed_id IN (Select id From Feed Where account_id = :accountId)") @Query("Update Item set read = 1 Where feed_id IN (Select id From Feed Where account_id = :accountId)")
abstract suspend fun setAllItemsRead(accountId: Int) abstract suspend fun setAllItemsRead(accountId: Int)
@ -54,4 +57,7 @@ abstract class NewItemDao : NewBaseDao<Item> {
@RawQuery(observedEntities = [Item::class]) @RawQuery(observedEntities = [Item::class])
abstract fun selectFeedUnreadItemsCount(query: SupportSQLiteQuery): abstract fun selectFeedUnreadItemsCount(query: SupportSQLiteQuery):
Flow<Map<@MapColumn(columnName = "feed_id") Int, @MapColumn(columnName = "item_count") Int>> Flow<Map<@MapColumn(columnName = "feed_id") Int, @MapColumn(columnName = "item_count") Int>>
@Query("Select case When :guid In (Select guid From Item Inner Join Feed on Item.feed_id = Feed.id and account_id = :accountId) Then 1 else 0 end")
abstract suspend fun itemExists(guid: String, accountId: Int): Boolean
} }