TempTargetsStorage.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import Foundation
  2. import SwiftDate
  3. import Swinject
  4. protocol TempTargetsStorage {
  5. func storeTempTargets(_ targets: [TempTarget])
  6. func syncDate() -> Date
  7. }
  8. final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
  9. private let processQueue = DispatchQueue(label: "BaseTempTargetsStorage.processQueue")
  10. @Injected() private var storage: FileStorage!
  11. init(resolver: Resolver) {
  12. injectServices(resolver)
  13. }
  14. func storeTempTargets(_ targets: [TempTarget]) {
  15. processQueue.sync {
  16. let file = OpenAPS.Settings.tempTargets
  17. try? self.storage.transaction { storage in
  18. try storage.append(targets, to: file, uniqBy: \.createdAt)
  19. let uniqEvents = try storage.retrieve(file, as: [TempTarget].self)
  20. .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() }
  21. .sorted { $0.createdAt > $1.createdAt }
  22. try storage.save(Array(uniqEvents), as: file)
  23. }
  24. }
  25. }
  26. func syncDate() -> Date {
  27. guard let events = try? storage.retrieve(OpenAPS.Settings.tempTargets, as: [TempTarget].self),
  28. let recent = events.filter({ $0.enteredBy != TempTarget.manual }).first
  29. else {
  30. return Date().addingTimeInterval(-1.days.timeInterval)
  31. }
  32. return recent.createdAt.addingTimeInterval(-6.minutes.timeInterval)
  33. }
  34. }