Repository navigation
feat(chat): group chat contract and service layer - #1468
Merged
Merged
Conversation
This was referenced Sep 16, 2026
Group chat RPCs and roster updates need the 0.7.0 contract. The version is not on Maven Central yet, so resolution fails until it publishes.
Group chat support lands across three branches; this flag keeps the in-progress surfaces off by default until all three are in. Nothing reads it yet.
The arms mirror the proto Result enums: GetGroupChatFeed and LeaveChat
return {OK, DENIED, NOT_FOUND}, JoinChat adds RULES_NOT_SATISFIED. That
last one is the caller failing the chat's listener rules, which they can
act on, so it is not a NotifiableError.
Thin wrappers over the stub, matching getDmChatFeed: build, validate, dispatch on IO. Nothing calls them yet.
leaveChat recovers a server NOT_FOUND to success: the caller is not on the roster, which is the state the call was asked to produce, and reporting it as a failure would surface an error for a no-op. The recovery sits before ErrorUtils.handleError so it is not logged either. The group feed takes no chat type filter — GetGroupChatFeedRequest carries only query options, and the server decides what a group is.
Roster changes are convergent, not sequenced: each one carries the roster summary after it, and a client applies one only when that version beats the version it holds. So they get their own domain type rather than joining ChatEvent, which is gap-detected by sequence. A join addressed to the recipient carries the full chat snapshot, so being added to a chat needs no refetch to appear in the list. Member mapping moves out of toChatMetadata into toChatMember so the two paths build a member identically — including the profile's user-id fallback, without which an expired avatar URL can never be re-minted.
bmc08gt
force-pushed
the
feat/group-chat-contract
branch
from
September 16, 2026 15:34
311f454 to
8a54a3d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack:
First of three. Everything group chats need below the feed and the UI, with nothing yet reading any of it.
GroupChatsfeature flag, off.GetGroupChatFeed,JoinChatandLeaveChatwrapped end to end — API, typed errors, repository, controller.chat_metadatagains a group's title, picture, roster summary and rules, with the mapping to and from the row.The RPCs are the reason this is its own PR: the layers above are worth reviewing against a contract that is already settled.