Просмотр исходного кода

Fix duplicate carb entries when remotely fetched #44

Deniz Cengiz 1 год назад
Родитель
Сommit
134e3aafec

+ 1 - 1
FreeAPS/Sources/APS/FetchTreatmentsManager.swift

@@ -33,7 +33,7 @@ final class BaseFetchTreatmentsManager: FetchTreatmentsManager, Injectable {
 
                     let filteredCarbs = await carbs.filter { !($0.enteredBy?.contains(CarbsEntry.manual) ?? false) }
                     if filteredCarbs.isNotEmpty {
-                        await self.carbsStorage.storeCarbs(filteredCarbs)
+                        await self.carbsStorage.storeCarbs(filteredCarbs, areFetchedFromRemote: true)
                     }
 
                     let filteredTargets = await tempTargets.filter { !($0.enteredBy?.contains(TempTarget.manual) ?? false) }

+ 10 - 10
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -8,7 +8,7 @@ protocol CarbsObserver {
 }
 
 protocol CarbsStorage {
-    func storeCarbs(_ carbs: [CarbsEntry]) async
+    func storeCarbs(_ carbs: [CarbsEntry], areFetchedFromRemote: Bool) async
     func syncDate() -> Date
     func recent() -> [CarbsEntry]
     func getCarbsNotYetUploadedToNightscout() async -> [NightscoutTreatment]
@@ -28,9 +28,9 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
         injectServices(resolver)
     }
 
-    func storeCarbs(_ entries: [CarbsEntry]) async {
-        await saveCarbEquivalents(entries: entries)
-        await saveCarbsToCoreData(entries: entries)
+    func storeCarbs(_ entries: [CarbsEntry], areFetchedFromRemote: Bool) async {
+        await saveCarbEquivalents(entries: entries, areFetchedFromRemote: areFetchedFromRemote)
+        await saveCarbsToCoreData(entries: entries, areFetchedFromRemote: areFetchedFromRemote)
     }
 
     /**
@@ -129,7 +129,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
         return (futureCarbArray, carbEquivalents)
     }
 
-    private func saveCarbEquivalents(entries: [CarbsEntry]) async {
+    private func saveCarbEquivalents(entries: [CarbsEntry], areFetchedFromRemote: Bool) async {
         guard let lastEntry = entries.last else { return }
 
         if let fat = lastEntry.fat, let protein = lastEntry.protein, fat > 0 || protein > 0 {
@@ -142,12 +142,12 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
             )
 
             if carbEquivalentCount > 0 {
-                await saveFPUToCoreDataAsBatchInsert(entries: futureCarbEquivalents)
+                await saveFPUToCoreDataAsBatchInsert(entries: futureCarbEquivalents, areFetchedFromRemote: areFetchedFromRemote)
             }
         }
     }
 
-    private func saveCarbsToCoreData(entries: [CarbsEntry]) async {
+    private func saveCarbsToCoreData(entries: [CarbsEntry], areFetchedFromRemote: Bool) async {
         guard let entry = entries.last, entry.carbs != 0 else { return }
 
         await coredataContext.perform {
@@ -158,7 +158,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
             newItem.protein = Double(truncating: NSDecimalNumber(decimal: entry.protein ?? 0))
             newItem.id = UUID()
             newItem.isFPU = false
-            newItem.isUploadedToNS = false
+            newItem.isUploadedToNS = areFetchedFromRemote ? true : false
 
             do {
                 guard self.coredataContext.hasChanges else { return }
@@ -169,7 +169,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
         }
     }
 
-    private func saveFPUToCoreDataAsBatchInsert(entries: [CarbsEntry]) async {
+    private func saveFPUToCoreDataAsBatchInsert(entries: [CarbsEntry], areFetchedFromRemote: Bool) async {
         let commonFPUID =
             UUID() // all fpus should only get ONE id per batch insert to be able to delete them referencing the fpuID
         var entrySlice = ArraySlice(entries) // convert to ArraySlice
@@ -184,7 +184,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
             carbEntry.id = UUID.init(uuidString: entryId)
             carbEntry.fpuID = commonFPUID
             carbEntry.isFPU = true
-            carbEntry.isUploadedToNS = false
+            carbEntry.isUploadedToNS = areFetchedFromRemote ? true : false
             return false // return false to continue
         }
         await coredataContext.perform {

+ 1 - 1
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -382,7 +382,7 @@ extension Bolus {
                 enteredBy: CarbsEntry.manual,
                 isFPU: false, fpuID: UUID().uuidString
             )]
-            await carbsStorage.storeCarbs(carbsToStore)
+            await carbsStorage.storeCarbs(carbsToStore, areFetchedFromRemote: false)
 
             if carbs > 0 || fat > 0 || protein > 0 {
                 // only perform determine basal sync if the user doesn't use the pump bolus, otherwise the enact bolus func in the APSManger does a sync

+ 2 - 1
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -390,7 +390,8 @@ extension BaseWatchManager: WCSessionDelegate {
                         enteredBy: CarbsEntry.manual,
                         isFPU: false,
                         fpuID: nil
-                    )]
+                    )],
+                    areFetchedFromRemote: false
                 )
 
                 _ = await apsManager.determineBasal()

+ 2 - 1
FreeAPS/Sources/Shortcuts/Carbs/CarbPresetIntentRequest.swift

@@ -25,7 +25,8 @@ import Foundation
                 note: "add with shortcuts",
                 enteredBy: CarbsEntry.manual,
                 isFPU: false, fpuID: nil
-            )]
+            )],
+            areFetchedFromRemote: false
         )
         var resultDisplay: String
         resultDisplay = "\(carbs) g carbs"