summaryrefslogtreecommitdiff
path: root/ROADMAP.md
diff options
context:
space:
mode:
Diffstat (limited to 'ROADMAP.md')
-rw-r--r--ROADMAP.md66
1 files changed, 37 insertions, 29 deletions
diff --git a/ROADMAP.md b/ROADMAP.md
index 875b949..e86ddb0 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -36,35 +36,43 @@ been running only on demand in Xcode, and ten had rotted:
and inbox threads keyed `id` on a subject-derived grouping key so two threads
sharing a subject on one list collided under `Identifiable`.
-## Phase 1: Close the write gaps
-
-Small, independently shippable mutations that already exist in the API but are
-never called. Each removes a "why can't I do this here?" moment.
-
-- `updateTicket` — edit ticket title and description after creation. Currently
- a ticket can be created and its status changed, but never edited.
-- `deleteTicket` — delete a ticket.
-- `trackerSubscribe` / `trackerUnsubscribe`, `ticketSubscribe` /
- `ticketUnsubscribe`, `mailingListSubscribe` / `mailingListUnsubscribe` —
- subscriptions are currently read-only. `MailingListListView` reads the
- `subscriptions` query, but nothing can subscribe or unsubscribe.
-- `updatePreferences` (todo.sr.ht and lists.sr.ht) — email notification
- preferences.
-
-### Refactors to fold in
-
-These are touched by everything in later phases, so they belong here rather
-than as standalone work.
-
-- `SRHTClient` has four near-identical request-and-decode paths (`execute`,
- `executeMultipart`, `executeMultipartFiles`, `executeAndCache`, plus the
- private `performGraphQLRequest`). The token guard, header setup, status-code
- handling, and a ~35-line `#if DEBUG` logging block are each duplicated about
- five times. Collapse to one request builder and one decode helper.
-- Two caches overlap: the in-memory `responseCache` and the persistent `cache`,
- reached through two different `executeCached` overloads with different return
- types and semantics (one does stale-while-revalidate with TTLs, the other only
- checks memory). Unify on the TTL-aware path.
+## Phase 1: Close the write gaps — done (v3.6.0)
+
+Small, independently shippable mutations that already existed in the API but
+were never called. Each removes a "why can't I do this here?" moment.
+
+- ~~`updateTicket`~~ — edit a ticket's subject and body after creation.
+- ~~`deleteTicket`~~ — delete a ticket, behind a confirmation.
+- ~~`ticketSubscribe` / `ticketUnsubscribe`, `trackerSubscribe` /
+ `trackerUnsubscribe`~~ — `Ticket.subscription` and `Tracker.subscription` are
+ null when not subscribed, so both toggles reflect real server state.
+- ~~`mailingListUnsubscribe`~~ — see the caveat below.
+- ~~`updatePreferences`~~ (todo.sr.ht and lists.sr.ht) — `notifySelf` and
+ `copySelf`, surfaced as an Email section in Settings.
+
+`mailingListSubscribe` is deliberately not wired up. `MailingList` has no
+`subscription` field, unlike `Ticket` and `Tracker`, so per-list state is only
+knowable from the `subscriptions` query — which by definition lists what the
+user is already subscribed to. Subscribing needs a list the user is *not*
+subscribed to, and sr.ht exposes no discovery API to find one (see
+[SCOPE.md](SCOPE.md) on hub.sr.ht). Revisit if hub.sr.ht ever gains an API, or
+alongside Phase 2, which surfaces lists through patchsets.
+
+### Refactors folded in
+
+- ~~Collapse `SRHTClient`'s duplicated request paths~~. Extracted
+ `makeAuthorizedRequest`, `send`, and `encodedGraphQLBody`; `executeMultipart`
+ became the single-file case of `executeMultipartFiles`. The `#if DEBUG`
+ logging block went from five copies to one. 938 lines to 569.
+- ~~Unify the two `executeCached` overloads~~. The memory-only overload and
+ `executeAndCache` turned out to be dead — all 38 call sites already used the
+ TTL-aware path — so both were removed rather than merged. `responseCache`
+ remains as the in-memory layer behind `cachedPayload`.
+
+Known follow-up: `BuildListViewModel`, `RepositoryListViewModel`, and
+`PasteService` still read `client.responseCache` directly, falling back across
+two different cache keys. That predates `APICacheKeys` and should be folded into
+`cachedPayload`.
## Phase 2: Patchsets