feat(guilds): the roster projection, a guild detail page, and the slot core fills #11
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/teams-phase3-projection-slot"
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?
Teams phase 3, the module's half. Pairs with website#152 and docs#156.
Merge website#152 first — this needs
registry.declareModuleSlotandSlotin the UI kit, andCI clones core at
ci/core-ref.json, so this will be red until that lands and the pin moves.What this ships
projectRoster— the optional fourth provider method, and the only one core calls on a requestpath. Core holds the roster and owns its public shape; who is allowed to look is this module's,
because the audience rungs live here and core does not know what a rung is.
The answer is all-or-nothing, which is the honest translation rather than a shortcut: a rung is a
property of the feature, and there is no configuration where some members of a guild are public and
others are not.
The refusal semantics invert here, and the tests say so. For the other three methods a refusal
means "change nothing" and an empty array would be destructive. Core fails closed on this one, so
the dangerous answer is the opposite — returning every key because the config could not be read would
publish a roster an operator gated to staff.
/uo/guilds/:id— the detail view the board never had, with the roster from this module's ownboard (the same data it answers core's provider from). It declares
uo.guild.detailand core fills itwith the Team activity feed.
GET /public/shard/guilds/:idbacks it, gated and projected through thesame
guildsfeature as the board.TeamOverviewStripis deleted with the core Team page it filled.team.member.rowis not declared:the useful thing in a roster row is a link to the character behind it, and nothing core could supply
identifies one.
The bug the tests caught
viewerLeveltakes a request; core hands over a described viewer. Given a synthetic request with noreq.userit falls through toauth.getUserFromRequest, which expects real cookies and throws —and that throw would have become a refusal, so every anonymous visitor would have been served an
empty roster on a shard whose guilds are public. Anonymous is now answered directly, as the known
answer it is.
Testing
npm test --prefix server: 428 tests, including the inverted refusal semantics.npm test --prefix client: 42 tests; the registration test now asserts the declared slot andthat the page owning it actually renders it — a slot nothing renders is a slot core fills into the
void.
swagger-fragment.jsonandroutes.manifest.jsonregenerated.Live-rig acceptance
Real ServUO + real sidecar + website with this module installed:
guildsraised tostaffgave an anonymous caller 0 roster rows and an admin 25, same URL;acct/webIdstripped — a roster is wherethe locked fields appear in bulk;
/by-external/rust/1→ 404).