diff --git a/VERSION b/VERSION index 006c2027d..4c08787e6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.115.6 +0.116.0 diff --git a/protocol/messenger_group_chat.go b/protocol/messenger_group_chat.go index ea5228090..596684c16 100644 --- a/protocol/messenger_group_chat.go +++ b/protocol/messenger_group_chat.go @@ -114,10 +114,10 @@ func (m *Messenger) CreateGroupChatFromInvitation(name string, chatID string, ad return &response, m.saveChat(&chat) } -func (m *Messenger) RemoveMemberFromGroupChat(ctx context.Context, chatID string, member string) (*MessengerResponse, error) { +func (m *Messenger) RemoveMembersFromGroupChat(ctx context.Context, chatID string, members []string) (*MessengerResponse, error) { var response MessengerResponse - logger := m.logger.With(zap.String("site", "RemoveMemberFromGroupChat")) - logger.Info("Removing member form group chat", zap.String("chatID", chatID), zap.String("member", member)) + logger := m.logger.With(zap.String("site", "RemoveMembersFromGroupChat")) + logger.Info("Removing members form group chat", zap.String("chatID", chatID), zap.Any("members", members)) chat, ok := m.allChats.Load(chatID) if !ok { return nil, ErrChatNotFound @@ -136,17 +136,20 @@ func (m *Messenger) RemoveMemberFromGroupChat(ctx context.Context, chatID string } clock, _ := chat.NextClockAndTimestamp(m.getTimesource()) - // Remove member - event := v1protocol.NewMemberRemovedEvent(member, clock) - event.ChatID = chat.ID - err = event.Sign(m.identity) - if err != nil { - return nil, err - } - err = group.ProcessEvent(event) - if err != nil { - return nil, err + for _, member := range members { + // Remove member + event := v1protocol.NewMemberRemovedEvent(member, clock) + event.ChatID = chat.ID + err = event.Sign(m.identity) + if err != nil { + return nil, err + } + + err = group.ProcessEvent(event) + if err != nil { + return nil, err + } } encodedMessage, err := m.sender.EncodeMembershipUpdate(group, nil) diff --git a/protocol/messenger_group_chat_test.go b/protocol/messenger_group_chat_test.go index cf7922ad1..43064d4ca 100644 --- a/protocol/messenger_group_chat_test.go +++ b/protocol/messenger_group_chat_test.go @@ -255,20 +255,26 @@ func (s *MessengerGroupChatSuite) TestGroupChatMembersRemoval() { admin := s.startNewMessenger() memberA := s.startNewMessenger() memberB := s.startNewMessenger() - members := []string{common.PubkeyToHex(&memberA.identity.PublicKey), common.PubkeyToHex(&memberB.identity.PublicKey)} + memberC := s.startNewMessenger() + members := []string{common.PubkeyToHex(&memberA.identity.PublicKey), common.PubkeyToHex(&memberB.identity.PublicKey), + common.PubkeyToHex(&memberC.identity.PublicKey)} s.makeMutualContacts(admin, memberA) s.makeMutualContacts(admin, memberB) + s.makeMutualContacts(admin, memberC) groupChat := s.createGroupChat(admin, "test_group_chat", members) s.verifyGroupChatCreated(memberA, true) s.verifyGroupChatCreated(memberB, true) + s.verifyGroupChatCreated(memberC, true) - _, err := memberA.RemoveMemberFromGroupChat(context.Background(), groupChat.ID, common.PubkeyToHex(&memberB.identity.PublicKey)) + _, err := memberA.RemoveMembersFromGroupChat(context.Background(), groupChat.ID, []string{common.PubkeyToHex(&memberB.identity.PublicKey), + common.PubkeyToHex(&memberC.identity.PublicKey)}) s.Require().Error(err) // only admin can remove members from the group - _, err = admin.RemoveMemberFromGroupChat(context.Background(), groupChat.ID, common.PubkeyToHex(&memberB.identity.PublicKey)) + _, err = admin.RemoveMembersFromGroupChat(context.Background(), groupChat.ID, []string{common.PubkeyToHex(&memberB.identity.PublicKey), + common.PubkeyToHex(&memberC.identity.PublicKey)}) s.Require().NoError(err) // ensure removal is propagated to other members @@ -285,6 +291,7 @@ func (s *MessengerGroupChatSuite) TestGroupChatMembersRemoval() { defer s.NoError(admin.Shutdown()) defer s.NoError(memberA.Shutdown()) defer s.NoError(memberB.Shutdown()) + defer s.NoError(memberC.Shutdown()) } func (s *MessengerGroupChatSuite) TestGroupChatEdit() { diff --git a/services/chat/api_group_chats.go b/services/chat/api_group_chats.go index a4df911d6..f74abf7d5 100644 --- a/services/chat/api_group_chats.go +++ b/services/chat/api_group_chats.go @@ -105,7 +105,7 @@ func (api *API) RemoveMember(ctx context.Context, communityID types.HexBytes, ch } return api.execAndGetGroupChatResponse(func() (*protocol.MessengerResponse, error) { - return api.s.messenger.RemoveMemberFromGroupChat(ctx, chatID, member) + return api.s.messenger.RemoveMembersFromGroupChat(ctx, chatID, []string{member}) }) } diff --git a/services/ext/api.go b/services/ext/api.go index 06ab822bb..22efc0545 100644 --- a/services/ext/api.go +++ b/services/ext/api.go @@ -219,7 +219,11 @@ func (api *PublicAPI) AddMembersToGroupChat(ctx Context, chatID string, members } func (api *PublicAPI) RemoveMemberFromGroupChat(ctx Context, chatID string, member string) (*protocol.MessengerResponse, error) { - return api.service.messenger.RemoveMemberFromGroupChat(ctx, chatID, member) + return api.service.messenger.RemoveMembersFromGroupChat(ctx, chatID, []string{member}) +} + +func (api *PublicAPI) RemoveMembersFromGroupChat(ctx Context, chatID string, members []string) (*protocol.MessengerResponse, error) { + return api.service.messenger.RemoveMembersFromGroupChat(ctx, chatID, members) } func (api *PublicAPI) AddAdminsToGroupChat(ctx Context, chatID string, members []string) (*protocol.MessengerResponse, error) { diff --git a/services/shhext/api_nimbus.go b/services/shhext/api_nimbus.go index 9b567f1e7..4a42346b2 100644 --- a/services/shhext/api_nimbus.go +++ b/services/shhext/api_nimbus.go @@ -289,7 +289,7 @@ func (api *NimbusPublicAPI) AddMembersToGroupChat(ctx Context, chatID string, me } func (api *NimbusPublicAPI) RemoveMemberFromGroupChat(ctx Context, chatID string, member string) (*protocol.MessengerResponse, error) { - return api.service.messenger.RemoveMemberFromGroupChat(ctx, chatID, member) + return api.service.messenger.RemoveMembersFromGroupChat(ctx, chatID, []string{member}) } func (api *NimbusPublicAPI) AddAdminsToGroupChat(ctx Context, chatID string, members []string) (*protocol.MessengerResponse, error) {