You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Messages: cursor pagination, onlyMine, and viewing-preference feed modes #36
GetMessagesAsync uses ?limit=&offset=. The live spec documents limit, onlyMine, tag, cursor for GET /api/messages — offset is no longer a documented parameter.
Live verification (2026-09-15)
offsetstill works, and the response now returns a cursor alongside it:
So this is not a live break today — but the app is on an undocumented parameter while the documented keyset path is available, and the spec is explicit: "Pass back the nextCursor from the previous response verbatim — never construct, parse, or modify one."
Viewing preferences (/help/settings)
GET /api/user returns viewingPreference and messagesPerPage (10–30). Documented feed modes: My Messages, All Messages, Followers Only, Following Only. The app honors none of them.
Acceptance criteria
Models/Pagination.cs gains NextCursor; GetMessagesAsync takes an opaque cursor and passes it back verbatim.
Infinite scroll in FeedViewModel drives off nextCursor, falling back to offset only if a cursor is absent.
onlyMine and tag are supported parameters.
Feed mode selector reflecting and honoring viewingPreference.
Page size honors messagesPerPage instead of the hard-coded limit = 20.
Two of the four feed modes have no server-side support — this needs a decision
GET /api/user stores viewingPreference, and /help/settings documents four modes: My Messages / All Messages / Followers Only / Following Only. The server enum (from its own 400) is my_messages, all_messages, followers_only, following_only.
But GET /api/messages accepts only limit, onlyMine, tag, cursor — and there is no /api/feed* path at all. Probed live 2026-09-16:
The parameter isn't rejected, it's ignored — total stays 363 regardless. So:
Mode
Server support
All Messages
✅ no parameter
My Messages
✅ onlyMine=true (total drops 363 → 36)
Followers Only
❌ none
Following Only
❌ none
Why I'm not guessing at this
Client-side filtering is the only alternative and it's a bad one: it would mean fetching the follow graph, then paging the entire feed to find matching posts — many requests, wrong counts, and a "load more" that skips unpredictable amounts. That's worse than not offering the mode.
What I'd suggest
Implement the two modes that work (All / My), and render the other two as unavailable with a short explanation, rather than offering controls that silently do nothing — which is exactly the failure mode #47, #91 and #160 all turned out to be.
The decision is yours: ship two modes now, or hold the whole selector until the server exposes a follow-scoped filter. If the web app implements Followers/Following Only, it's either doing it server-side through a route the spec doesn't document, or filtering client-side — worth checking before accepting this conclusion.
Everything else in #36 (cursor pagination, onlyMine, messagesPerPage) is unblocked. Note Pagination.NextCursor and CursorPager<T> already exist in #130, and CurrentUser.EffectiveMessagesPerPage in #131.
Activity
Adron commentedon Sep 16, 2026
Two of the four feed modes have no server-side support — this needs a decision
GET /api/userstoresviewingPreference, and/help/settingsdocuments four modes: My Messages / All Messages / Followers Only / Following Only. The server enum (from its own 400) ismy_messages,all_messages,followers_only,following_only.But
GET /api/messagesaccepts onlylimit,onlyMine,tag,cursor— and there is no/api/feed*path at all. Probed live 2026-09-16:The parameter isn't rejected, it's ignored —
totalstays 363 regardless. So:onlyMine=true(total drops 363 → 36)Why I'm not guessing at this
Client-side filtering is the only alternative and it's a bad one: it would mean fetching the follow graph, then paging the entire feed to find matching posts — many requests, wrong counts, and a "load more" that skips unpredictable amounts. That's worse than not offering the mode.
What I'd suggest
Implement the two modes that work (All / My), and render the other two as unavailable with a short explanation, rather than offering controls that silently do nothing — which is exactly the failure mode #47, #91 and #160 all turned out to be.
The decision is yours: ship two modes now, or hold the whole selector until the server exposes a follow-scoped filter. If the web app implements Followers/Following Only, it's either doing it server-side through a route the spec doesn't document, or filtering client-side — worth checking before accepting this conclusion.
Everything else in #36 (cursor pagination,
onlyMine,messagesPerPage) is unblocked. NotePagination.NextCursorandCursorPager<T>already exist in #130, andCurrentUser.EffectiveMessagesPerPagein #131.