-
Notifications
You must be signed in to change notification settings - Fork 164
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
enhancement: add sharedWithMe graph beta endpoint
- Loading branch information
Showing
9 changed files
with
684 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
Enhancement: Add graph beta sharedWithMe API | ||
|
||
Add graph beta api implementation for the sharedWithMe endpoint. | ||
The implementation is a logical replication of the existing OCS API. | ||
|
||
https://github.com/owncloud/ocis/pull/7633 | ||
https://github.com/owncloud/ocis/issues/7436 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,249 @@ | ||
package svc | ||
|
||
import ( | ||
"context" | ||
"net/http" | ||
"strings" | ||
|
||
userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" | ||
rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" | ||
collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" | ||
storageprovider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" | ||
"github.com/cs3org/reva/v2/pkg/storagespace" | ||
"github.com/go-chi/render" | ||
libregraph "github.com/owncloud/libre-graph-api-go" | ||
|
||
"github.com/owncloud/ocis/v2/services/graph/pkg/identity" | ||
"github.com/owncloud/ocis/v2/services/graph/pkg/service/v0/errorcode" | ||
) | ||
|
||
// ListSharedWithMe lists the files shared with the current user. | ||
func (g Graph) ListSharedWithMe(w http.ResponseWriter, r *http.Request) { | ||
showHidden := r.URL.Query().Get("show-hidden") == "true" | ||
ctx := r.Context() | ||
driveItems, err := g.listSharedWithMe(ctx, showHidden) | ||
if err != nil { | ||
errorcode.RenderError(w, r, err) | ||
return | ||
} | ||
|
||
render.Status(r, http.StatusOK) | ||
render.JSON(w, r, &ListResponse{Value: driveItems}) | ||
} | ||
func (g Graph) listSharedWithMe(ctx context.Context, showHidden bool) ([]libregraph.DriveItem, error) { | ||
gatewayClient, err := g.gatewaySelector.Next() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
listReceivedSharesResponse, err := gatewayClient.ListReceivedShares(ctx, &collaboration.ListReceivedSharesRequest{}) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
switch listReceivedSharesResponse.Status.Code { | ||
case rpc.Code_CODE_NOT_FOUND: | ||
return nil, identity.ErrNotFound | ||
} | ||
|
||
var driveItems []libregraph.DriveItem | ||
for _, receivedShare := range listReceivedSharesResponse.GetShares() { | ||
if receivedShare.GetHidden() && !showHidden { | ||
continue | ||
} | ||
|
||
share := receivedShare.GetShare() | ||
if share == nil { | ||
// fixMe: | ||
// - return error? | ||
continue | ||
} | ||
|
||
statResponse, err := gatewayClient.Stat(ctx, &storageprovider.StatRequest{Ref: &storageprovider.Reference{ResourceId: share.GetResourceId()}}) | ||
if err != nil { | ||
// fixMe: | ||
// - return error? | ||
continue | ||
} | ||
if statResponse.GetStatus().GetCode() != rpc.Code_CODE_OK { | ||
// fixMe: | ||
// - return error? | ||
continue | ||
} | ||
|
||
var driveOwner *libregraph.Identity | ||
if user := statResponse.GetInfo().GetOwner(); user != nil { | ||
if getUserResponse, err := gatewayClient.GetUser(ctx, &userpb.GetUserRequest{ | ||
UserId: &userpb.UserId{ | ||
OpaqueId: user.GetOpaqueId(), | ||
}, | ||
SkipFetchingUserGroups: true, | ||
}); err != nil { | ||
// fixMe: | ||
// - return error? | ||
continue | ||
} else { | ||
driveOwner = &libregraph.Identity{ | ||
DisplayName: getUserResponse.GetUser().GetDisplayName(), | ||
Id: libregraph.PtrString(getUserResponse.GetUser().GetId().GetOpaqueId()), | ||
} | ||
} | ||
} | ||
|
||
var shareCreator *libregraph.Identity | ||
if user := share.GetCreator(); user != nil { | ||
if getUserResponse, err := gatewayClient.GetUser(ctx, &userpb.GetUserRequest{ | ||
UserId: &userpb.UserId{ | ||
OpaqueId: user.GetOpaqueId(), | ||
}, | ||
SkipFetchingUserGroups: true, | ||
}); err != nil { | ||
// fixMe: | ||
// - return error? | ||
continue | ||
} else { | ||
shareCreator = &libregraph.Identity{ | ||
DisplayName: getUserResponse.GetUser().GetDisplayName(), | ||
Id: libregraph.PtrString(getUserResponse.GetUser().GetId().GetOpaqueId()), | ||
} | ||
} | ||
} | ||
|
||
resourceInfo := statResponse.GetInfo() | ||
driveItem := &libregraph.DriveItem{} | ||
|
||
if cTime := share.GetCtime(); cTime != nil { | ||
driveItem.CreatedDateTime = libregraph.PtrTime(cs3TimestampToTime(cTime)) | ||
} | ||
|
||
driveItem.ETag = libregraph.PtrString(strings.Trim(statResponse.GetInfo().GetEtag(), "\"")) | ||
|
||
if id := share.GetId().GetOpaqueId(); id != "" { | ||
driveItem.Id = libregraph.PtrString(id) | ||
} | ||
|
||
if mTime := share.GetMtime(); mTime != nil { | ||
driveItem.LastModifiedDateTime = libregraph.PtrTime(cs3TimestampToTime(mTime)) | ||
} | ||
|
||
if name := resourceInfo.GetName(); name != "" { | ||
driveItem.Name = libregraph.PtrString(name) | ||
} | ||
|
||
{ | ||
addParentReference := false | ||
parentReference := &libregraph.ItemReference{} | ||
|
||
if id := share.GetId().GetOpaqueId(); id != "" { | ||
parentReference.DriveId = libregraph.PtrString(id) | ||
addParentReference = true | ||
} | ||
|
||
if addParentReference { | ||
driveItem.ParentReference = parentReference | ||
} | ||
} | ||
|
||
{ | ||
remoteItem := &libregraph.RemoteItem{} | ||
|
||
if id := resourceInfo.GetId(); id != nil { | ||
remoteItem.Id = libregraph.PtrString(storagespace.FormatResourceID(*id)) | ||
} | ||
|
||
if mTime := resourceInfo.GetMtime(); mTime != nil { | ||
remoteItem.LastModifiedDateTime = libregraph.PtrTime(cs3TimestampToTime(mTime)) | ||
} | ||
|
||
if name := resourceInfo.GetName(); name != "" { | ||
remoteItem.Name = libregraph.PtrString(name) | ||
} | ||
|
||
// fixMe: | ||
// - negative permission could distort the size, am i right? | ||
remoteItem.Size = libregraph.PtrInt64(int64(resourceInfo.GetSize())) | ||
|
||
remoteItem.CreatedBy = &libregraph.IdentitySet{ | ||
User: driveOwner, | ||
} | ||
|
||
{ | ||
|
||
addFileSystemInfo := false | ||
fileSystemInfo := &libregraph.FileSystemInfo{} | ||
|
||
if cTime := share.GetCtime(); cTime != nil { | ||
// fixMe: | ||
// - ms uses the root resource ctime for that, | ||
// the stat response does not contain any information about this, use share instead? | ||
fileSystemInfo.CreatedDateTime = libregraph.PtrTime(cs3TimestampToTime(cTime)) | ||
addFileSystemInfo = true | ||
} | ||
|
||
if mTime := resourceInfo.GetMtime(); mTime != nil { | ||
fileSystemInfo.LastModifiedDateTime = libregraph.PtrTime(cs3TimestampToTime(mTime)) | ||
addFileSystemInfo = addFileSystemInfo | ||
} | ||
|
||
if addFileSystemInfo { | ||
remoteItem.FileSystemInfo = fileSystemInfo | ||
} | ||
} | ||
|
||
switch resourceInfo.GetType() { | ||
case storageprovider.ResourceType_RESOURCE_TYPE_CONTAINER: | ||
remoteItem.Folder = &libregraph.Folder{} | ||
case storageprovider.ResourceType_RESOURCE_TYPE_FILE: | ||
openGraphFile := &libregraph.OpenGraphFile{} | ||
|
||
if mimeType := resourceInfo.GetMimeType(); mimeType != "" { | ||
openGraphFile.MimeType = libregraph.PtrString(mimeType) | ||
} | ||
|
||
remoteItem.File = openGraphFile | ||
case storageprovider.ResourceType_RESOURCE_TYPE_INVALID: | ||
// fixMe: | ||
// - return error? | ||
continue | ||
case storageprovider.ResourceType_RESOURCE_TYPE_REFERENCE: | ||
case storageprovider.ResourceType_RESOURCE_TYPE_SYMLINK: | ||
case storageprovider.ResourceType_RESOURCE_TYPE_INTERNAL: | ||
// fixMe: | ||
// - how to handle other types? | ||
} | ||
|
||
{ | ||
addShared := false | ||
shared := &libregraph.Shared{ | ||
Owner: &libregraph.IdentitySet{ | ||
User: shareCreator, | ||
}, | ||
SharedBy: &libregraph.IdentitySet{ | ||
User: shareCreator, | ||
}, | ||
} | ||
|
||
if cTime := share.GetCtime(); cTime != nil { | ||
shared.SharedDateTime = libregraph.PtrTime(cs3TimestampToTime(cTime)) | ||
addShared = true | ||
} | ||
|
||
if shareCreator != nil { | ||
shared.Owner.User = shareCreator | ||
shared.SharedBy.User = shareCreator | ||
addShared = true | ||
} | ||
|
||
if addShared { | ||
remoteItem.Shared = shared | ||
} | ||
} | ||
|
||
driveItem.RemoteItem = remoteItem | ||
} | ||
|
||
driveItems = append(driveItems, *driveItem) | ||
} | ||
|
||
return driveItems, nil | ||
} |
Oops, something went wrong.