FetchTreatmentsManager.swift 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. self.tempTargetsStorage.storeTempTargets(filteredTargets)
  34. }
  35. }
  36. }
  37. .store(in: &lifetime)
  38. timer.fire()
  39. timer.resume()
  40. }
  41. }