channels: fix getParticipant returning success for a left/kicked member

GetParticipant only converted a stale "left" row into USER_NOT_PARTICIPANT
when the participant being queried was the viewer themselves. Querying
about a different user who previously left/was kicked returned their stale
row as a successful result instead, which a client can't classify as a
proper participant type. Check the status regardless of who's asking.
This commit is contained in:
Astra 2026-09-16 14:35:15 +01:00
parent c1b905f49d
commit 61908d1ac2

View file

@ -184,7 +184,12 @@ func (s *ChannelStore) GetParticipant(ctx context.Context, viewerUserID, channel
if errors.Is(err, domain.ErrChannelPrivate) { if errors.Is(err, domain.ErrChannelPrivate) {
return domain.ChannelMember{}, domain.ErrUserNotParticipant return domain.ChannelMember{}, domain.ErrUserNotParticipant
} }
if err == nil && participantUserID == viewerUserID && member.Status == domain.ChannelMemberLeft { // A stale row for a former member (left/kicked) is not a current
// participant for any caller, not just a self-check: channels.getParticipant
// on someone who has left must surface USER_NOT_PARTICIPANT like a missing
// row does, or callers get a "successful" ChannelParticipantLeft result for
// what protocol-wise is an absent participant.
if err == nil && member.Status != domain.ChannelMemberActive {
return domain.ChannelMember{}, domain.ErrUserNotParticipant return domain.ChannelMember{}, domain.ErrUserNotParticipant
} }
return member, err return member, err