StoredCarbEntry.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //
  2. // StoredCarbEntry.swift
  3. // Naterade
  4. //
  5. // Created by Nathan Racklyeft on 1/22/16.
  6. // Copyright © 2016 Nathan Racklyeft. All rights reserved.
  7. //
  8. import HealthKit
  9. import CoreData
  10. private let unit = HKUnit.gram()
  11. public struct StoredCarbEntry: CarbEntry {
  12. public let sampleUUID: UUID
  13. // MARK: - HealthKit Sync Support
  14. public let syncIdentifier: String?
  15. public let syncVersion: Int
  16. // MARK: - SampleValue
  17. public let startDate: Date
  18. public let quantity: HKQuantity
  19. // MARK: - CarbEntry
  20. public let foodType: String?
  21. public let absorptionTime: TimeInterval?
  22. public let createdByCurrentApp: Bool
  23. // MARK: - Sync state
  24. public var externalID: String?
  25. public var isUploaded: Bool
  26. init(sample: HKQuantitySample, createdByCurrentApp: Bool? = nil) {
  27. self.init(
  28. sampleUUID: sample.uuid,
  29. syncIdentifier: sample.metadata?[HKMetadataKeySyncIdentifier] as? String,
  30. syncVersion: sample.metadata?[HKMetadataKeySyncVersion] as? Int ?? 1,
  31. startDate: sample.startDate,
  32. unitString: unit.unitString,
  33. value: sample.quantity.doubleValue(for: unit),
  34. foodType: sample.foodType,
  35. absorptionTime: sample.absorptionTime,
  36. createdByCurrentApp: createdByCurrentApp ?? sample.createdByCurrentApp,
  37. externalID: sample.externalID,
  38. isUploaded: sample.externalID != nil
  39. )
  40. }
  41. public init(
  42. sampleUUID: UUID,
  43. syncIdentifier: String?,
  44. syncVersion: Int,
  45. startDate: Date,
  46. unitString: String,
  47. value: Double,
  48. foodType: String?,
  49. absorptionTime: TimeInterval?,
  50. createdByCurrentApp: Bool,
  51. externalID: String?,
  52. isUploaded: Bool
  53. ) {
  54. self.sampleUUID = sampleUUID
  55. self.syncIdentifier = syncIdentifier
  56. self.syncVersion = syncVersion
  57. self.startDate = startDate
  58. self.quantity = HKQuantity(unit: HKUnit(from: unitString), doubleValue: value)
  59. self.foodType = foodType
  60. self.absorptionTime = absorptionTime
  61. self.createdByCurrentApp = createdByCurrentApp
  62. self.externalID = externalID
  63. self.isUploaded = isUploaded
  64. }
  65. }
  66. extension StoredCarbEntry: Hashable {
  67. public func hash(into hasher: inout Hasher) {
  68. hasher.combine(sampleUUID)
  69. }
  70. }
  71. extension StoredCarbEntry: Equatable {
  72. public static func ==(lhs: StoredCarbEntry, rhs: StoredCarbEntry) -> Bool {
  73. return lhs.sampleUUID == rhs.sampleUUID
  74. }
  75. }
  76. extension StoredCarbEntry: Comparable {
  77. public static func <(lhs: StoredCarbEntry, rhs: StoredCarbEntry) -> Bool {
  78. return lhs.startDate < rhs.startDate
  79. }
  80. }
  81. // Deprecated, used for migration only
  82. extension StoredCarbEntry {
  83. typealias RawValue = [String: Any]
  84. init?(rawValue: RawValue) {
  85. guard let
  86. sampleUUIDString = rawValue["sampleUUID"] as? String,
  87. let sampleUUID = UUID(uuidString: sampleUUIDString),
  88. let startDate = rawValue["startDate"] as? Date,
  89. let unitString = rawValue["unitString"] as? String,
  90. let value = rawValue["value"] as? Double,
  91. let createdByCurrentApp = rawValue["createdByCurrentApp"] as? Bool else
  92. {
  93. return nil
  94. }
  95. let externalID = rawValue["externalId"] as? String
  96. self.init(
  97. sampleUUID: sampleUUID,
  98. syncIdentifier: nil,
  99. syncVersion: 1,
  100. startDate: startDate,
  101. unitString: unitString,
  102. value: value,
  103. foodType: rawValue["foodType"] as? String,
  104. absorptionTime: rawValue["absorptionTime"] as? TimeInterval,
  105. createdByCurrentApp: createdByCurrentApp,
  106. externalID: externalID,
  107. isUploaded: externalID != nil
  108. )
  109. }
  110. }
  111. extension StoredCarbEntry {
  112. init(managedObject: CachedCarbObject) {
  113. self.init(
  114. sampleUUID: managedObject.uuid!,
  115. syncIdentifier: managedObject.syncIdentifier,
  116. syncVersion: Int(managedObject.syncVersion),
  117. startDate: managedObject.startDate,
  118. unitString: unit.unitString,
  119. value: managedObject.grams,
  120. foodType: managedObject.foodType,
  121. absorptionTime: managedObject.absorptionTime,
  122. createdByCurrentApp: managedObject.createdByCurrentApp,
  123. externalID: managedObject.externalID,
  124. isUploaded: (managedObject.uploadState == .uploaded)
  125. )
  126. }
  127. }