Procházet zdrojové kódy

fix insulin deletion in history

polscm32 před 2 roky
rodič
revize
1a0f53137c

+ 2 - 1
FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift

@@ -1,3 +1,4 @@
+import CoreData
 import Foundation
 import SwiftUI
 
@@ -218,5 +219,5 @@ enum DataTable {
 
 protocol DataTableProvider: Provider {
     func deleteCarbs(_ treatment: CarbEntryStored)
-    func deleteInsulin(_ treatment: PumpEventStored)
+    func deleteInsulin(with treatmentObjectID: NSManagedObjectID)
 }

+ 23 - 4
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -1,3 +1,4 @@
+import CoreData
 import Foundation
 
 extension DataTable {
@@ -16,10 +17,28 @@ extension DataTable {
 //            nightscoutManager.deleteCarbs(treatment, complexMeal: false)
         }
 
-        func deleteInsulin(_ treatment: PumpEventStored) {
-            nightscoutManager.deleteInsulin(at: treatment.timestamp ?? Date())
-            let id = treatment.id
-            healthkitManager.deleteInsulin(syncID: id)
+        func deleteInsulin(with treatmentObjectID: NSManagedObjectID) {
+            let taskContext = CoreDataStack.shared.newTaskContext()
+
+            taskContext.perform {
+                do {
+                    guard let treatmentToDelete = try taskContext.existingObject(with: treatmentObjectID) as? PumpEventStored
+                    else {
+                        debug(.default, "Could not cast the object to PumpEventStored")
+                        return
+                    }
+                    self.nightscoutManager.deleteInsulin(at: treatmentToDelete.timestamp ?? Date())
+                    let id = treatmentToDelete.id
+                    self.healthkitManager.deleteInsulin(syncID: id)
+
+                    taskContext.delete(treatmentToDelete)
+                    try taskContext.save()
+
+                    debug(.default, "Successfully deleted the treatment object.")
+                } catch {
+                    debug(.default, "Failed to delete the treatment object: \(error.localizedDescription)")
+                }
+            }
         }
 
         func deleteManualGlucose(date: Date?) {

+ 5 - 15
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -112,33 +112,23 @@ extension DataTable {
             }
         }
 
-        @MainActor func invokeInsulinDeletionTask(_ treatment: PumpEventStored) {
+        @MainActor func invokeInsulinDeletionTask(_ treatmentObjectID: NSManagedObjectID) {
             Task {
                 do {
-                    await deleteInsulin(treatment)
+                    await deleteInsulin(treatmentObjectID)
                     insulinEntryDeleted = true
                     waitForSuggestion = true
                 }
             }
         }
 
-        func deleteInsulin(_ treatment: PumpEventStored) async {
+        func deleteInsulin(_ treatmentObjectID: NSManagedObjectID) async {
             do {
                 let authenticated = try await unlockmanager.unlock()
                 if authenticated {
-                    do {
-                        coredataContext.delete(treatment)
-                        try coredataContext.save()
-                        debugPrint(
-                            "Data Table State: \(#function) \(DebuggingIdentifiers.succeeded) deleted insulin from core data"
-                        )
-                    } catch {
-                        debugPrint(
-                            "Data Table State: \(#function) \(DebuggingIdentifiers.failed) error while deleting insulin from core data"
-                        )
-                    }
+                    CoreDataStack.shared.deleteObject(identifiedBy: treatmentObjectID)
 
-                    provider.deleteInsulin(treatment)
+                    provider.deleteInsulin(with: treatmentObjectID)
                     apsManager.determineBasalSync()
                 } else {
                     print("authentication failed")

+ 2 - 1
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -425,8 +425,9 @@ extension DataTable {
                         debug(.default, "Cannot gracefully unwrap alertTreatmentToDelete!")
                         return
                     }
+                    let treatmentObjectID = treatmentToDelete.objectID
 
-                    state.invokeInsulinDeletionTask(treatmentToDelete)
+                    state.invokeInsulinDeletionTask(treatmentObjectID)
                 }
             } message: {
                 Text("\n" + NSLocalizedString(alertMessage, comment: ""))

+ 10 - 6
Model/CoreDataStack.swift

@@ -78,7 +78,7 @@ class CoreDataStack: ObservableObject {
     }()
 
     /// Creates and configures a private queue context
-    private func newTaskContext() -> NSManagedObjectContext {
+    func newTaskContext() -> NSManagedObjectContext {
         // Create a private queue context
         /// - Tag: newBackgroundContext
         let taskContext = persistentContainer.newBackgroundContext()
@@ -151,20 +151,24 @@ class CoreDataStack: ObservableObject {
 // MARK: - Delete
 
 extension CoreDataStack {
-    /// Synchronously delete entries with specified object IDs
+    /// Synchronously delete entry with specified object IDs
     ///  - Tag: synchronousDelete
-    func deleteObject(identifiedBy objectIDs: [NSManagedObjectID]) {
+    func deleteObject(identifiedBy objectID: NSManagedObjectID) {
         let viewContext = persistentContainer.viewContext
         debugPrint("Start deleting data from the store ...\(DebuggingIdentifiers.inProgress)")
 
         viewContext.perform {
-            objectIDs.forEach { objectID in
+            do {
                 let entryToDelete = viewContext.object(with: objectID)
                 viewContext.delete(entryToDelete)
+
+                guard viewContext.hasChanges else { return }
+                try viewContext.save()
+                debugPrint("Successfully deleted data. \(DebuggingIdentifiers.succeeded)")
+            } catch {
+                debugPrint("Failed to delete data: \(error.localizedDescription)")
             }
         }
-
-        debugPrint("Successfully deleted data. \(DebuggingIdentifiers.succeeded)")
     }
 
     /// Asynchronously deletes records

+ 1 - 5
PumpEventStored+CoreDataProperties.swift

@@ -17,10 +17,6 @@ extension PumpEventStored: Identifiable {}
 
 public extension PumpEventStored {
     var id: String {
-        #if DEBUG
-            return id_!
-        #else
-            return id_ ?? UUID().uuidString
-        #endif
+        id_ ?? UUID().uuidString
     }
 }