gamer147
1b7fa2d525
feat(guild): invite state machine
...
Add surrogate PK (IDENTITY bigint) to GuildInvite for wire invite_id.
Implement InviteAsync, CancelInviteAsync, RejectInviteAsync,
ListOutgoingInvitesAsync, ListInvitedGuildsAsync in GuildService.
Wire 5 endpoints: invite_user_list, invited_guild_list, invite,
cancel_invite, reject_invite in GuildController.
Migration: AddGuildInviteSurrogatePk — drops composite PK, adds Id
IDENTITY column, adds unique index on (GuildId, InviteeViewerId).
6 integration tests in GuildInviteFlowTests all green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-27 13:21:57 -04:00
gamer147
c103ab6a87
fix(guild): populate leader_name in search results (matches prod capture)
...
Add IViewerRepository.LoadDisplayNamesAsync (batch AsNoTracking select),
extend GuildSearchEntry with LeaderName, enrich GuildService.SearchAsync
with a leader-id batch lookup, and thread the name through the controller's
ToDetailDto call. Adds a leader_name assertion to GuildSearchFlowTests.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-27 13:08:11 -04:00
gamer147
3f8f04eb1a
feat(guild): /guild/search_guild
...
Implement SearchAsync in GuildService (wraps IGuildRepository.SearchAsync +
CountBatchByGuildIdsAsync), wire the controller action, add 7 integration
tests (GuildSearchFlowTests) covering no-filter / activity / join_condition /
bucket-1 / bucket-3 / name-prefix / flat-entry shape, and a wire-shape test
in GuildWireShape confirming list entries are flat (no detail wrapper).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-27 13:01:58 -04:00