FetchTreatmentsManager.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import Combine
  2. import Foundation
  3. import SwiftDate
  4. import Swinject
  5. protocol FetchTreatmentsManager {}
  6. final class BaseFetchTreatmentsManager: FetchTreatmentsManager, Injectable {
  7. private let processQueue = DispatchQueue(label: "BaseFetchTreatmentsManager.processQueue")
  8. @Injected() var nightscoutManager: NightscoutManager!
  9. @Injected() var tempTargetsStorage: TempTargetsStorage!
  10. @Injected() var carbsStorage: CarbsStorage!
  11. private var lifetime = Lifetime()
  12. private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
  13. init(resolver: Resolver) {
  14. injectServices(resolver)
  15. subscribe()
  16. }
  17. private func subscribe() {
  18. timer.publisher
  19. .receive(on: processQueue)
  20. .sink { [weak self] _ in
  21. guard let self = self else { return }
  22. debug(.nightscout, "FetchTreatmentsManager heartbeat")
  23. debug(.nightscout, "Start fetching carbs and temptargets")
  24. Task {
  25. async let carbs = self.nightscoutManager.fetchCarbs()
  26. async let tempTargets = self.nightscoutManager.fetchTempTargets()
  27. let filteredCarbs = await carbs.filter { !($0.enteredBy?.contains(CarbsEntry.manual) ?? false) }
  28. if filteredCarbs.isNotEmpty {
  29. await self.carbsStorage.storeCarbs(filteredCarbs, areFetchedFromRemote: true)
  30. }
  31. let filteredTargets = await tempTargets.filter { !($0.enteredBy?.contains(TempTarget.manual) ?? false) }
  32. if filteredTargets.isNotEmpty {
  33. for tempTarget in filteredTargets {
  34. await self.tempTargetsStorage.storeTempTarget(tempTarget: tempTarget)
  35. }
  36. }
  37. }
  38. }
  39. .store(in: &lifetime)
  40. timer.fire()
  41. timer.resume()
  42. }
  43. }