TrioRemoteControl+Meal.swift 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import Foundation
  2. extension TrioRemoteControl {
  3. func handleMealCommand(_ pushMessage: PushMessage) async {
  4. guard pushMessage.carbs != nil || pushMessage.fat != nil || pushMessage.protein != nil else {
  5. await logError("Command rejected: meal data is incomplete or invalid.", pushMessage: pushMessage)
  6. return
  7. }
  8. let carbsDecimal = pushMessage.carbs != nil ? Decimal(pushMessage.carbs!) : nil
  9. let fatDecimal = pushMessage.fat != nil ? Decimal(pushMessage.fat!) : nil
  10. let proteinDecimal = pushMessage.protein != nil ? Decimal(pushMessage.protein!) : nil
  11. let settings = await FreeAPSApp.resolver.resolve(SettingsManager.self)?.settings
  12. let maxCarbs = settings?.maxCarbs ?? Decimal(0)
  13. let maxFat = settings?.maxFat ?? Decimal(0)
  14. let maxProtein = settings?.maxProtein ?? Decimal(0)
  15. if let carbs = carbsDecimal, carbs > maxCarbs {
  16. await logError(
  17. "Command rejected: carbs amount (\(carbs)g) exceeds the maximum allowed (\(maxCarbs)g).",
  18. pushMessage: pushMessage
  19. )
  20. return
  21. }
  22. if let fat = fatDecimal, fat > maxFat {
  23. await logError(
  24. "Command rejected: fat amount (\(fat)g) exceeds the maximum allowed (\(maxFat)g).",
  25. pushMessage: pushMessage
  26. )
  27. return
  28. }
  29. if let protein = proteinDecimal, protein > maxProtein {
  30. await logError(
  31. "Command rejected: protein amount (\(protein)g) exceeds the maximum allowed (\(maxProtein)g).",
  32. pushMessage: pushMessage
  33. )
  34. return
  35. }
  36. let pushMessageDate = Date(timeIntervalSince1970: pushMessage.timestamp)
  37. let recentCarbEntries = carbsStorage.recent()
  38. let carbsAfterPushMessage = recentCarbEntries.filter { $0.createdAt > pushMessageDate }
  39. if !carbsAfterPushMessage.isEmpty {
  40. await logError(
  41. "Command rejected: newer carb entries have been logged since the command was sent.",
  42. pushMessage: pushMessage
  43. )
  44. return
  45. }
  46. let actualDate: Date?
  47. if let scheduledTime = pushMessage.scheduledTime {
  48. actualDate = Date(timeIntervalSince1970: scheduledTime)
  49. } else {
  50. actualDate = nil
  51. }
  52. let mealEntry = CarbsEntry(
  53. id: UUID().uuidString,
  54. createdAt: Date(),
  55. actualDate: actualDate,
  56. carbs: carbsDecimal ?? 0,
  57. fat: fatDecimal,
  58. protein: proteinDecimal,
  59. note: "Remote meal command",
  60. enteredBy: CarbsEntry.manual,
  61. isFPU: false,
  62. fpuID: nil
  63. )
  64. await carbsStorage.storeCarbs([mealEntry], areFetchedFromRemote: false)
  65. debug(
  66. .remoteControl,
  67. "Remote command processed successfully. \(pushMessage.humanReadableDescription())"
  68. )
  69. }
  70. }