|
|
@@ -2,14 +2,21 @@ import Foundation
|
|
|
import SwiftDate
|
|
|
import Swinject
|
|
|
|
|
|
+protocol TempTargetsObserver {
|
|
|
+ func tempTargetsDidUpdate(_ targers: [TempTarget])
|
|
|
+}
|
|
|
+
|
|
|
protocol TempTargetsStorage {
|
|
|
func storeTempTargets(_ targets: [TempTarget])
|
|
|
func syncDate() -> Date
|
|
|
+ func recent() -> [TempTarget]
|
|
|
+ func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
|
|
|
}
|
|
|
|
|
|
final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
|
|
|
private let processQueue = DispatchQueue(label: "BaseTempTargetsStorage.processQueue")
|
|
|
@Injected() private var storage: FileStorage!
|
|
|
+ @Injected() private var broadcaster: Broadcaster!
|
|
|
|
|
|
init(resolver: Resolver) {
|
|
|
injectServices(resolver)
|
|
|
@@ -18,13 +25,17 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
|
|
|
func storeTempTargets(_ targets: [TempTarget]) {
|
|
|
processQueue.sync {
|
|
|
let file = OpenAPS.Settings.tempTargets
|
|
|
+ var uniqEvents: [TempTarget] = []
|
|
|
try? self.storage.transaction { storage in
|
|
|
try storage.append(targets, to: file, uniqBy: \.createdAt)
|
|
|
- let uniqEvents = try storage.retrieve(file, as: [TempTarget].self)
|
|
|
+ uniqEvents = try storage.retrieve(file, as: [TempTarget].self)
|
|
|
.filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() }
|
|
|
.sorted { $0.createdAt > $1.createdAt }
|
|
|
try storage.save(Array(uniqEvents), as: file)
|
|
|
}
|
|
|
+ broadcaster.notify(TempTargetsObserver.self, on: processQueue) {
|
|
|
+ $0.tempTargetsDidUpdate(uniqEvents)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -36,4 +47,33 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
|
|
|
}
|
|
|
return recent.createdAt.addingTimeInterval(-6.minutes.timeInterval)
|
|
|
}
|
|
|
+
|
|
|
+ func recent() -> [TempTarget] {
|
|
|
+ (try? storage.retrieve(OpenAPS.Settings.tempTargets, as: [TempTarget].self))?.reversed() ?? []
|
|
|
+ }
|
|
|
+
|
|
|
+ func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
|
|
|
+ let uploaded = (try? storage.retrieve(OpenAPS.Nightscout.uploadedTempTargets, as: [NigtscoutTreatment].self)) ?? []
|
|
|
+
|
|
|
+ let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual }
|
|
|
+ let treatments = eventsManual.map {
|
|
|
+ NigtscoutTreatment(
|
|
|
+ duration: Int($0.duration),
|
|
|
+ rawDuration: nil,
|
|
|
+ rawRate: nil,
|
|
|
+ absolute: nil,
|
|
|
+ rate: nil,
|
|
|
+ eventType: .nsTempTarget,
|
|
|
+ createdAt: $0.createdAt,
|
|
|
+ entededBy: TempTarget.manual,
|
|
|
+ bolus: nil,
|
|
|
+ insulin: nil,
|
|
|
+ notes: nil,
|
|
|
+ carbs: nil,
|
|
|
+ targetTop: $0.targetTop,
|
|
|
+ targetBottom: $0.targetBottom
|
|
|
+ )
|
|
|
+ }
|
|
|
+ return Array(Set(treatments).subtracting(Set(uploaded)))
|
|
|
+ }
|
|
|
}
|