CachingOutlineAPIClient (OutlineKit) wraps LiveOutlineAPIClient at the existing protocol boundary: always tries live, falls back to a SwiftData key/value cache only on failure, and overwrites the cache on every live success. Applies to the read/browse path only (collections, document lists, document content) — search, writes, and sharing pass straight through uncached. Wired in once at SessionStore.makeAPIClient, so no view model needed to change. 5 new tests via a stub OutlineAPIClient (43/43 passing). NetworkMonitor (NWPathMonitor-backed, app target) is unrelated to the cache's own fallback logic — it only drives a new sidebar OfflineBanner so the user knows when they might be looking at stale content.
19 lines
554 B
Swift
19 lines
554 B
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
/// Generic key/value row backing `OfflineCacheStore` — one table for every
|
|
/// cached response shape instead of a `@Model` per Outline type, so adding a
|
|
/// new cached endpoint never needs a schema migration.
|
|
@Model
|
|
public final class CachedPayload {
|
|
@Attribute(.unique) public var key: String
|
|
public var payload: Data
|
|
public var cachedAt: Date
|
|
|
|
public init(key: String, payload: Data, cachedAt: Date) {
|
|
self.key = key
|
|
self.payload = payload
|
|
self.cachedAt = cachedAt
|
|
}
|
|
}
|