GlucoseStorage.swift 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import Foundation
  2. import SwiftDate
  3. import Swinject
  4. protocol GlucoseStorage {
  5. func storeGlucose(_ glucose: [BloodGlucose])
  6. func recent() -> [BloodGlucose]
  7. func syncDate() -> Date
  8. }
  9. final class BaseGlucoseStorage: GlucoseStorage, Injectable {
  10. private let processQueue = DispatchQueue(label: "BaseGlucoseStorage.processQueue")
  11. @Injected() private var storage: FileStorage!
  12. @Injected() private var broadcaster: Broadcaster!
  13. init(resolver: Resolver) {
  14. injectServices(resolver)
  15. }
  16. func storeGlucose(_ glucose: [BloodGlucose]) {
  17. processQueue.sync {
  18. let file = OpenAPS.Monitor.glucose
  19. self.storage.transaction { storage in
  20. storage.append(glucose, to: file, uniqBy: \.dateString)
  21. let uniqEvents = storage.retrieve(file, as: [BloodGlucose].self)?
  22. .filter { $0.dateString.addingTimeInterval(1.days.timeInterval) > Date() }
  23. .sorted { $0.dateString > $1.dateString } ?? []
  24. let glucose = Array(uniqEvents)
  25. storage.save(glucose, as: file)
  26. DispatchQueue.main.async {
  27. self.broadcaster.notify(GlucoseObserver.self, on: .main) {
  28. $0.glucoseDidUpdate(glucose.reversed())
  29. }
  30. }
  31. }
  32. }
  33. }
  34. func syncDate() -> Date {
  35. guard let events = storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self),
  36. let recent = events.first
  37. else {
  38. return Date().addingTimeInterval(-1.days.timeInterval)
  39. }
  40. return recent.dateString.addingTimeInterval(1.minutes.timeInterval)
  41. }
  42. func recent() -> [BloodGlucose] {
  43. storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self)?.reversed() ?? []
  44. }
  45. }
  46. protocol GlucoseObserver {
  47. func glucoseDidUpdate(_ glucose: [BloodGlucose])
  48. }