diff --git a/src/internal/connector/exchange/query_options.go b/src/internal/connector/exchange/query_options.go index f20c258e2..e3272063f 100644 --- a/src/internal/connector/exchange/query_options.go +++ b/src/internal/connector/exchange/query_options.go @@ -6,6 +6,7 @@ import ( abs "github.com/microsoft/kiota-abstractions-go" msuser "github.com/microsoftgraph/msgraph-sdk-go/users" mscalendars "github.com/microsoftgraph/msgraph-sdk-go/users/item/calendars" + mscevents "github.com/microsoftgraph/msgraph-sdk-go/users/item/calendars/item/events" mscontactfolder "github.com/microsoftgraph/msgraph-sdk-go/users/item/contactfolders" mscontactfolderitem "github.com/microsoftgraph/msgraph-sdk-go/users/item/contactfolders/item" mscontactfolderchild "github.com/microsoftgraph/msgraph-sdk-go/users/item/contactfolders/item/childfolders" @@ -317,6 +318,24 @@ func optionsForContactFoldersItem( return options, nil } +// optionsForEvents ensures valid option inputs for exchange.Events +// @return is first call in Events().GetWithRequestConfigurationAndResponseHandler(options, handler) +func optionsForCalendarEvents(moreOps []string) (*mscevents.EventsRequestBuilderGetRequestConfiguration, error) { + selecting, err := buildOptions(moreOps, events) + if err != nil { + return nil, err + } + + requestParameters := &mscevents.EventsRequestBuilderGetQueryParameters{ + Select: selecting, + } + options := &mscevents.EventsRequestBuilderGetRequestConfiguration{ + QueryParameters: requestParameters, + } + + return options, nil +} + // optionsForEvents ensures valid option inputs for exchange.Events // @return is first call in Events().GetWithRequestConfigurationAndResponseHandler(options, handler) func optionsForEvents(moreOps []string) (*msevents.EventsRequestBuilderGetRequestConfiguration, error) { diff --git a/src/internal/connector/exchange/service_iterators.go b/src/internal/connector/exchange/service_iterators.go index b9314502d..3bf2a8fef 100644 --- a/src/internal/connector/exchange/service_iterators.go +++ b/src/internal/connector/exchange/service_iterators.go @@ -6,8 +6,8 @@ import ( "strings" multierror "github.com/hashicorp/go-multierror" - msgraphgocore "github.com/microsoftgraph/msgraph-sdk-go-core" "github.com/microsoftgraph/msgraph-sdk-go/models" + msevents "github.com/microsoftgraph/msgraph-sdk-go/users/item/calendars/item/events" cdelta "github.com/microsoftgraph/msgraph-sdk-go/users/item/contactfolders/item/contacts/delta" mdelta "github.com/microsoftgraph/msgraph-sdk-go/users/item/mailfolders/item/messages/delta" "github.com/pkg/errors" @@ -166,50 +166,47 @@ func FetchEventIDsFromCalendar( gs graph.Service, user, calendarID string, ) ([]string, error) { - ids := []string{} + var ( + errs *multierror.Error + ids []string + ) - response, err := gs.Client(). + options, err := optionsForCalendarEvents([]string{"id"}) + if err != nil { + return nil, err + } + + builder := gs.Client(). UsersById(user). CalendarsById(calendarID). - Events().Get(ctx, nil) - if err != nil { - return nil, errors.Wrap(err, support.ConnectorStackErrorTrace(err)) - } + Events() - pageIterator, err := msgraphgocore.NewPageIterator( - response, - gs.Adapter(), - models.CreateEventCollectionResponseFromDiscriminatorValue, - ) - if err != nil { - return nil, errors.Wrap(err, "iterator creation failure during fetchEventIDs") - } - - var errs *multierror.Error - - err = pageIterator.Iterate(ctx, func(pageItem any) bool { - entry, ok := pageItem.(graph.Idable) - if !ok { - errs = multierror.Append(errs, errors.New("item without GetId() call")) - return true + for { + resp, err := builder.Get(ctx, options) + if err != nil { + return nil, errors.Wrap(err, support.ConnectorStackErrorTrace(err)) } - if entry.GetId() == nil { - errs = multierror.Append(errs, errors.New("item with nil ID")) - return true + for _, item := range resp.GetValue() { + if item.GetId() == nil { + errs = multierror.Append( + errs, + errors.Errorf("event with nil ID in calendar %s", calendarID), + ) + + // TODO(ashmrtn): Handle fail-fast. + continue + } + + ids = append(ids, *item.GetId()) } - ids = append(ids, *entry.GetId()) + nextLink := resp.GetOdataNextLink() + if nextLink == nil || len(*nextLink) == 0 { + break + } - return true - }) - - if err != nil { - return nil, errors.Wrap( - err, - support.ConnectorStackErrorTrace(err)+ - " :fetching events from calendar "+calendarID, - ) + builder = msevents.NewEventsRequestBuilder(*nextLink, gs.Adapter()) } return ids, errs.ErrorOrNil()