From 39bb82ee3e3ba159c9c73571aad7368bde2abfb4 Mon Sep 17 00:00:00 2001 From: Ilyas Hallak Date: Mon, 1 Dec 2025 21:43:29 +0100 Subject: [PATCH] Migrate offline settings from UserDefaults to CoreData Move offline reading settings from JSON-based UserDefaults storage to CoreData SettingEntity for consistency with other app settings. Changes: - Add offline settings fields to SettingEntity (offlineEnabled, offlineMaxUnreadArticles, offlineSaveImages, offlineLastSyncDate) - Update SettingsRepository to use CoreData instead of UserDefaults for offline settings - Use consistent async/await pattern with withCheckedThrowingContinuation - Remove JSON encoding/decoding in favor of direct CoreData properties Benefits: - Unified settings storage in CoreData - Type-safe property access - Automatic migration support - No redundant UserDefaults entries --- .../Data/Repository/SettingsRepository.swift | 61 +++++++++++++++---- .../readeck.xcdatamodel/contents | 4 ++ 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/readeck/Data/Repository/SettingsRepository.swift b/readeck/Data/Repository/SettingsRepository.swift index 514eb19..c7a8fa2 100644 --- a/readeck/Data/Repository/SettingsRepository.swift +++ b/readeck/Data/Repository/SettingsRepository.swift @@ -273,25 +273,60 @@ class SettingsRepository: PSettingsRepository { // MARK: - Offline Settings - private let offlineSettingsKey = "offlineSettings" private let logger = Logger.data func loadOfflineSettings() async throws -> OfflineSettings { - guard let data = userDefault.data(forKey: offlineSettingsKey) else { - logger.info("No offline settings found, returning defaults") - return OfflineSettings() // Default settings - } + let context = coreDataManager.context - let decoder = JSONDecoder() - let settings = try decoder.decode(OfflineSettings.self, from: data) - logger.debug("Loaded offline settings: enabled=\(settings.enabled), max=\(settings.maxUnreadArticlesInt)") - return settings + return try await withCheckedThrowingContinuation { continuation in + context.perform { + do { + let fetchRequest: NSFetchRequest = SettingEntity.fetchRequest() + fetchRequest.fetchLimit = 1 + + let settingEntities = try context.fetch(fetchRequest) + let settingEntity = settingEntities.first + + let settings = OfflineSettings( + enabled: settingEntity?.offlineEnabled ?? false, + maxUnreadArticles: settingEntity?.offlineMaxUnreadArticles ?? 20, + saveImages: settingEntity?.offlineSaveImages ?? true, + lastSyncDate: settingEntity?.offlineLastSyncDate + ) + + self.logger.debug("Loaded offline settings: enabled=\(settings.enabled), max=\(settings.maxUnreadArticlesInt)") + continuation.resume(returning: settings) + } catch { + self.logger.error("Failed to load offline settings: \(error.localizedDescription)") + continuation.resume(throwing: error) + } + } + } } func saveOfflineSettings(_ settings: OfflineSettings) async throws { - let encoder = JSONEncoder() - let data = try encoder.encode(settings) - userDefault.set(data, forKey: offlineSettingsKey) - logger.info("Saved offline settings: enabled=\(settings.enabled), max=\(settings.maxUnreadArticlesInt)") + let context = coreDataManager.context + + return try await withCheckedThrowingContinuation { continuation in + context.perform { + do { + let fetchRequest: NSFetchRequest = SettingEntity.fetchRequest() + let existingSettings = try context.fetch(fetchRequest).first ?? SettingEntity(context: context) + + existingSettings.offlineEnabled = settings.enabled + existingSettings.offlineMaxUnreadArticles = settings.maxUnreadArticles + existingSettings.offlineSaveImages = settings.saveImages + existingSettings.offlineLastSyncDate = settings.lastSyncDate + + try context.save() + self.logger.info("Saved offline settings: enabled=\(settings.enabled), max=\(settings.maxUnreadArticlesInt)") + continuation.resume() + } catch { + self.logger.error("Failed to save offline settings: \(error.localizedDescription)") + continuation.resume(throwing: error) + } + } + } } + } diff --git a/readeck/readeck.xcdatamodeld/readeck.xcdatamodel/contents b/readeck/readeck.xcdatamodeld/readeck.xcdatamodel/contents index ad900e5..2d34077 100644 --- a/readeck/readeck.xcdatamodeld/readeck.xcdatamodel/contents +++ b/readeck/readeck.xcdatamodeld/readeck.xcdatamodel/contents @@ -61,6 +61,10 @@ + + + +