diff --git a/AltStoreCore/Components/Keychain.swift b/AltStoreCore/Components/Keychain.swift index 519b197b..ef45ad8e 100644 --- a/AltStoreCore/Components/Keychain.swift +++ b/AltStoreCore/Components/Keychain.swift @@ -74,6 +74,9 @@ public class Keychain @KeychainItem(key: "patreonCreatorAccessToken") public var patreonCreatorAccessToken: String? + @KeychainItem(key: "patreonAccountID") + public var patreonAccountID: String? + private init() { } diff --git a/AltStoreCore/Model/DatabaseManager.swift b/AltStoreCore/Model/DatabaseManager.swift index 4a99ca0b..44006365 100644 --- a/AltStoreCore/Model/DatabaseManager.swift +++ b/AltStoreCore/Model/DatabaseManager.swift @@ -151,8 +151,12 @@ public extension DatabaseManager func patreonAccount(in context: NSManagedObjectContext = DatabaseManager.shared.viewContext) -> PatreonAccount? { - let patronAccount = PatreonAccount.first(in: context) - return patronAccount + guard let patreonAccountID = Keychain.shared.patreonAccountID else { return nil } + + let predicate = NSPredicate(format: "%K == %@", #keyPath(PatreonAccount.identifier), patreonAccountID) + + let patreonAccount = PatreonAccount.first(satisfying: predicate, in: context) + return patreonAccount } } diff --git a/AltStoreCore/Patreon/PatreonAPI.swift b/AltStoreCore/Patreon/PatreonAPI.swift index fb9308a8..96a87a1e 100644 --- a/AltStoreCore/Patreon/PatreonAPI.swift +++ b/AltStoreCore/Patreon/PatreonAPI.swift @@ -120,7 +120,15 @@ public extension PatreonAPI Keychain.shared.patreonAccessToken = accessToken Keychain.shared.patreonRefreshToken = refreshToken - self.fetchAccount(completion: completion) + self.fetchAccount { (result) in + switch result + { + case .success(let account): Keychain.shared.patreonAccountID = account.identifier + case .failure: break + } + + completion(result) + } } } } @@ -238,8 +246,10 @@ public extension PatreonAPI DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in do { - let accounts = PatreonAccount.all(in: context, requestProperties: [\FetchRequest.returnsObjectsAsFaults: true]) - accounts.forEach(context.delete(_:)) + if let account = DatabaseManager.shared.patreonAccount(in: context) + { + context.delete(account) + } self.deactivateBetaApps(in: context) @@ -247,6 +257,7 @@ public extension PatreonAPI Keychain.shared.patreonAccessToken = nil Keychain.shared.patreonRefreshToken = nil + Keychain.shared.patreonAccountID = nil completion(.success(())) }