diff options
| author | Christian Cleberg <[email protected]> | 2026-07-17 16:41:52 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-17 16:41:52 -0500 |
| commit | 2f72d3d0736a6fac306d4e5d9406cb33b08bc2a0 (patch) | |
| tree | ca6bfe8277883d87bc6e45a9393f19c642f3a502 /octosentry/PersistedState.swift | |
| parent | d8862a9b78b0d6cf4e11cf537be7678794e08811 (diff) | |
| download | octosentry-2f72d3d0736a6fac306d4e5d9406cb33b08bc2a0.tar.gz octosentry-2f72d3d0736a6fac306d4e5d9406cb33b08bc2a0.tar.bz2 octosentry-2f72d3d0736a6fac306d4e5d9406cb33b08bc2a0.zip | |
Add persistence, multi-repo watch list, and background polling0.3.0
Closes #1-#5 (milestones 0.2.0, 0.3.0).
- Flat JSON persistence (PersistedState/PersistenceStore) in Application
Support, chosen over SwiftData since the dataset is small and the
existing model types are plain Codable value types passed across actor
boundaries.
- Repo watch list, per-event seen-state, and last-fetch timestamps are
now persisted instead of living only in memory.
- Configurable minimum severity filter, applied from a cached raw fetch
so changing it doesn't require a network round-trip.
- Multi-repo support: SecurityEventStore now loops over a persisted watch
list instead of one hardcoded repo, with an in-popover UI (gear button)
to add/remove repos.
- Background polling every 15 minutes, layered on top of the existing
refresh-on-open and manual refresh, so the feed stays fresh even while
the popover is closed.
Diffstat (limited to 'octosentry/PersistedState.swift')
| -rw-r--r-- | octosentry/PersistedState.swift | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/octosentry/PersistedState.swift b/octosentry/PersistedState.swift new file mode 100644 index 0000000..3ef4234 --- /dev/null +++ b/octosentry/PersistedState.swift @@ -0,0 +1,26 @@ +// +// PersistedState.swift +// octosentry +// +// Everything the app remembers across launches: the repo watch list, +// local-only seen-state per event, last-fetch timestamp per repo, and the +// minimum severity filter. Flat JSON over SwiftData (see #1) — small, +// inspectable, and these are already plain Codable values passed across +// actor boundaries, not reference types tied to a persistence context. +// + +import Foundation + +nonisolated struct PersistedState: Codable { + var watchedRepos: [String] + var seenEventIDs: Set<String> + var lastFetchByRepo: [String: Date] + var minimumSeverity: SecurityEventSeverity + + static let placeholder = PersistedState( + watchedRepos: ["ccleberg/cleberg.net"], + seenEventIDs: [], + lastFetchByRepo: [:], + minimumSeverity: .low + ) +} |
