From e298881a6c183cb041d78dc74e21e5a4105bef89 Mon Sep 17 00:00:00 2001 From: ryanfkeepers Date: Wed, 24 Jan 2024 16:20:15 -0700 Subject: [PATCH] add chat members to the backup lazily fetch the chat members and add them to the chat during backup item downloads. --- .../collection/teamsChats/chat_handler.go | 7 ++ src/pkg/services/m365/api/teamsChats_pager.go | 73 +++++++++++++++++++ .../m365/api/teamsChats_pager_test.go | 24 ++++++ 3 files changed, 104 insertions(+) diff --git a/src/internal/m365/collection/teamsChats/chat_handler.go b/src/internal/m365/collection/teamsChats/chat_handler.go index 121068655..adbd1103b 100644 --- a/src/internal/m365/collection/teamsChats/chat_handler.go +++ b/src/internal/m365/collection/teamsChats/chat_handler.go @@ -99,6 +99,13 @@ func (bh usersChatsBackupHandler) getItem( chat.SetMessages(msgs) + members, err := bh.ac.GetChatMembers(ctx, chatID, api.CallConfig{}) + if err != nil { + return nil, nil, clues.Stack(err) + } + + chat.SetMembers(members) + return chat, api.TeamsChatInfo(chat), nil } diff --git a/src/pkg/services/m365/api/teamsChats_pager.go b/src/pkg/services/m365/api/teamsChats_pager.go index fe5a126bb..77bee30e5 100644 --- a/src/pkg/services/m365/api/teamsChats_pager.go +++ b/src/pkg/services/m365/api/teamsChats_pager.go @@ -12,6 +12,79 @@ import ( "github.com/alcionai/corso/src/pkg/services/m365/api/pagers" ) +// --------------------------------------------------------------------------- +// chat members pager +// --------------------------------------------------------------------------- + +// delta queries are not supported +var _ pagers.NonDeltaHandler[models.ConversationMemberable] = &chatMembersPageCtrl{} + +type chatMembersPageCtrl struct { + chatID string + gs graph.Servicer + builder *chats.ItemMembersRequestBuilder + options *chats.ItemMembersRequestBuilderGetRequestConfiguration +} + +func (p *chatMembersPageCtrl) SetNextLink(nextLink string) { + p.builder = chats.NewItemMembersRequestBuilder(nextLink, p.gs.Adapter()) +} + +func (p *chatMembersPageCtrl) GetPage( + ctx context.Context, +) (pagers.NextLinkValuer[models.ConversationMemberable], error) { + resp, err := p.builder.Get(ctx, p.options) + return resp, graph.Stack(ctx, err).OrNil() +} + +func (p *chatMembersPageCtrl) ValidModTimes() bool { + return true +} + +func (c Chats) NewChatMembersPager( + chatID string, + cc CallConfig, +) *chatMembersPageCtrl { + builder := c.Stable. + Client(). + Chats(). + ByChatId(chatID). + Members() + + options := &chats.ItemMembersRequestBuilderGetRequestConfiguration{ + QueryParameters: &chats.ItemMembersRequestBuilderGetQueryParameters{}, + Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)), + } + + if len(cc.Select) > 0 { + options.QueryParameters.Select = cc.Select + } + + if len(cc.Expand) > 0 { + options.QueryParameters.Expand = cc.Expand + } + + return &chatMembersPageCtrl{ + chatID: chatID, + builder: builder, + gs: c.Stable, + options: options, + } +} + +// GetChatMembers fetches a delta of all members in the chat. +func (c Chats) GetChatMembers( + ctx context.Context, + chatID string, + cc CallConfig, +) ([]models.ConversationMemberable, error) { + ctx = clues.Add(ctx, "chat_id", chatID) + pager := c.NewChatMembersPager(chatID, cc) + items, err := pagers.BatchEnumerateItems[models.ConversationMemberable](ctx, pager) + + return items, graph.Stack(ctx, err).OrNil() +} + // --------------------------------------------------------------------------- // chat message pager // --------------------------------------------------------------------------- diff --git a/src/pkg/services/m365/api/teamsChats_pager_test.go b/src/pkg/services/m365/api/teamsChats_pager_test.go index c74d5f733..b276b245e 100644 --- a/src/pkg/services/m365/api/teamsChats_pager_test.go +++ b/src/pkg/services/m365/api/teamsChats_pager_test.go @@ -61,6 +61,11 @@ func (suite *ChatsPagerIntgSuite) TestEnumerateChats() { ac, chatID, chat.GetLastMessagePreview()) + + testEnumerateChatMembers( + suite.T(), + ac, + chatID) }) } } @@ -123,3 +128,22 @@ func testEnumerateChatMessages( } } } + +func testEnumerateChatMembers( + t *testing.T, + ac Chats, + chatID string, +) { + ctx, flush := tester.NewContext(t) + defer flush() + + cc := CallConfig{} + + members, err := ac.GetChatMembers(ctx, chatID, cc) + require.NoError(t, err, clues.ToCore(err)) + + // no good way to test members right now. Even though + // the graph api response contains the `userID` and `email` + // properties, we can't access them in the sdk model + assert.NotEmpty(t, members) +}