80 lines
2.8 KiB
Swift
80 lines
2.8 KiB
Swift
//
|
|
// DataStateManager.swift
|
|
|
|
import Foundation
|
|
|
|
/// Manages the overall data state timestamp for sync purposes
|
|
class DataStateManager {
|
|
|
|
private let userDefaults = UserDefaults.standard
|
|
|
|
private enum Keys {
|
|
static let lastModified = "ascently_data_last_modified"
|
|
static let initialized = "ascently_data_state_initialized"
|
|
}
|
|
|
|
static let shared = DataStateManager()
|
|
|
|
private init() {
|
|
// Initialize with current timestamp if this is the first time
|
|
if !isInitialized() {
|
|
AppLogger.info("DataStateManager: First time initialization", tag: "DataState")
|
|
// Set initial timestamp to a very old date so server data will be considered newer
|
|
let epochTime = "1970-01-01T00:00:00.000Z"
|
|
userDefaults.set(epochTime, forKey: Keys.lastModified)
|
|
markAsInitialized()
|
|
AppLogger.info(
|
|
"DataStateManager initialized with epoch timestamp: \(epochTime)", tag: "DataState")
|
|
} else {
|
|
AppLogger.info(
|
|
"DataStateManager: Already initialized, current timestamp: \(getLastModified())",
|
|
tag: "DataState")
|
|
}
|
|
}
|
|
|
|
/// Updates the data state timestamp to the current time. Call this whenever any data is modified
|
|
/// (create, update, delete).
|
|
func updateDataState() {
|
|
let now = ISO8601DateFormatter().string(from: Date())
|
|
userDefaults.set(now, forKey: Keys.lastModified)
|
|
AppLogger.info("iOS Data state updated to: \(now)", tag: "DataState")
|
|
}
|
|
|
|
func getLastModified() -> String {
|
|
if let storedTimestamp = userDefaults.string(forKey: Keys.lastModified) {
|
|
AppLogger.debug(
|
|
"iOS DataStateManager returning stored timestamp: \(storedTimestamp)",
|
|
tag: "DataState")
|
|
return storedTimestamp
|
|
}
|
|
|
|
let epochTime = "1970-01-01T00:00:00.000Z"
|
|
AppLogger.warning(
|
|
"No data state timestamp found - returning epoch time: \(epochTime)", tag: "DataState")
|
|
return epochTime
|
|
}
|
|
|
|
func setLastModified(_ timestamp: String) {
|
|
userDefaults.set(timestamp, forKey: Keys.lastModified)
|
|
AppLogger.info("Data state set to: \(timestamp)", tag: "DataState")
|
|
}
|
|
|
|
func reset() {
|
|
userDefaults.removeObject(forKey: Keys.lastModified)
|
|
userDefaults.removeObject(forKey: Keys.initialized)
|
|
AppLogger.info("Data state reset", tag: "DataState")
|
|
}
|
|
|
|
private func isInitialized() -> Bool {
|
|
return userDefaults.bool(forKey: Keys.initialized)
|
|
}
|
|
|
|
private func markAsInitialized() {
|
|
userDefaults.set(true, forKey: Keys.initialized)
|
|
}
|
|
|
|
func getDebugInfo() -> String {
|
|
return "DataState(lastModified=\(getLastModified()), initialized=\(isInitialized()))"
|
|
}
|
|
}
|