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

Fix deletion of fpus in NS. Still exessive, though.

Jon Mårtensson 2 лет назад
Родитель
Сommit
f039dc329b

+ 9 - 32
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -12,7 +12,7 @@ protocol CarbsStorage {
     func syncDate() -> Date
     func recent() -> [CarbsEntry]
     func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
-    func deleteCarbs(at uniqueID: String, complex: Bool?)
+    func deleteCarbs(at uniqueID: String)
 }
 
 final class BaseCarbsStorage: CarbsStorage, Injectable {
@@ -71,7 +71,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                 // New date for each carb equivalent
                 var useDate = entries.last?.createdAt ?? Date()
                 // Group and Identify all FPUs together
-                let fpuID = (entries.last?.id ?? "") + ".fpu"
+                let fpuID = (entries.last?.collectionID ?? "") + ".fpu"
                 // Create an array of all future carb equivalents.
                 var futureCarbArray = [CarbsEntry]()
                 while carbEquivalents > 0, numberOfEquivalents > 0 {
@@ -81,7 +81,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                     } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) }
 
                     let eachCarbEntry = CarbsEntry(
-                        id: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil,
+                        collectionID: fpuID, createdAt: useDate, carbs: equivalent, fat: 0, protein: 0, note: nil,
                         enteredBy: CarbsEntry.manual, isFPU: true,
                         fpuID: fpuID
                     )
@@ -143,47 +143,24 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
         storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)?.reversed() ?? []
     }
 
-    func deleteCarbs(at uniqueID: String, complex: Bool?) {
+    func deleteCarbs(at uniqueID: String) {
         processQueue.sync {
             var allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? []
 
-            guard let entryIndex = allValues.firstIndex(where: { $0.id == uniqueID }) else {
-                debug(.default, "Didn't find anything to delete. Date to search for: " + uniqueID.description)
-                return
-            }
-
-            // If deleteing a FPUs remove all of those with the same ID
-            if allValues[entryIndex].isFPU != nil, allValues[entryIndex].isFPU ?? false {
-                let fpuString = allValues[entryIndex].fpuID
-                allValues.removeAll(where: { $0.fpuID == fpuString })
-                storage.save(allValues, as: OpenAPS.Monitor.carbHistory)
-                broadcaster.notify(CarbsObserver.self, on: processQueue) {
-                    $0.carbsDidUpdate(allValues)
-                }
+            if allValues.firstIndex(where: { $0.collectionID == uniqueID }) == nil {
+                debug(.default, "Didn't find any carb entries to delete. ID to search for: " + uniqueID.description)
             } else {
-                allValues.remove(at: entryIndex)
+                allValues.removeAll(where: { $0.collectionID == uniqueID })
                 storage.save(allValues, as: OpenAPS.Monitor.carbHistory)
                 broadcaster.notify(CarbsObserver.self, on: processQueue) {
                     $0.carbsDidUpdate(allValues)
                 }
             }
-            // When deleting both carbs and fat and protein (complex meal entry)
-            if let deleteComplexEntriesAlso = complex, deleteComplexEntriesAlso {
-                guard let fpuIndex = allValues.firstIndex(where: { $0.id == (uniqueID + ".fpu") }) else {
-                    debug(
-                        .default,
-                        "Didn't find any complex fat and protein entries to delete. Date to search for: " + uniqueID.description
-                    )
-                    return
-                }
-                allValues.removeAll(where: { $0.id == (uniqueID + ".fpu") })
-                storage.save(allValues, as: OpenAPS.Monitor.carbHistory)
-            }
         }
     }
 
     func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
-        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NigtscoutTreatment].self) ?? []
+        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCarbs, as: [NigtscoutTreatment].self) ?? []
 
         let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual }
         let treatments = eventsManual.map {
@@ -204,7 +181,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                 foodType: $0.note,
                 targetTop: nil,
                 targetBottom: nil,
-                id: $0.id
+                collectionID: $0.collectionID
             )
         }
         return Array(Set(treatments).subtracting(Set(uploaded)))

+ 2 - 2
FreeAPS/Sources/Models/CarbsEntry.swift

@@ -1,7 +1,7 @@
 import Foundation
 
 struct CarbsEntry: JSON, Equatable, Hashable {
-    let id: String?
+    let collectionID: String?
     let createdAt: Date
     let carbs: Decimal
     let fat: Decimal?
@@ -25,7 +25,7 @@ struct CarbsEntry: JSON, Equatable, Hashable {
 
 extension CarbsEntry {
     private enum CodingKeys: String, CodingKey {
-        case id = "_id"
+        case collectionID = "_id"
         case createdAt = "created_at"
         case carbs
         case fat

+ 2 - 2
FreeAPS/Sources/Models/NightscoutTreatment.swift

@@ -21,7 +21,7 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable {
     var glucoseType: String?
     var glucose: String?
     var units: String?
-    var id: String?
+    var collectionID: String?
 
     static let local = "iAPS"
 
@@ -58,6 +58,6 @@ extension NigtscoutTreatment {
         case glucoseType
         case glucose
         case units
-        case id
+        case collectionID
     }
 }

+ 5 - 4
FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift

@@ -38,7 +38,7 @@ extension AddCarbs {
             id_ = UUID().uuidString
 
             let carbsToStore = [CarbsEntry(
-                id: id_,
+                collectionID: id_,
                 createdAt: date,
                 carbs: carbs,
                 fat: fat,
@@ -55,7 +55,9 @@ extension AddCarbs {
             } else if carbs > 0 {
                 saveToCoreData(carbsToStore)
                 showModal(for: .bolus(waitForSuggestion: true, fetch: true))
-            } else { hideModal() }
+            } else {
+                hideModal()
+            }
         }
 
         func deletePreset() {
@@ -185,9 +187,8 @@ extension AddCarbs {
 
         func saveToCoreData(_ stored: [CarbsEntry]) {
             let save = Meals(context: coredataContext)
-            save.id = stored.first?.id ?? ""
             save.createdAt = stored.first?.createdAt ?? .distantPast
-            save.id = stored.first?.id ?? ""
+            save.id = stored.first?.collectionID ?? ""
             save.carbs = Double(stored.first?.carbs ?? 0)
             save.fat = Double(stored.first?.fat ?? 0)
             save.protein = Double(stored.first?.protein ?? 0)

+ 10 - 2
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -217,9 +217,17 @@ extension Bolus {
 
         func backToCarbsView(complexEntry: Bool, _ id: String) {
             if complexEntry {
+                DispatchQueue.safeMainSync {
+                    nsManager.deleteCarbs(
+                        at: id, isFPU: nil, fpuID: nil, syncID: id
+                    )
+                    nsManager.deleteCarbs(
+                        at: id + ".fpu", isFPU: nil, fpuID: nil, syncID: id
+                    )
+                }
+            } else {
                 nsManager.deleteCarbs(
-                    at: id, isFPU: nil, fpuID: nil, syncID: id,
-                    complex: complexEntry
+                    at: id, isFPU: nil, fpuID: nil, syncID: id
                 )
             }
             showModal(for: .addCarbs(editMode: complexEntry))

+ 1 - 1
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -36,7 +36,7 @@ extension DataTable {
                 at: treatement.id,
                 isFPU: treatement.isFPU,
                 fpuID: treatement.fpuID,
-                syncID: treatement.id, complex: nil
+                syncID: treatement.id
             )
         }
 

+ 2 - 2
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -40,7 +40,7 @@ extension DataTable {
                 let carbs = self.provider.carbs()
                     .filter { !($0.isFPU ?? false) }
                     .map {
-                        if let id = $0.id {
+                        if let id = $0.collectionID {
                             return Treatment(
                                 units: units,
                                 type: .carbs,
@@ -62,7 +62,7 @@ extension DataTable {
                             type: .fpus,
                             date: $0.createdAt,
                             amount: $0.carbs,
-                            id: $0.id,
+                            id: $0.collectionID,
                             isFPU: $0.isFPU,
                             fpuID: $0.fpuID,
                             note: $0.note

+ 1 - 1
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -194,7 +194,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver, P
             let sampleIDs = samples.compactMap(\.syncIdentifier)
             let sampleDates = samples.map(\.startDate)
             let samplesToSave = carbsWithId
-                .filter { !sampleIDs.contains($0.id!) } // id existing in AH
+                .filter { !sampleIDs.contains($0.collectionID!) } // id existing in AH
                 .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime
                 .map {
                     HKQuantitySample(

+ 4 - 3
FreeAPS/Sources/Services/Network/NightscoutAPI.swift

@@ -148,9 +148,10 @@ extension NightscoutAPI {
         components.port = url.port
         components.path = Config.treatmentsPath
         components.queryItems = [
-            URLQueryItem(name: "find[carbs][$exists]", value: "true"),
+            // Removed below because it prevented all futire entries to be deleted. Don't know why?
+            /* URLQueryItem(name: "find[carbs][$exists]", value: "true"), */
             URLQueryItem(
-                name: "find[id][$eq]",
+                name: "find[collectionID][$eq]",
                 value: uniqueID
             )
         ]
@@ -322,7 +323,7 @@ extension NightscoutAPI {
         if let secret = secret {
             request.addValue(secret.sha1(), forHTTPHeaderField: "api-secret")
         }
-        request.httpBody = try! JSONCoding.encoder.encode(treatments)
+        request.httpBody = try? JSONCoding.encoder.encode(treatments)
         request.httpMethod = "POST"
 
         return service.run(request)

+ 18 - 48
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -9,7 +9,7 @@ protocol NightscoutManager: GlucoseSource {
     func fetchCarbs() -> AnyPublisher<[CarbsEntry], Never>
     func fetchTempTargets() -> AnyPublisher<[TempTarget], Never>
     func fetchAnnouncements() -> AnyPublisher<[Announcement], Never>
-    func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?)
+    func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String)
     func deleteInsulin(at date: Date)
     func deleteManualGlucose(at: Date)
     func uploadStatus()
@@ -177,62 +177,32 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
             .eraseToAnyPublisher()
     }
 
-    func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String, complex: Bool?) {
+    func deleteCarbs(at uniqueID: String, isFPU: Bool?, fpuID: String?, syncID: String) {
         // remove in AH
         healthkitManager.deleteCarbs(syncID: syncID, isFPU: isFPU, fpuID: fpuID)
 
         guard let nightscout = nightscoutAPI, isUploadEnabled else {
-            carbsStorage.deleteCarbs(at: uniqueID, complex: complex)
+            carbsStorage.deleteCarbs(at: uniqueID)
             return
         }
 
-        if let isFPU = isFPU, isFPU {
-            guard let fpuID = fpuID else { return }
-            let allValues = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self) ?? []
-            let dates = allValues.filter { $0.fpuID == fpuID }.map(\.id).removeDublicates()
-
-            let publishers = dates
-                .map { _ -> AnyPublisher<Void, Swift.Error> in
-                    nightscout.deleteCarbs(
-                        at: uniqueID
+        nightscout.deleteCarbs(at: uniqueID)
+            .collect()
+            .sink { completion in
+                self.carbsStorage.deleteCarbs(at: uniqueID)
+                switch completion {
+                case .finished:
+                    debug(.nightscout, "Carbs deleted")
+                case let .failure(error):
+                    info(
+                        .nightscout,
+                        "Deletion of carbs in NightScout not done \n \(error.localizedDescription)",
+                        type: MessageType.warning
                     )
                 }
-
-            Publishers.MergeMany(publishers)
-                .collect()
-                .sink { completion in
-                    self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex)
-                    switch completion {
-                    case .finished:
-                        debug(.nightscout, "Carbs deleted")
-
-                    case let .failure(error):
-                        info(
-                            .nightscout,
-                            "Deletion of carbs in NightScout not done \n \(error.localizedDescription)",
-                            type: MessageType.warning
-                        )
-                    }
-                } receiveValue: { _ in }
-                .store(in: &lifetime)
-
-        } else {
-            nightscout.deleteCarbs(at: uniqueID)
-                .sink { completion in
-                    self.carbsStorage.deleteCarbs(at: uniqueID, complex: complex)
-                    switch completion {
-                    case .finished:
-                        debug(.nightscout, "Carbs deleted")
-                    case let .failure(error):
-                        info(
-                            .nightscout,
-                            "Deletion of carbs in NightScout not done \n \(error.localizedDescription)",
-                            type: MessageType.warning
-                        )
-                    }
-                } receiveValue: {}
-                .store(in: &lifetime)
-        }
+            } receiveValue: { _ in }
+            .store(in: &lifetime)
+        // }
     }
 
     func deleteInsulin(at date: Date) {

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

@@ -272,7 +272,7 @@ extension BaseWatchManager: WCSessionDelegate {
         {
             carbsStorage.storeCarbs(
                 [CarbsEntry(
-                    id: UUID().uuidString,
+                    collectionID: UUID().uuidString,
                     createdAt: Date(),
                     carbs: Decimal(carbs),
                     fat: Decimal(fat),

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

@@ -11,7 +11,7 @@ import Foundation
 
         carbsStorage.storeCarbs(
             [CarbsEntry(
-                id: UUID().uuidString,
+                collectionID: UUID().uuidString,
                 createdAt: dateAdded,
                 carbs: carbs,
                 fat: Decimal(quantityFat),