From a91c823e426ed3a4f72086530016c6cff5788747 Mon Sep 17 00:00:00 2001 From: ashmrtn <3891298+ashmrtn@users.noreply.github.com> Date: Mon, 25 Sep 2023 18:59:57 -0700 Subject: [PATCH] Generic item api update (#4356) Minor updates to error handling for generic item implementation --- #### Does this PR need a docs update or release note? - [ ] :white_check_mark: Yes, it's included - [ ] :clock1: Yes, but in a later PR - [x] :no_entry: No #### Type of change - [ ] :sunflower: Feature - [ ] :bug: Bugfix - [ ] :world_map: Documentation - [ ] :robot: Supportability/Tests - [ ] :computer: CI/Deployment - [x] :broom: Tech Debt/Cleanup #### Issue(s) * #4191 #### Test Plan - [ ] :muscle: Manual - [x] :zap: Unit test - [x] :green_heart: E2E --- src/internal/data/item.go | 21 +++++++++++++------ src/internal/data/item_test.go | 8 ++++++- .../m365/collection/exchange/collection.go | 2 ++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/internal/data/item.go b/src/internal/data/item.go index 81d4befe5..2403e63aa 100644 --- a/src/internal/data/item.go +++ b/src/internal/data/item.go @@ -14,6 +14,15 @@ import ( "github.com/alcionai/corso/src/pkg/logger" ) +var ( + _ Item = &prefetchedItem{} + _ ItemInfo = &prefetchedItem{} + _ ItemModTime = &prefetchedItem{} + _ Item = &lazyItem{} + _ ItemInfo = &lazyItem{} + _ ItemModTime = &lazyItem{} +) + func NewDeletedItem(itemID string) Item { return &prefetchedItem{ id: itemID, @@ -74,7 +83,10 @@ func (i prefetchedItem) ModTime() time.Time { } type ItemDataGetter interface { - GetData(context.Context) (io.ReadCloser, *details.ItemInfo, bool, error) + GetData( + context.Context, + *fault.Bus, + ) (io.ReadCloser, *details.ItemInfo, bool, error) } func NewLazyItem( @@ -121,12 +133,9 @@ func (i lazyItem) ID() string { func (i *lazyItem) ToReader() io.ReadCloser { return lazy.NewLazyReadCloser(func() (io.ReadCloser, error) { - reader, info, delInFlight, err := i.itemGetter.GetData(i.ctx) + reader, info, delInFlight, err := i.itemGetter.GetData(i.ctx, i.errs) if err != nil { - err = clues.Stack(err) - i.errs.AddRecoverable(i.ctx, err) - - return nil, err + return nil, clues.Stack(err) } // If an item was deleted then return an empty file so we don't fail the diff --git a/src/internal/data/item_test.go b/src/internal/data/item_test.go index c1b91e3df..864e70890 100644 --- a/src/internal/data/item_test.go +++ b/src/internal/data/item_test.go @@ -146,9 +146,15 @@ func (mid *mockItemDataGetter) check(t *testing.T, expectCalled bool) { } func (mid *mockItemDataGetter) GetData( - context.Context, + ctx context.Context, + errs *fault.Bus, ) (io.ReadCloser, *details.ItemInfo, bool, error) { mid.getCalled = true + + if mid.err != nil { + errs.AddRecoverable(ctx, mid.err) + } + return mid.reader, mid.info, mid.delInFlight, mid.err } diff --git a/src/internal/m365/collection/exchange/collection.go b/src/internal/m365/collection/exchange/collection.go index 14d3cf301..30f28672d 100644 --- a/src/internal/m365/collection/exchange/collection.go +++ b/src/internal/m365/collection/exchange/collection.go @@ -425,6 +425,7 @@ type lazyItemGetter struct { func (lig *lazyItemGetter) GetData( ctx context.Context, + errs *fault.Bus, ) (io.ReadCloser, *details.ItemInfo, bool, error) { itemData, info, err := getItemAndInfo( ctx, @@ -446,6 +447,7 @@ func (lig *lazyItemGetter) GetData( } err = clues.Stack(err) + errs.AddRecoverable(ctx, err) return nil, nil, false, err }