Create fetchAndProcessStarredArticleIDs function to replace FeedlyIngestStarredArticleIDsOperation.
This commit is contained in:
parent
1a99c955b0
commit
90fd697f0d
@ -57,6 +57,10 @@ final class FeedlyAccountDelegate: AccountDelegate {
|
|||||||
|
|
||||||
var refreshProgress = DownloadProgress(numberOfTasks: 0)
|
var refreshProgress = DownloadProgress(numberOfTasks: 0)
|
||||||
|
|
||||||
|
private var userID: String? {
|
||||||
|
credentials?.username
|
||||||
|
}
|
||||||
|
|
||||||
/// Set on `accountDidInitialize` for the purposes of refreshing OAuth tokens when they expire.
|
/// Set on `accountDidInitialize` for the purposes of refreshing OAuth tokens when they expire.
|
||||||
/// See the implementation for `FeedlyAPICallerDelegate`.
|
/// See the implementation for `FeedlyAPICallerDelegate`.
|
||||||
private weak var account: Account?
|
private weak var account: Account?
|
||||||
@ -830,6 +834,80 @@ final class FeedlyAccountDelegate: AccountDelegate {
|
|||||||
return try await account.fetchArticleIDsForStatusesWithoutArticlesNewerThanCutoffDate()
|
return try await account.fetchArticleIDsForStatusesWithoutArticlesNewerThanCutoffDate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fetchRemoteStarredArticleIDs() async throws -> Set<String> {
|
||||||
|
|
||||||
|
guard let userID else { return Set<String>() }
|
||||||
|
|
||||||
|
let resource = FeedlyTagResourceID.Global.saved(for: userID)
|
||||||
|
var remoteArticleIDs = Set<String>()
|
||||||
|
|
||||||
|
func fetchIDs(_ continuation: String? = nil) async throws {
|
||||||
|
let streamIDs = try await caller.getStreamIDs(for: resource, continuation: continuation, newerThan: nil, unreadOnly: nil)
|
||||||
|
remoteArticleIDs.formUnion(streamIDs.ids)
|
||||||
|
|
||||||
|
guard let continuation = streamIDs.continuation else { // finished fetching article IDs?
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try await fetchIDs(continuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
try await fetchIDs()
|
||||||
|
return remoteArticleIDs
|
||||||
|
}
|
||||||
|
|
||||||
|
func processStarredArticleIDs(remoteArticleIDs: Set<String>) async throws {
|
||||||
|
|
||||||
|
guard let account else { return }
|
||||||
|
|
||||||
|
var remoteArticleIDs = remoteArticleIDs
|
||||||
|
|
||||||
|
func removeEntryIDsWithPendingStatus() async throws {
|
||||||
|
|
||||||
|
if let pendingArticleIDs = try await syncDatabase.selectPendingStarredStatusArticleIDs() {
|
||||||
|
remoteArticleIDs.subtract(pendingArticleIDs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func process() async throws {
|
||||||
|
|
||||||
|
let localStarredArticleIDs = (try await account.fetchStarredArticleIDs()) ?? Set<String>()
|
||||||
|
|
||||||
|
var markAsStarredError: Error?
|
||||||
|
var markAsUnstarredError: Error?
|
||||||
|
|
||||||
|
let remoteStarredArticleIDs = remoteArticleIDs
|
||||||
|
do {
|
||||||
|
try await account.markAsStarred(remoteStarredArticleIDs)
|
||||||
|
} catch {
|
||||||
|
markAsStarredError = error
|
||||||
|
}
|
||||||
|
|
||||||
|
let deltaUnstarredArticleIDs = localStarredArticleIDs.subtracting(remoteStarredArticleIDs)
|
||||||
|
do {
|
||||||
|
try await account.markAsUnstarred(deltaUnstarredArticleIDs)
|
||||||
|
} catch {
|
||||||
|
markAsUnstarredError = error
|
||||||
|
}
|
||||||
|
|
||||||
|
if let markingError = markAsStarredError ?? markAsUnstarredError {
|
||||||
|
throw markingError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try await removeEntryIDsWithPendingStatus()
|
||||||
|
try await process()
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchAndProcessStarredArticleIDs() async throws {
|
||||||
|
|
||||||
|
// To replace FeedlyIngestStarredArticleIDsOperation
|
||||||
|
|
||||||
|
let remoteArticleIDs = try await fetchRemoteStarredArticleIDs()
|
||||||
|
try await processStarredArticleIDs(remoteArticleIDs: remoteArticleIDs)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: Suspend and Resume (for iOS)
|
// MARK: Suspend and Resume (for iOS)
|
||||||
|
|
||||||
/// Suspend all network activity
|
/// Suspend all network activity
|
||||||
|
Loading…
x
Reference in New Issue
Block a user