feat(store): persist points.board and serve it from GET /points #18
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/points-board"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
Protocol 3.0 §7 (
docs/link/v3.md), order 4 of 6. The shard publishes ~25 points/loyalty leaderboards as onepoints.boardframe per system; the sidecar folds each into a projection table and serves them back.Part of a four-repo change: servuo-plugins #4 → link (this) → website #114 → docs #69.
points_boards(system PK, name, json, updated_t)— keyed by the shard's ownPointsTypename (QueensLoyalty,CleanUpBritannia, …).nameis hoisted only for theORDER BY.main.rsgains apoints.boardarm keyed onsystem, alongside the existing champ / guild / governor / house / ruleset projections. There is deliberately no delete counterpart: the shard's set of point systems is fixed at startup, so it emits nopoints.remove— the same shape the governor board already has.GET /pointsreturns every board ordered by display name.GET /points/:systemreturns one, or 404 when the shard has never published that system.404and "a published board nobody has scored in yet" (200, emptytop) are different answers, and the website renders them differently.Store-backed rather than an RPC for the same reason as the other boards, and it matters more here: these are standings accumulated over months, so blanking them during a shard restart reads as data loss rather than as staleness.
PROTOCOL_VERSIONstays at 2. The bump to 3 is the one-timeedge→maincutover in v3.md §4, not a per-phase change — a bump 409s every protected route and closes the website's WS, so doing it per phase would break the site repeatedly.How it was tested
cargo buildandcargo clippy --all-targets— clean, no warnings.playersand thetoplength both replaced, not appended);404for an unknown system,401unauthenticated.GET /points. This is also the path that surfaced the plugin'smaxPointsoverflow — the sidecar forwarded it verbatim, which is exactly what a dumb forwarder should do, and re-serving after the plugin fix showed the corrected values.GET /pointsbackfill (snapshotted points boards from /points {"count":2}) and live WS fan-out both confirmed from the website side in #114.Checklist
AI-assisted contributions (required)
Claude Code (Opus 5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with aCo-Authored-Bytrailer.License
Protocol 3.0 §7 (docs/link/v3.md). The shard publishes ~25 points/loyalty leaderboards as one points.board frame per system; the sidecar folds each into a projection table and serves them back, so the site's leaderboards page renders during a shard outage. - points_boards(system PK, name, json, updated_t), keyed by the shard's own PointsType name. `name` is hoisted only for the ORDER BY. - main.rs gains a points.board arm keyed on `system`, alongside the existing champ/guild/governor/house/ruleset projections. There is deliberately no delete counterpart: the shard's set of point systems is fixed at startup, so it emits no points.remove — the same shape the governor board already has. - GET /points returns every board ordered by display name; GET /points/:system returns one, or 404 when the shard has never published that system. 404 and "a published board nobody has scored in yet" (200, empty top) are different answers, and the website renders them differently. Store-backed rather than an RPC for the same reason as the other boards, and it matters more here: these are standings accumulated over months, so blanking them during a shard restart reads as data loss rather than as staleness. PROTOCOL_VERSION stays at 2 — the bump to 3 is the one-time edge → main cutover in v3.md §4, not a per-phase change. cargo build and cargo clippy --all-targets are clean. Smoke-tested against a driver on the loopback link: two boards stored and served, a re-emitted system overwriting rather than accumulating, 404 for an unknown system, 401 unauthenticated. Also verified against the real ServUO shard, which fed five live boards through this path. Co-Authored-By: Claude <noreply@anthropic.com>