From 0484a4dac51a60b2c8d90a3e6b6c2e4235820c61 Mon Sep 17 00:00:00 2001 From: Michael Barz Date: Wed, 10 May 2023 10:39:04 +0200 Subject: [PATCH] add remote item metadata Signed-off-by: Michael Barz --- .../unreleased/add-remote-item-metadata.md | 5 ++++ services/graph/pkg/service/v0/driveitems.go | 23 ++++++++++++++----- services/graph/pkg/service/v0/graph_test.go | 15 ++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 changelog/unreleased/add-remote-item-metadata.md diff --git a/changelog/unreleased/add-remote-item-metadata.md b/changelog/unreleased/add-remote-item-metadata.md new file mode 100644 index 00000000000..5d18cc879f5 --- /dev/null +++ b/changelog/unreleased/add-remote-item-metadata.md @@ -0,0 +1,5 @@ +Enhancement: Add more metadata to the remote item + +We added the drive alias, the space name and the relative path to the remote item. This is needed to resolve shared files directly on the source space. + +https://github.com/owncloud/ocis/pull/6300 diff --git a/services/graph/pkg/service/v0/driveitems.go b/services/graph/pkg/service/v0/driveitems.go index 5a09f2876ff..16387914cda 100644 --- a/services/graph/pkg/service/v0/driveitems.go +++ b/services/graph/pkg/service/v0/driveitems.go @@ -124,13 +124,17 @@ func (g Graph) getRemoteItem(ctx context.Context, root *storageprovider.Resource return nil, err } - if baseURL != nil { + if baseURL != nil && res.GetInfo() != nil && res.GetInfo().GetSpace() != nil { // TODO read from StorageSpace ... needs Opaque for now // TODO how do we build the url? // for now: read from request - webDavURL := *baseURL - webDavURL.Path = path.Join(webDavURL.Path, storagespace.FormatResourceID(*root)) - item.WebDavUrl = libregraph.PtrString(webDavURL.String()) + item.Name = libregraph.PtrString(res.GetInfo().GetName()) + if res.GetInfo().GetSpace().GetRoot() != nil { + webDavURL := *baseURL + relativePath := res.GetInfo().GetPath() + webDavURL.Path = path.Join(webDavURL.Path, storagespace.FormatResourceID(*res.GetInfo().GetSpace().GetRoot()), relativePath) + item.WebDavUrl = libregraph.PtrString(webDavURL.String()) + } } return item, nil } @@ -192,8 +196,8 @@ func cs3ResourceToRemoteItem(res *storageprovider.ResourceInfo) (*libregraph.Rem Size: size, } - if name := path.Base(res.Path); name != "" { - remoteItem.Name = &name + if res.GetPath() != "" { + remoteItem.Path = libregraph.PtrString(path.Clean(res.GetPath())) } if res.Etag != "" { remoteItem.ETag = &res.Etag @@ -211,6 +215,13 @@ func cs3ResourceToRemoteItem(res *storageprovider.ResourceInfo) (*libregraph.Rem if res.Type == storageprovider.ResourceType_RESOURCE_TYPE_CONTAINER { remoteItem.Folder = &libregraph.Folder{} } + if res.GetSpace() != nil && res.GetSpace().GetRoot() != nil { + remoteItem.RootId = libregraph.PtrString(storagespace.FormatResourceID(*res.GetSpace().GetRoot())) + grantSpaceAlias := utils.ReadPlainFromOpaque(res.GetSpace().GetOpaque(), "spaceAlias") + if grantSpaceAlias != "" { + remoteItem.DriveAlias = libregraph.PtrString(grantSpaceAlias) + } + } return remoteItem, nil } diff --git a/services/graph/pkg/service/v0/graph_test.go b/services/graph/pkg/service/v0/graph_test.go index 61a08d27bdf..e7b6acdaa0e 100644 --- a/services/graph/pkg/service/v0/graph_test.go +++ b/services/graph/pkg/service/v0/graph_test.go @@ -278,18 +278,28 @@ var _ = Describe("Graph", func() { "grantOpaqueID": {Decoder: "plain", Value: []byte("opaqueID")}, }, }, + RootInfo: &provider.ResourceInfo{Path: "New Folder", Name: "Project Mars"}, }, }, }, nil) + var opaque *typesv1beta1.Opaque + opaque = utils.AppendPlainToOpaque(opaque, "spaceAlias", "project/project-mars") gatewayClient.On("Stat", mock.Anything, mock.Anything).Return(&provider.StatResponse{ Status: status.NewOK(ctx), Info: &provider.ResourceInfo{ Etag: "123456789", Type: provider.ResourceType_RESOURCE_TYPE_CONTAINER, Id: &provider.ResourceId{StorageId: "ownerStorageID", SpaceId: "spaceID", OpaqueId: "opaqueID"}, - Path: "New Folder", + Path: "Folder/New Folder", Mtime: &typesv1beta1.Timestamp{Seconds: 1648327606, Nanos: 0}, Size: uint64(1234), + Name: "New Folder", + Space: &provider.StorageSpace{ + Name: "Project Mars", + SpaceType: "project", + Opaque: opaque, + Root: &provider.ResourceId{StorageId: "ownerStorageID", SpaceId: "spaceID", OpaqueId: "opaqueID"}, + }, }, }, nil) gatewayClient.On("GetQuota", mock.Anything, mock.Anything).Return(&provider.GetQuotaResponse{ @@ -322,8 +332,9 @@ var _ = Describe("Graph", func() { Expect(value.Root.RemoteItem.LastModifiedDateTime.UTC()).To(Equal(time.Unix(1648327606, 0).UTC())) Expect(*value.Root.RemoteItem.Folder).To(Equal(libregraph.Folder{})) Expect(*value.Root.RemoteItem.Name).To(Equal("New Folder")) + Expect(*value.Root.RemoteItem.Path).To(Equal("Folder/New Folder")) Expect(*value.Root.RemoteItem.Size).To(Equal(int64(1234))) - Expect(*value.Root.RemoteItem.WebDavUrl).To(Equal("https://localhost:9200/dav/spaces/ownerStorageID$spaceID%21opaqueID")) + Expect(*value.Root.RemoteItem.WebDavUrl).To(Equal("https://localhost:9200/dav/spaces/ownerStorageID$spaceID%21opaqueID/Folder/New%20Folder")) }) It("can not list spaces with wrong sort parameter", func() { gatewayClient.On("ListStorageSpaces", mock.Anything, mock.Anything).Return(&provider.ListStorageSpacesResponse{