Files
SideStore/SideStoreApp/Sources/SideStoreAppKit/Operations/FetchAppIDsOperation.swift

66 lines
2.4 KiB
Swift
Raw Normal View History

//
// FetchAppIDsOperation.swift
// AltStore
//
// Created by Riley Testut on 1/27/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
import Foundation
import AltSign
2023-03-01 00:48:36 -05:00
import SideStoreCore
2023-03-01 14:36:52 -05:00
import RoxasUIKit
@objc(FetchAppIDsOperation)
2023-03-01 00:48:36 -05:00
final class FetchAppIDsOperation: ResultOperation<([AppID], NSManagedObjectContext)> {
let context: AuthenticatedOperationContext
let managedObjectContext: NSManagedObjectContext
2023-03-01 00:48:36 -05:00
init(context: AuthenticatedOperationContext, managedObjectContext: NSManagedObjectContext = DatabaseManager.shared.persistentContainer.newBackgroundContext()) {
self.context = context
self.managedObjectContext = managedObjectContext
2023-03-01 00:48:36 -05:00
super.init()
}
2023-03-01 00:48:36 -05:00
override func main() {
super.main()
2023-03-01 00:48:36 -05:00
if let error = context.error {
finish(.failure(error))
return
}
2023-03-01 00:48:36 -05:00
guard
2023-03-01 00:48:36 -05:00
let team = context.team,
let session = context.session
else { return finish(.failure(OperationError.invalidParameters)) }
ALTAppleAPI.shared.fetchAppIDs(for: team, session: session) { appIDs, error in
self.managedObjectContext.perform {
2023-03-01 00:48:36 -05:00
do {
let fetchedAppIDs = try Result(appIDs, error).get()
2023-03-01 00:48:36 -05:00
guard let team = Team.first(satisfying: NSPredicate(format: "%K == %@", #keyPath(Team.identifier), team.identifier), in: self.managedObjectContext) else { throw OperationError.notAuthenticated }
2023-03-01 00:48:36 -05:00
let fetchedIdentifiers = fetchedAppIDs.map { $0.identifier }
2023-03-01 00:48:36 -05:00
let deletedAppIDsRequest = AppID.fetchRequest() as NSFetchRequest<AppID>
deletedAppIDsRequest.predicate = NSPredicate(format: "%K == %@ AND NOT (%K IN %@)",
#keyPath(AppID.team), team,
#keyPath(AppID.identifier), fetchedIdentifiers)
2023-03-01 00:48:36 -05:00
let deletedAppIDs = try self.managedObjectContext.fetch(deletedAppIDsRequest)
deletedAppIDs.forEach { self.managedObjectContext.delete($0) }
2023-03-01 00:48:36 -05:00
let appIDs = fetchedAppIDs.map { AppID($0, team: team, context: self.managedObjectContext) }
self.finish(.success((appIDs, self.managedObjectContext)))
2023-03-01 00:48:36 -05:00
} catch {
self.finish(.failure(error))
}
}
}
}
}