Преглед изворни кода

Refactor Glucose and Insulin deletion, fixes for concurrently executed code

polscm32 пре 1 година
родитељ
комит
5755ef47f8

+ 27 - 25
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -18,6 +18,7 @@ protocol GlucoseStorage {
     func getGlucoseNotYetUploadedToHealth() async -> [BloodGlucose]
     func getManualGlucoseNotYetUploadedToHealth() async -> [BloodGlucose]
     var alarm: GlucoseAlarm? { get }
+    func deleteGlucose(_ treatmentObjectID: NSManagedObjectID) async
 }
 
 final class BaseGlucoseStorage: GlucoseStorage, Injectable {
@@ -381,32 +382,33 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
                     noise: nil,
                     glucose: Int(result.glucose)
                 )
+            }
+        }
+    }
+
+    func deleteGlucose(_ treatmentObjectID: NSManagedObjectID) async {
+        let taskContext = CoreDataStack.shared.newTaskContext()
+        taskContext.name = "deleteContext"
+        taskContext.transactionAuthor = "deleteGlucose"
+
+        await taskContext.perform {
+            do {
+                let result = try taskContext.existingObject(with: treatmentObjectID) as? GlucoseStored
+
+                guard let glucoseToDelete = result else {
+                    debugPrint("Data Table State: \(#function) \(DebuggingIdentifiers.failed) glucose not found in core data")
+                    return
+                }
 
-//                NightscoutTreatment(
-//                    duration: nil,
-//                    rawDuration: nil,
-//                    rawRate: nil,
-//                    absolute: nil,
-//                    rate: nil,
-//                    eventType: .capillaryGlucose,
-//                    createdAt: result.date,
-//                    enteredBy: "Trio",
-//                    bolus: nil,
-//                    insulin: nil,
-//                    notes: "Trio User",
-//                    carbs: nil,
-//                    fat: nil,
-//                    protein: nil,
-//                    foodType: nil,
-//                    targetTop: nil,
-//                    targetBottom: nil,
-//                    glucoseType: "Manual",
-//                    glucose: self.settingsManager.settings
-//                        .units == .mgdL ? (self.glucoseFormatter.string(from: Int(result.glucose) as NSNumber) ?? "")
-//                        : (self.glucoseFormatter.string(from: Decimal(result.glucose).asMmolL as NSNumber) ?? ""),
-//                    units: self.settingsManager.settings.units == .mmolL ? "mmol" : "mg/dl",
-//                    id: result.id?.uuidString
-//                )
+                taskContext.delete(glucoseToDelete)
+
+                guard taskContext.hasChanges else { return }
+                try taskContext.save()
+                debugPrint("\(#file) \(#function) \(DebuggingIdentifiers.succeeded) deleted glucose from core data")
+            } catch {
+                debugPrint(
+                    "\(#file) \(#function) \(DebuggingIdentifiers.failed) error while deleting glucose from core data: \(error.localizedDescription)"
+                )
             }
         }
     }

+ 25 - 17
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -47,9 +47,17 @@ extension DataTable {
         }
 
         func deleteGlucose(_ treatmentObjectID: NSManagedObjectID) async {
+            // Delete from Apple Health/Tidepool
+            await deleteGlucoseFromServices(treatmentObjectID)
+
+            // Delete from Core Data
+            await glucoseStorage.deleteGlucose(treatmentObjectID)
+        }
+
+        func deleteGlucoseFromServices(_ treatmentObjectID: NSManagedObjectID) async {
             let taskContext = CoreDataStack.shared.newTaskContext()
             taskContext.name = "deleteContext"
-            taskContext.transactionAuthor = "deleteGlucose"
+            taskContext.transactionAuthor = "deleteGlucoseFromServices"
 
             await taskContext.perform {
                 do {
@@ -60,26 +68,22 @@ extension DataTable {
                         return
                     }
 
-                    // Delete Manual Glucose from Nightscout
-                    if glucoseToDelete.isManual == true {
-                        if let id = glucoseToDelete.id?.uuidString {
-                            self.provider.deleteManualGlucoseFromNightscout(withID: id)
-                        }
+                    // Delete from Nightscout
+                    if let id = glucoseToDelete.id?.uuidString {
+                        self.provider.deleteManualGlucoseFromNightscout(withID: id)
                     }
 
-                    // Delete Glucose from Apple Health
+                    // Delete from Apple Health
                     if let id = glucoseToDelete.id?.uuidString {
                         self.provider.deleteGlucoseFromHealth(withSyncID: id)
                     }
 
-                    taskContext.delete(glucoseToDelete)
-
-                    guard taskContext.hasChanges else { return }
-                    try taskContext.save()
-                    debugPrint("Data Table State: \(#function) \(DebuggingIdentifiers.succeeded) deleted glucose from core data")
+                    debugPrint(
+                        "\(#file) \(#function) \(DebuggingIdentifiers.succeeded) deleted glucose from Apple Health/Nightscout"
+                    )
                 } catch {
                     debugPrint(
-                        "Data Table State: \(#function) \(DebuggingIdentifiers.failed) error while deleting glucose from core data: \(error.localizedDescription)"
+                        "\(#file) \(#function) \(DebuggingIdentifiers.failed) error while deleting glucose from Apple Health/Nightscout with error: \(error.localizedDescription)"
                     )
                 }
             }
@@ -125,7 +129,7 @@ extension DataTable {
                     }
 
                     if carbEntry.isFPU, let fpuID = carbEntry.fpuID {
-                        // Delete FPUs from Nightscout
+                        // Delete Fat and Protein entries from Nightscout
                         self.provider.deleteCarbsFromNightscout(withID: fpuID.uuidString)
 
                         // Delete Fat and Protein entries from Apple Health
@@ -152,7 +156,9 @@ extension DataTable {
                     }
 
                 } catch {
-                    debugPrint("\(DebuggingIdentifiers.failed) Error deleting carb entry from Apple Health/Nightscout with error: \(error.localizedDescription)")
+                    debugPrint(
+                        "\(DebuggingIdentifiers.failed) Error deleting carb entry from Apple Health/Nightscout with error: \(error.localizedDescription)"
+                    )
                 }
             }
         }
@@ -178,10 +184,10 @@ extension DataTable {
                     debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Authentication Error")
                     return
                 }
-                
+
                 // Delete from Apple Health/Nightscout
                 await deleteInsulinFromServices(with: treatmentObjectID)
-                
+
                 // Delete from Core Data
                 await CoreDataStack.shared.deleteObject(identifiedBy: treatmentObjectID)
 
@@ -196,6 +202,8 @@ extension DataTable {
 
         func deleteInsulinFromServices(with treatmentObjectID: NSManagedObjectID) async {
             let taskContext = CoreDataStack.shared.newTaskContext()
+            taskContext.name = "deleteContext"
+            taskContext.transactionAuthor = "deleteInsulinFromServices"
 
             await taskContext.perform {
                 do {