Perform a one-time (per local account) cleanup made necessary by the retention policy change — mark articles older than the 90-day window as read. This way users won’t get a flood of old, unread articles when they run this new version.
This commit is contained in:
parent
b2b000dd2e
commit
75d2158163
@ -279,7 +279,19 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
|||||||
webFeedMetadataFile.load()
|
webFeedMetadataFile.load()
|
||||||
opmlFile.load()
|
opmlFile.load()
|
||||||
|
|
||||||
|
var shouldHandleRetentionPolicyChange = false
|
||||||
|
if type == .onMyMac {
|
||||||
|
let didHandlePolicyChange = metadata.performedApril2020RetentionPolicyChange ?? false
|
||||||
|
shouldHandleRetentionPolicyChange = !didHandlePolicyChange
|
||||||
|
}
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
|
if shouldHandleRetentionPolicyChange {
|
||||||
|
// Handle one-time database changes made necessary by April 2020 retention policy change.
|
||||||
|
self.database.performApril2020RetentionPolicyChange()
|
||||||
|
self.metadata.performedApril2020RetentionPolicyChange = true
|
||||||
|
}
|
||||||
|
|
||||||
self.database.cleanupDatabaseAtStartup(subscribedToWebFeedIDs: self.flattenedWebFeeds().webFeedIDs())
|
self.database.cleanupDatabaseAtStartup(subscribedToWebFeedIDs: self.flattenedWebFeeds().webFeedIDs())
|
||||||
self.fetchAllUnreadCounts()
|
self.fetchAllUnreadCounts()
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ final class AccountMetadata: Codable {
|
|||||||
case lastArticleFetchEndTime
|
case lastArticleFetchEndTime
|
||||||
case endpointURL
|
case endpointURL
|
||||||
case lastCredentialRenewTime = "lastCredentialRenewTime"
|
case lastCredentialRenewTime = "lastCredentialRenewTime"
|
||||||
|
case performedApril2020RetentionPolicyChange
|
||||||
}
|
}
|
||||||
|
|
||||||
var name: String? {
|
var name: String? {
|
||||||
@ -92,6 +93,14 @@ final class AccountMetadata: Codable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var performedApril2020RetentionPolicyChange: Bool? {
|
||||||
|
didSet {
|
||||||
|
if performedApril2020RetentionPolicyChange != oldValue {
|
||||||
|
valueDidChange(.performedApril2020RetentionPolicyChange)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
weak var delegate: AccountMetadataDelegate?
|
weak var delegate: AccountMetadataDelegate?
|
||||||
|
|
||||||
func valueDidChange(_ key: CodingKeys) {
|
func valueDidChange(_ key: CodingKeys) {
|
||||||
|
@ -277,6 +277,24 @@ public final class ArticlesDatabase {
|
|||||||
articlesTable.deleteArticlesNotInSubscribedToFeedIDs(subscribedToWebFeedIDs)
|
articlesTable.deleteArticlesNotInSubscribedToFeedIDs(subscribedToWebFeedIDs)
|
||||||
articlesTable.deleteOldStatuses()
|
articlesTable.deleteOldStatuses()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Do database cleanups made necessary by the retention policy change in April 2020.
|
||||||
|
///
|
||||||
|
/// The retention policy for feed-based systems changed in April 2020:
|
||||||
|
/// we keep articles only for as long as they’re in the feed.
|
||||||
|
/// This change could result in a bunch of older articles suddenly
|
||||||
|
/// appearing as unread articles.
|
||||||
|
///
|
||||||
|
/// These are articles that were in the database,
|
||||||
|
/// but weren’t appearing in the UI because they were beyond the 90-day window.
|
||||||
|
/// (The previous retention policy used a 90-day window.)
|
||||||
|
///
|
||||||
|
/// This function marks everything as read that’s beyond that 90-day window.
|
||||||
|
/// It’s intended to be called only once on an account.
|
||||||
|
public func performApril2020RetentionPolicyChange() {
|
||||||
|
precondition(retentionStyle == .feedBased)
|
||||||
|
articlesTable.markOlderStatusesAsRead()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
@ -580,6 +580,22 @@ final class ArticlesTable: DatabaseTable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mark statuses beyond the 90-day window as read.
|
||||||
|
///
|
||||||
|
/// This is not intended for wide use: this is part of implementing
|
||||||
|
/// the April 2020 retention policy change for feed-based accounts.
|
||||||
|
func markOlderStatusesAsRead() {
|
||||||
|
queue.runInDatabase { databaseResult in
|
||||||
|
guard let database = databaseResult.database else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let sql = "update statuses set read = true where dateArrived<?;"
|
||||||
|
let parameters = [self.articleCutoffDate] as [Any]
|
||||||
|
database.executeUpdate(sql, withArgumentsIn: parameters)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
Loading…
x
Reference in New Issue
Block a user