From ad75540b03997802f7b89d67ba8d6280e6f89f0e Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 27 Feb 2023 10:07:42 -0500 Subject: [PATCH] GC: SharePoint: Library: Details: Change to Displayed data (#2632) Updates for `./corso backup details sharepoint --backup ` - Ensures that Drive Name is part of the backup - Adds field DisplayName to backup details #### Does this PR need a docs update or release note? - [x] :no_entry: No #### Type of change - [x] :sunflower: Feature #### Issue(s) *closes #2601 #### Test Plan - [x] :muscle: Manual --- src/internal/connector/onedrive/collection.go | 7 +++ src/internal/connector/onedrive/item.go | 61 +++++++++++++------ src/pkg/backup/details/details.go | 21 ++++--- src/pkg/backup/details/details_test.go | 14 ++--- 4 files changed, 69 insertions(+), 34 deletions(-) diff --git a/src/internal/connector/onedrive/collection.go b/src/internal/connector/onedrive/collection.go index 7555d391a..99adfc6ff 100644 --- a/src/internal/connector/onedrive/collection.go +++ b/src/internal/connector/onedrive/collection.go @@ -301,6 +301,13 @@ func (oc *Collection) populateItems(ctx context.Context, errs *fault.Bus) { "backup_item_size", itemSize, ) + pr, err := fetchParentReference(ctx, oc.service, item.GetParentReference()) + if err != nil { + el.AddRecoverable(clues.Wrap(err, "getting parent reference").Label(fault.LabelForceNoBackupCreation)) + return + } + + item.SetParentReference(pr) isFile := item.GetFile() != nil if isFile { diff --git a/src/internal/connector/onedrive/item.go b/src/internal/connector/onedrive/item.go index 6eb6bfa78..b0a98f511 100644 --- a/src/internal/connector/onedrive/item.go +++ b/src/internal/connector/onedrive/item.go @@ -284,8 +284,8 @@ func filterUserPermissions(perms []models.Permissionable) []UserPermission { // TODO: Update drive name during Issue #2071 func sharePointItemInfo(di models.DriveItemable, itemSize int64) *details.SharePointInfo { var ( - id, parent, url string - reference = di.GetParentReference() + id, parentID, displayName, url string + reference = di.GetParentReference() ) // TODO: we rely on this info for details/restore lookups, @@ -303,24 +303,20 @@ func sharePointItemInfo(di models.DriveItemable, itemSize int64) *details.ShareP } if reference != nil { - parent = ptr.Val(reference.GetDriveId()) - temp := ptr.Val(reference.GetName()) - temp = strings.TrimSpace(temp) - - if temp != "" { - parent = temp - } + parentID = ptr.Val(reference.GetDriveId()) + displayName = strings.TrimSpace(ptr.Val(reference.GetName())) } return &details.SharePointInfo{ - ItemType: details.OneDriveItem, - ItemName: ptr.Val(di.GetName()), - Created: ptr.Val(di.GetCreatedDateTime()), - Modified: ptr.Val(di.GetLastModifiedDateTime()), - DriveName: parent, - Size: itemSize, - Owner: id, - WebURL: url, + ItemType: details.OneDriveItem, + ItemName: ptr.Val(di.GetName()), + Created: ptr.Val(di.GetCreatedDateTime()), + Modified: ptr.Val(di.GetLastModifiedDateTime()), + DriveName: parentID, + DisplayName: displayName, + Size: itemSize, + Owner: id, + WebURL: url, } } @@ -382,3 +378,34 @@ func constructWebURL(adtl map[string]any) string { return url } + +func fetchParentReference( + ctx context.Context, + service graph.Servicer, + orig models.ItemReferenceable, +) (models.ItemReferenceable, error) { + if orig == nil || service == nil || ptr.Val(orig.GetName()) != "" { + return orig, nil + } + + options := &msdrives.DriveItemRequestBuilderGetRequestConfiguration{ + QueryParameters: &msdrives.DriveItemRequestBuilderGetQueryParameters{ + Select: []string{"name"}, + }, + } + + driveID := ptr.Val(orig.GetDriveId()) + + if driveID == "" { + return orig, nil + } + + drive, err := service.Client().DrivesById(driveID).Get(ctx, options) + if err != nil { + return nil, clues.Stack(err).WithClues(ctx).With(graph.ErrData(err)...) + } + + orig.SetName(drive.GetName()) + + return orig, nil +} diff --git a/src/pkg/backup/details/details.go b/src/pkg/backup/details/details.go index bb8b57e1c..c713c445f 100644 --- a/src/pkg/backup/details/details.go +++ b/src/pkg/backup/details/details.go @@ -565,15 +565,16 @@ func (i ExchangeInfo) Values() []string { // SharePointInfo describes a sharepoint item type SharePointInfo struct { - Created time.Time `json:"created,omitempty"` - ItemName string `json:"itemName,omitempty"` - DriveName string `json:"driveName,omitempty"` - ItemType ItemType `json:"itemType,omitempty"` - Modified time.Time `josn:"modified,omitempty"` - Owner string `json:"owner,omitempty"` - ParentPath string `json:"parentPath,omitempty"` - Size int64 `json:"size,omitempty"` - WebURL string `json:"webUrl,omitempty"` + Created time.Time `json:"created,omitempty"` + ItemName string `json:"itemName,omitempty"` + DriveName string `json:"driveName,omitempty"` + DisplayName string `json:"displayName,omitempty"` + ItemType ItemType `json:"itemType,omitempty"` + Modified time.Time `josn:"modified,omitempty"` + Owner string `json:"owner,omitempty"` + ParentPath string `json:"parentPath,omitempty"` + Size int64 `json:"size,omitempty"` + WebURL string `json:"webUrl,omitempty"` } // Headers returns the human-readable names of properties in a SharePointInfo @@ -587,7 +588,7 @@ func (i SharePointInfo) Headers() []string { func (i SharePointInfo) Values() []string { return []string{ i.ItemName, - i.DriveName, + i.DisplayName, i.ParentPath, humanize.Bytes(uint64(i.Size)), i.WebURL, diff --git a/src/pkg/backup/details/details_test.go b/src/pkg/backup/details/details_test.go index ce117368c..33b65db24 100644 --- a/src/pkg/backup/details/details_test.go +++ b/src/pkg/backup/details/details_test.go @@ -109,13 +109,13 @@ func (suite *DetailsUnitSuite) TestDetailsEntry_HeadersValues() { LocationRef: "locationref", ItemInfo: ItemInfo{ SharePoint: &SharePointInfo{ - ItemName: "itemName", - ParentPath: "parentPath", - Size: 1000, - WebURL: "https://not.a.real/url", - DriveName: "aDrive", - Created: now, - Modified: now, + ItemName: "itemName", + ParentPath: "parentPath", + Size: 1000, + WebURL: "https://not.a.real/url", + DisplayName: "aDrive", + Created: now, + Modified: now, }, }, },