Clean up dangling module preferences (#999)
Erase on module removal, reference is otherwise lost forever.
This commit is contained in:
parent
16a59c6de1
commit
ff88b3562d
|
@ -106,6 +106,13 @@ private final class CDModulePreferencesRepositoryV3: ModulePreferencesRepository
|
|||
}
|
||||
}
|
||||
|
||||
func erase() {
|
||||
context.performAndWait {
|
||||
entity.excludedEndpoints?.forEach(context.delete)
|
||||
context.delete(entity)
|
||||
}
|
||||
}
|
||||
|
||||
func save() throws {
|
||||
try context.performAndWait {
|
||||
guard context.hasChanges else {
|
||||
|
|
|
@ -43,6 +43,9 @@ struct ProfileCoordinator: View {
|
|||
@EnvironmentObject
|
||||
private var iapManager: IAPManager
|
||||
|
||||
@EnvironmentObject
|
||||
private var preferencesManager: PreferencesManager
|
||||
|
||||
let profileManager: ProfileManager
|
||||
|
||||
let profileEditor: ProfileEditor
|
||||
|
@ -133,7 +136,7 @@ private extension ProfileCoordinator {
|
|||
|
||||
// standard: always save, warn if purchase required
|
||||
func onCommitEditingStandard() async throws {
|
||||
let savedProfile = try await profileEditor.save(to: profileManager)
|
||||
let savedProfile = try await profileEditor.save(to: profileManager, preferencesManager: preferencesManager)
|
||||
do {
|
||||
try iapManager.verify(savedProfile)
|
||||
} catch AppError.ineligibleProfile(let requiredFeatures) {
|
||||
|
@ -151,7 +154,7 @@ private extension ProfileCoordinator {
|
|||
paywallReason = .init(requiredFeatures)
|
||||
return
|
||||
}
|
||||
try await profileEditor.save(to: profileManager)
|
||||
try await profileEditor.save(to: profileManager, preferencesManager: preferencesManager)
|
||||
onDismiss()
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,10 @@ public final class ModulePreferences: ObservableObject, ModulePreferencesReposit
|
|||
repository?.removeExcludedEndpoint(endpoint)
|
||||
}
|
||||
|
||||
public func erase() {
|
||||
repository?.erase()
|
||||
}
|
||||
|
||||
public func save() throws {
|
||||
try repository?.save()
|
||||
}
|
||||
|
|
|
@ -70,6 +70,9 @@ private final class DummyModulePreferencesRepository: ModulePreferencesRepositor
|
|||
func removeExcludedEndpoint(_ endpoint: ExtendedEndpoint) {
|
||||
}
|
||||
|
||||
func erase() {
|
||||
}
|
||||
|
||||
func save() throws {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,5 +34,7 @@ public protocol ModulePreferencesRepository {
|
|||
|
||||
func removeExcludedEndpoint(_ endpoint: ExtendedEndpoint)
|
||||
|
||||
func erase()
|
||||
|
||||
func save() throws
|
||||
}
|
||||
|
|
|
@ -188,7 +188,6 @@ extension ProfileEditor {
|
|||
|
||||
// update local view
|
||||
editableProfile.modules = profile.modulesBuilders()
|
||||
removedModules.removeAll()
|
||||
|
||||
return profile
|
||||
}
|
||||
|
@ -204,10 +203,23 @@ extension ProfileEditor {
|
|||
}
|
||||
|
||||
@discardableResult
|
||||
public func save(to profileManager: ProfileManager) async throws -> Profile {
|
||||
public func save(to profileManager: ProfileManager, preferencesManager: PreferencesManager) async throws -> Profile {
|
||||
do {
|
||||
let newProfile = try build()
|
||||
try await profileManager.save(newProfile, isLocal: true, remotelyShared: isShared)
|
||||
|
||||
removedModules.keys.forEach {
|
||||
do {
|
||||
pp_log(.App.profiles, .info, "Erase preferences for removed module \($0)")
|
||||
let repository = try preferencesManager.preferencesRepository(forModuleWithId: $0)
|
||||
repository.erase()
|
||||
try repository.save()
|
||||
} catch {
|
||||
pp_log(.App.profiles, .error, "Unable to erase preferences for removed module \($0): \(error)")
|
||||
}
|
||||
}
|
||||
removedModules.removeAll()
|
||||
|
||||
return newProfile
|
||||
} catch {
|
||||
pp_log(.App.profiles, .fault, "Unable to save edited profile: \(error)")
|
||||
|
|
|
@ -251,7 +251,7 @@ extension ProfileEditorTests {
|
|||
}
|
||||
.store(in: &subscriptions)
|
||||
|
||||
try await sut.save(to: manager)
|
||||
try await sut.save(to: manager, preferencesManager: PreferencesManager())
|
||||
await fulfillment(of: [exp])
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue