Kaynağa Gözat

check for last 4 (instead of 3) values to determine if glucose is stale, perform purge of old entity data once weekly (currently data older > 90 days)

polscm32 2 yıl önce
ebeveyn
işleme
3ae382f1cb

+ 30 - 8
FreeAPS/Sources/APS/APSManager.swift

@@ -81,6 +81,7 @@ final class BaseAPSManager: APSManager, Injectable {
 
 
     private var cleanupTimer: Timer?
     private var cleanupTimer: Timer?
     @Persisted(key: "lastHistoryCleanupDate") private var lastHistoryCleanupDate = Date.distantPast
     @Persisted(key: "lastHistoryCleanupDate") private var lastHistoryCleanupDate = Date.distantPast
+    @Persisted(key: "lastPurgeDate") private var lastPurgeDate = Date.distantPast
 
 
     let viewContext = CoreDataStack.shared.persistentContainer.viewContext
     let viewContext = CoreDataStack.shared.persistentContainer.viewContext
     let privateContext = CoreDataStack.shared.newTaskContext()
     let privateContext = CoreDataStack.shared.newTaskContext()
@@ -148,18 +149,39 @@ final class BaseAPSManager: APSManager, Injectable {
         let calendar = Calendar.current
         let calendar = Calendar.current
 
 
         // Check if last clean is longer than one day ago
         // Check if last clean is longer than one day ago
-        if calendar.isDate(now, inSameDayAs: lastHistoryCleanupDate) {
-            // Cleanup already done
-            return
+        if !calendar.isDateInToday(lastHistoryCleanupDate) {
+            // Perform daily cleanup
+            Task {
+                await CoreDataStack.shared.cleanupPersistentHistoryTokens(before: Date.oneWeekAgo)
+                // Update lastHistoryCleanupDate only if cleanup was successful
+                lastHistoryCleanupDate = now
+            }
         }
         }
 
 
-        // Cleanup
-        Task {
-            await CoreDataStack.shared.cleanupPersistentHistoryTokens(before: Date.oneWeekAgo)
+        // Check if last purge is longer than one week ago
+        if let lastPurge = calendar.date(byAdding: .day, value: 7, to: lastPurgeDate), now >= lastPurge {
+            // Perform weekly purge
+            Task {
+                do {
+                    try await purgeOldNSManagedObjects()
+                    // Update lastPurgeDate only if purge was successful
+                    lastPurgeDate = now
+                } catch {
+                    debugPrint("Failed to purge old managed objects: \(error.localizedDescription)")
+                }
+            }
         }
         }
+    }
+
+    private func purgeOldNSManagedObjects() async throws {
+        try await CoreDataStack.shared.batchDeleteOlderThan(GlucoseStored.self, dateKey: "date", days: 90)
+        try await CoreDataStack.shared.batchDeleteOlderThan(PumpEventStored.self, dateKey: "timestamp", days: 90)
+        try await CoreDataStack.shared.batchDeleteOlderThan(OrefDetermination.self, dateKey: "deliverAt", days: 90)
+        try await CoreDataStack.shared.batchDeleteOlderThan(OpenAPS_Battery.self, dateKey: "date", days: 90)
+        try await CoreDataStack.shared.batchDeleteOlderThan(CarbEntryStored.self, dateKey: "date", days: 90)
+        try await CoreDataStack.shared.batchDeleteOlderThan(Forecast.self, dateKey: "date", days: 90)
 
 
-        // Update lastHistoryCleanupDate
-        lastHistoryCleanupDate = now
+        // TODO: - Purge Data of other (future) entities as well
     }
     }
 
 
     private func subscribe() {
     private func subscribe() {

+ 2 - 2
Model/Helper/GlucoseStored+helper.swift

@@ -21,9 +21,9 @@ extension GlucoseStored {
     }
     }
 
 
     static func glucoseIsFlat(_ glucose: [GlucoseStored]) -> Bool {
     static func glucoseIsFlat(_ glucose: [GlucoseStored]) -> Bool {
-        guard glucose.count >= 3 else { return false }
+        guard glucose.count >= 4 else { return false }
 
 
-        let lastThreeValues = glucose.suffix(3)
+        let lastThreeValues = glucose.suffix(4)
         let firstValue = lastThreeValues.last?.glucose
         let firstValue = lastThreeValues.last?.glucose
 
 
         return lastThreeValues.allSatisfy { $0.glucose == firstValue }
         return lastThreeValues.allSatisfy { $0.glucose == firstValue }