CarbEntryStored+helper.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import CoreData
  2. import Foundation
  3. extension NSPredicate {
  4. static var fpusForChart: NSPredicate {
  5. let date = Date.oneDayAgo
  6. return NSPredicate(format: "isFPU == true AND date >= %@", date as NSDate)
  7. }
  8. static var carbsForChart: NSPredicate {
  9. let date = Date.oneDayAgo
  10. return NSPredicate(format: "isFPU == false AND date >= %@", date as NSDate)
  11. }
  12. static var carbsNotYetUploadedToNightscout: NSPredicate {
  13. let date = Date.oneDayAgo
  14. return NSPredicate(
  15. format: "date >= %@ AND isUploadedToNS == %@ AND isFPU == %@",
  16. date as NSDate,
  17. false as NSNumber,
  18. false as NSNumber
  19. )
  20. }
  21. static var carbsNotYetUploadedToHealth: NSPredicate {
  22. let date = Date.oneDayAgo
  23. return NSPredicate(
  24. format: "date >= %@ AND isUploadedToHealth == %@",
  25. date as NSDate,
  26. false as NSNumber
  27. )
  28. }
  29. static var carbsNotYetUploadedToTidepool: NSPredicate {
  30. let date = Date.oneDayAgo
  31. return NSPredicate(
  32. format: "date >= %@ AND isUploadedToTidepool == %@",
  33. date as NSDate,
  34. false as NSNumber
  35. )
  36. }
  37. static var fpusNotYetUploadedToNightscout: NSPredicate {
  38. let date = Date.oneDayAgo
  39. return NSPredicate(
  40. format: "date >= %@ AND isUploadedToNS == %@ AND isFPU == %@",
  41. date as NSDate,
  42. false as NSNumber,
  43. true as NSNumber
  44. )
  45. }
  46. }
  47. extension CarbEntryStored {
  48. static func fetch(
  49. _ predicate: NSPredicate = .predicateForOneDayAgo,
  50. fetchLimit: Int = 100,
  51. ascending: Bool = false
  52. ) -> NSFetchRequest<CarbEntryStored> {
  53. let request = CarbEntryStored.fetchRequest() as NSFetchRequest<CarbEntryStored>
  54. request.sortDescriptors = [NSSortDescriptor(keyPath: \CarbEntryStored.date, ascending: ascending)]
  55. request.fetchLimit = fetchLimit
  56. request.predicate = predicate
  57. return request
  58. }
  59. }
  60. extension CarbEntryStored: Encodable {
  61. enum CodingKeys: String, CodingKey {
  62. case actualDate
  63. case created_at
  64. case carbs
  65. case fat
  66. case id
  67. case isFPU
  68. case note
  69. case protein
  70. case enteredBy
  71. }
  72. public func encode(to encoder: Encoder) throws {
  73. var container = encoder.container(keyedBy: CodingKeys.self)
  74. let dateFormatter = ISO8601DateFormatter()
  75. dateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
  76. let formattedDate = dateFormatter.string(from: date ?? Date())
  77. try container.encode(formattedDate, forKey: .actualDate)
  78. try container.encode(formattedDate, forKey: .created_at)
  79. // TODO: handle this conditionally; pass in the enteredBy string (manual entry or via NS or Apple Health)
  80. try container.encode("Trio", forKey: .enteredBy)
  81. try container.encode(carbs, forKey: .carbs)
  82. try container.encode(fat, forKey: .fat)
  83. try container.encode(isFPU, forKey: .isFPU)
  84. try container.encode(note, forKey: .note)
  85. try container.encode(protein, forKey: .protein)
  86. try container.encode(id, forKey: .id)
  87. }
  88. }