Add check so that we don't update article statuses for articles that we have pending statuses to send. Issue #1515

This commit is contained in:
Maurice Parker
2020-01-02 18:21:18 -07:00
parent aaa11e1343
commit 915d73785c
3 changed files with 40 additions and 7 deletions

View File

@@ -1073,11 +1073,13 @@ private extension FeedbinAccountDelegate {
return
}
let pendingArticleIDs = database.selectPendingReadStatusArticleIDs()
let feedbinUnreadArticleIDs = Set(articleIDs.map { String($0) } )
let updatableFeedbinUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(pendingArticleIDs)
let currentUnreadArticleIDs = account.fetchUnreadArticleIDs()
// Mark articles as unread
let deltaUnreadArticleIDs = feedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
let deltaUnreadArticleIDs = updatableFeedbinUnreadArticleIDs.subtracting(currentUnreadArticleIDs)
let markUnreadArticles = account.fetchArticles(.articleIDs(deltaUnreadArticleIDs))
account.update(markUnreadArticles, statusKey: .read, flag: false)
@@ -1087,7 +1089,7 @@ private extension FeedbinAccountDelegate {
account.ensureStatuses(missingUnreadArticleIDs, true, .read, false)
// Mark articles as read
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(feedbinUnreadArticleIDs)
let deltaReadArticleIDs = currentUnreadArticleIDs.subtracting(updatableFeedbinUnreadArticleIDs)
let markReadArticles = account.fetchArticles(.articleIDs(deltaReadArticleIDs))
account.update(markReadArticles, statusKey: .read, flag: true)
@@ -1095,7 +1097,7 @@ private extension FeedbinAccountDelegate {
let markReadArticleIDs = Set(markReadArticles.map { $0.articleID })
let missingReadArticleIDs = deltaReadArticleIDs.subtracting(markReadArticleIDs)
account.ensureStatuses(missingReadArticleIDs, true, .read, true)
}
func syncArticleStarredState(account: Account, articleIDs: [Int]?) {
@@ -1103,11 +1105,13 @@ private extension FeedbinAccountDelegate {
return
}
let pendingArticleIDs = database.selectPendingStarredStatusArticleIDs()
let feedbinStarredArticleIDs = Set(articleIDs.map { String($0) } )
let updatableFeedbinUnreadArticleIDs = feedbinStarredArticleIDs.subtracting(pendingArticleIDs)
let currentStarredArticleIDs = account.fetchStarredArticleIDs()
// Mark articles as starred
let deltaStarredArticleIDs = feedbinStarredArticleIDs.subtracting(currentStarredArticleIDs)
let deltaStarredArticleIDs = updatableFeedbinUnreadArticleIDs.subtracting(currentStarredArticleIDs)
let markStarredArticles = account.fetchArticles(.articleIDs(deltaStarredArticleIDs))
account.update(markStarredArticles, statusKey: .starred, flag: true)
@@ -1117,7 +1121,7 @@ private extension FeedbinAccountDelegate {
account.ensureStatuses(missingStarredArticleIDs, true, .starred, true)
// Mark articles as unstarred
let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(feedbinStarredArticleIDs)
let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableFeedbinUnreadArticleIDs)
let markUnstarredArticles = account.fetchArticles(.articleIDs(deltaUnstarredArticleIDs))
account.update(markUnstarredArticles, statusKey: .starred, flag: false)
@@ -1125,6 +1129,7 @@ private extension FeedbinAccountDelegate {
let markUnstarredArticleIDs = Set(markUnstarredArticles.map { $0.articleID })
let missingUnstarredArticleIDs = deltaUnstarredArticleIDs.subtracting(markUnstarredArticleIDs)
account.ensureStatuses(missingUnstarredArticleIDs, true, .starred, false)
}
func deleteTagging(for account: Account, with feed: Feed, from container: Container?, completion: @escaping (Result<Void, Error>) -> Void) {

View File

@@ -45,7 +45,15 @@ public struct SyncDatabase {
public func resetSelectedForProcessing(_ articleIDs: [String]) {
syncStatusTable.resetSelectedForProcessing(articleIDs)
}
public func selectPendingReadStatusArticleIDs() -> [String] {
return syncStatusTable.selectPendingReadStatusArticleIDs()
}
public func selectPendingStarredStatusArticleIDs() -> [String] {
return syncStatusTable.selectPendingStarredStatusArticleIDs()
}
public func deleteSelectedForProcessing(_ articleIDs: [String]) {
syncStatusTable.deleteSelectedForProcessing(articleIDs)
}

View File

@@ -56,7 +56,15 @@ struct SyncStatusTable: DatabaseTable {
database.executeUpdate(updateSQL, withArgumentsIn: parameters)
}
}
func selectPendingReadStatusArticleIDs() -> [String] {
selectPendingArticleIDsAsync(.read)
}
func selectPendingStarredStatusArticleIDs() -> [String] {
selectPendingArticleIDsAsync(.starred)
}
func deleteSelectedForProcessing(_ articleIDs: [String]) {
queue.runInTransaction { database in
let parameters = articleIDs.map { $0 as AnyObject }
@@ -88,4 +96,16 @@ private extension SyncStatusTable {
return SyncStatus(articleID: articleID, key: key, flag: flag, selected: selected)
}
func selectPendingArticleIDsAsync(_ statusKey: ArticleStatus.Key) -> [String] {
var articleIDs: [String]? = nil
queue.runInDatabaseSync { database in
let selectSQL = "select articleID from syncStatus where selected == false and key = \"\(statusKey.rawValue)\";"
if let resultSet = database.executeQuery(selectSQL, withArgumentsIn: nil) {
articleIDs = resultSet.compactMap { $0.string(forColumnIndex: 0) }
}
}
return articleIDs != nil ? articleIDs! : [String]()
}
}