| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import CoreData
- import Foundation
- class JSONImporter {
- private let context: NSManagedObjectContext
- private let fileManager = FileManager.default
- init(context: NSManagedObjectContext) {
- self.context = context
- }
- func importPumpHistoryIfNeeded() async {
- let userDefaultsKey = "pumpHistoryImported"
- let hasImported = UserDefaults.standard.bool(forKey: userDefaultsKey)
- guard !hasImported else {
- debugPrint("Pump history already imported. Skipping import.")
- return
- }
- do {
- // Get filepath
- guard let filePath = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
- .first?
- .appendingPathComponent(OpenAPS.Monitor.pumpHistory),
- fileManager.fileExists(atPath: filePath.path)
- else {
- debugPrint("Pump history file not found at path \(OpenAPS.Monitor.pumpHistory)")
- return
- }
- // Read JSON and decode
- let data = try Data(contentsOf: filePath)
- let pumpEvents = try JSONDecoder().decode([PumpEventDTO].self, from: data)
- // Save to Core Data
- await context.perform {
- for event in pumpEvents {
- self.storePumpEventFromDTO(event)
- }
- do {
- guard self.context.hasChanges else { return }
- try self.context.save()
- debugPrint("\(DebuggingIdentifiers.succeeded) Pump history successfully imported into Core Data.")
- } catch {
- debugPrint("\(DebuggingIdentifiers.failed) Failed to save pump history to Core Data: \(error)")
- }
- }
- // Delete JSON
- try fileManager.removeItem(at: filePath)
- debugPrint("pumphistory.json deleted after successful import.")
- // Update UserDefaults flag
- UserDefaults.standard.set(true, forKey: userDefaultsKey)
- } catch {
- debugPrint("Error importing pump history: \(error)")
- }
- }
- private func storePumpEventFromDTO(_ event: PumpEventDTO) {
- // Map each type of PumpEventDTO to its corresponding Core Data model.
- switch event {
- case let .bolus(bolusDTO):
- let pumpEvent = PumpEventStored(context: context)
- pumpEvent.id = bolusDTO.id
- pumpEvent.timestamp = ISO8601DateFormatter().date(from: bolusDTO.timestamp)
- pumpEvent.type = bolusDTO._type
- let bolus = BolusStored(context: context)
- bolus.amount = NSDecimalNumber(value: bolusDTO.amount)
- bolus.isExternal = bolusDTO.isExternal
- bolus.isSMB = bolusDTO.isSMB ?? false
- pumpEvent.bolus = bolus
- case let .tempBasal(tempBasalDTO):
- let pumpEvent = PumpEventStored(context: context)
- pumpEvent.id = tempBasalDTO.id
- pumpEvent.timestamp = ISO8601DateFormatter().date(from: tempBasalDTO.timestamp)
- pumpEvent.type = tempBasalDTO._type
- let tempBasal = TempBasalStored(context: context)
- tempBasal.tempType = tempBasalDTO.temp
- tempBasal.rate = NSDecimalNumber(value: tempBasalDTO.rate)
- pumpEvent.tempBasal = tempBasal
- case let .tempBasalDuration(tempBasalDurationDTO):
- let pumpEvent = PumpEventStored(context: context)
- pumpEvent.id = tempBasalDurationDTO.id
- pumpEvent.timestamp = ISO8601DateFormatter().date(from: tempBasalDurationDTO.timestamp)
- pumpEvent.type = tempBasalDurationDTO._type
- let tempBasal = TempBasalStored(context: context)
- tempBasal.duration = Int16(tempBasalDurationDTO.duration)
- pumpEvent.tempBasal = tempBasal
- case .pumpSuspend:
- return
- }
- }
- func importCarbHistoryIfNeeded() async {
- let userDefaultsKey = "carbHistoryImported"
- let hasImported = UserDefaults.standard.bool(forKey: userDefaultsKey)
- guard !hasImported else {
- debugPrint("Carb history already imported. Skipping import.")
- return
- }
- do {
- // Get filepath
- guard let filePath = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
- .first?
- .appendingPathComponent(OpenAPS.Monitor.carbHistory),
- fileManager.fileExists(atPath: filePath.path)
- else {
- debugPrint("Carb history file not found at path \(OpenAPS.Monitor.carbHistory)")
- return
- }
- // Read JSON and decode
- let data = try Data(contentsOf: filePath)
- let decoder = JSONDecoder()
- decoder.dateDecodingStrategy = .iso8601
- // Decode JSON
- let carbEntries = try decoder.decode([CarbEntryDTO].self, from: data)
- // Save to Core Data
- await context.perform {
- for entryDTO in carbEntries {
- self.storeCarbEntryFromDTO(entryDTO)
- }
- do {
- guard self.context.hasChanges else { return }
- try self.context.save()
- debugPrint("\(DebuggingIdentifiers.succeeded) Carb history successfully imported into Core Data.")
- } catch {
- debugPrint("\(DebuggingIdentifiers.failed) Failed to save carb history to Core Data: \(error)")
- }
- }
- // Delete JSON
- try fileManager.removeItem(at: filePath)
- debugPrint("carbHistory.json deleted after successful import.")
- // Update UserDefaults flag
- UserDefaults.standard.set(true, forKey: userDefaultsKey)
- } catch {
- debugPrint("Error importing carb history: \(error)")
- }
- }
- private func storeCarbEntryFromDTO(_ entryDTO: CarbEntryDTO) {
- let carbEntry = CarbEntryStored(context: context)
- carbEntry.id = entryDTO.id ?? UUID()
- carbEntry.carbs = entryDTO.carbs
- carbEntry.date = entryDTO.date ?? Date()
- carbEntry.fat = entryDTO.fat ?? 0.0
- carbEntry.protein = entryDTO.protein ?? 0.0
- carbEntry.isFPU = entryDTO.isFPU ?? false
- carbEntry.note = entryDTO.note
- carbEntry.isUploadedToNS = false
- carbEntry.isUploadedToHealth = false
- carbEntry.isUploadedToTidepool = false
- }
- }
|