ソースを参照

Delete Insulin, small Fixes. To do: fix deletion of Fat/ Protein by ID

polscm32 1 年間 前
コミット
9dea58d04c

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

@@ -224,4 +224,5 @@ protocol DataTableProvider: Provider {
     func deleteManualGlucoseFromNightscout(withID id: String)
     func deleteGlucoseFromHealth(withSyncID id: String)
     func deleteMealDataFromHealth(byID id: String, sampleType: HKSampleType)
+    func deleteInsulinFromHealth(withSyncID id: String)
 }

+ 7 - 0
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -28,6 +28,13 @@ extension DataTable {
             }
         }
 
+        func deleteInsulinFromHealth(withSyncID id: String) {
+            Task.detached { [weak self] in
+                guard let self = self else { return }
+                await self.healthkitManager.deleteInsulin(syncID: id)
+            }
+        }
+
         func deleteManualGlucoseFromNightscout(withID id: String) {
             Task.detached { [weak self] in
                 guard let self = self else { return }

+ 11 - 9
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -89,8 +89,11 @@ extension DataTable {
         func invokeCarbDeletionTask(_ treatmentObjectID: NSManagedObjectID) {
             Task {
                 await deleteCarbs(treatmentObjectID)
-                carbEntryDeleted = true
-                waitForSuggestion = true
+
+                await MainActor.run {
+                    carbEntryDeleted = true
+                    waitForSuggestion = true
+                }
             }
         }
 
@@ -174,8 +177,11 @@ extension DataTable {
         func invokeInsulinDeletionTask(_ treatmentObjectID: NSManagedObjectID) {
             Task {
                 await invokeInsulinDeletion(treatmentObjectID)
-                insulinEntryDeleted = true
-                waitForSuggestion = true
+
+                await MainActor.run {
+                    insulinEntryDeleted = true
+                    waitForSuggestion = true
+                }
             }
         }
 
@@ -217,13 +223,9 @@ extension DataTable {
                     // Delete Insulin from Nightscout
                     if let id = treatmentToDelete.id {
                         self.provider.deleteInsulinFromNightscout(withID: id)
+                        self.provider.deleteInsulinFromHealth(withSyncID: id)
                     }
 
-                    // TODO: - Rewrite healthkit implementation
-
-//                    let id = treatmentToDelete.id
-//                    self.healthkitManager.deleteInsulin(syncID: id)
-
                     taskContext.delete(treatmentToDelete)
                     try taskContext.save()
 

+ 26 - 63
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -29,7 +29,7 @@ protocol HealthKitManager: GlucoseSource {
     /// delete carbs with syncID
     func deleteMealData(byID id: String, sampleType: HKSampleType) async
     /// delete insulin with syncID
-    func deleteInsulin(syncID: String)
+    func deleteInsulin(syncID: String) async
 }
 
 public enum AppleHealthConfig {
@@ -461,6 +461,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsStoredDeleg
     }
 
     func deleteMealData(byID id: String, sampleType: HKSampleType) async {
+        guard settingsManager.settings.useAppleHealth else { return }
+
         let predicate = HKQuery.predicateForObjects(
             withMetadataKey: HKMetadataKeySyncIdentifier,
             operatorType: .equalTo,
@@ -475,6 +477,29 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsStoredDeleg
         }
     }
 
+    func deleteInsulin(syncID: String) async {
+        guard settingsManager.settings.useAppleHealth,
+              let sampleType = AppleHealthConfig.healthInsulinObject,
+              checkAvailabilitySave(objectTypeToHealthStore: sampleType)
+        else {
+            debug(.service, "HealthKit permissions are not available for insulin deletion.")
+            return
+        }
+
+        let predicate = HKQuery.predicateForObjects(
+            withMetadataKey: HKMetadataKeySyncIdentifier,
+            operatorType: .equalTo,
+            value: syncID
+        )
+
+        do {
+            try await deleteObjects(of: sampleType, predicate: predicate)
+            debug(.service, "Successfully deleted insulin sample with syncID: \(syncID)")
+        } catch {
+            warning(.service, "Failed to delete insulin sample with syncID: \(syncID)", error: error)
+        }
+    }
+
     private func deleteObjects(of sampleType: HKSampleType, predicate: NSPredicate) async throws {
         try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
             healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { success, _, error in
@@ -635,68 +660,6 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsStoredDeleg
     func fetchIfNeeded() -> AnyPublisher<[BloodGlucose], Never> {
         fetch(nil)
     }
-
-    // - MARK Carbs function
-
-    func deleteCarbs(syncID: String, fpuID: String) {
-        guard settingsManager.settings.useAppleHealth,
-              let sampleType = AppleHealthConfig.healthCarbObject,
-              checkAvailabilitySave(objectTypeToHealthStore: sampleType)
-        else { return }
-
-        print("meals 4: ID: " + syncID + " FPU ID: " + fpuID)
-
-        if syncID != "" {
-            let predicate = HKQuery.predicateForObjects(
-                withMetadataKey: HKMetadataKeySyncIdentifier,
-                operatorType: .equalTo,
-                value: syncID
-            )
-
-            healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in
-                guard let error = error else { return }
-                warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error)
-            }
-        }
-
-        if fpuID != "" {
-            // processQueue.async {
-            let recentCarbs: [CarbsEntry] = carbsStorage.recent()
-            let ids = recentCarbs.filter { $0.fpuID == fpuID }.compactMap(\.id)
-            let predicate = HKQuery.predicateForObjects(
-                withMetadataKey: HKMetadataKeySyncIdentifier,
-                allowedValues: ids
-            )
-            print("found IDs: " + ids.description)
-            healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in
-                guard let error = error else { return }
-                warning(.service, "Cannot delete sample with fpuID: \(fpuID)", error: error)
-            }
-            // }
-        }
-    }
-
-    // - MARK Insulin function
-
-    func deleteInsulin(syncID: String) {
-        guard settingsManager.settings.useAppleHealth,
-              let sampleType = AppleHealthConfig.healthInsulinObject,
-              checkAvailabilitySave(objectTypeToHealthStore: sampleType)
-        else { return }
-
-        processQueue.async {
-            let predicate = HKQuery.predicateForObjects(
-                withMetadataKey: HKMetadataKeySyncIdentifier,
-                operatorType: .equalTo,
-                value: syncID
-            )
-
-            self.healthKitStore.deleteObjects(of: sampleType, predicate: predicate) { _, _, error in
-                guard let error = error else { return }
-                warning(.service, "Cannot delete sample with syncID: \(syncID)", error: error)
-            }
-        }
-    }
 }
 
 enum HealthKitPermissionRequestStatus {