fix(share): share link should be marked as expired if the file is in trash bin (#2347)
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
package share
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
|
||||
"github.com/cloudreve/Cloudreve/v4/ent"
|
||||
"github.com/cloudreve/Cloudreve/v4/inventory"
|
||||
"github.com/cloudreve/Cloudreve/v4/inventory/types"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs/dbfs"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
|
||||
"github.com/cloudreve/Cloudreve/v4/service/explorer"
|
||||
"net/url"
|
||||
"github.com/samber/lo"
|
||||
)
|
||||
|
||||
type ListShareResponse struct {
|
||||
@@ -17,8 +21,23 @@ type ListShareResponse struct {
|
||||
func BuildListShareResponse(res *inventory.ListShareResult, hasher hashid.Encoder, base *url.URL, requester *ent.User, unlocked bool) *ListShareResponse {
|
||||
var infos []explorer.Share
|
||||
for _, share := range res.Shares {
|
||||
infos = append(infos, *explorer.BuildShare(share, base, hasher, requester, share.Edges.User, share.Edges.File.Name,
|
||||
types.FileType(share.Edges.File.Type), unlocked))
|
||||
expired := inventory.IsValidShare(share) != nil
|
||||
shareName := share.Edges.File.Name
|
||||
if share.Edges.File.FileChildren == 0 && len(share.Edges.File.Edges.Metadata) >= 0 {
|
||||
// For files in trash bin, read the real name from metadata
|
||||
restoreUri, found := lo.Find(share.Edges.File.Edges.Metadata, func(m *ent.Metadata) bool {
|
||||
return m.Name == dbfs.MetadataRestoreUri
|
||||
})
|
||||
if found {
|
||||
uri, err := fs.NewUriFromString(restoreUri.Value)
|
||||
if err == nil {
|
||||
shareName = uri.Name()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
infos = append(infos, *explorer.BuildShare(share, base, hasher, requester, share.Edges.User, shareName,
|
||||
types.FileType(share.Edges.File.Type), unlocked, expired))
|
||||
}
|
||||
|
||||
return &ListShareResponse{
|
||||
|
||||
@@ -68,7 +68,7 @@ func (s *ShareInfoService) Get(c *gin.Context) (*explorer.Share, error) {
|
||||
|
||||
base := dep.SettingProvider().SiteURL(c)
|
||||
res := explorer.BuildShare(share, base, dep.HashIDEncoder(), u, share.Edges.User, share.Edges.File.Name,
|
||||
types.FileType(share.Edges.File.Type), unlocked)
|
||||
types.FileType(share.Edges.File.Type), unlocked, false)
|
||||
|
||||
if s.OwnerExtended && share.Edges.User.ID == u.ID {
|
||||
// Add more information about the shared file
|
||||
@@ -121,6 +121,7 @@ func (s *ListShareService) List(c *gin.Context) (*ListShareResponse, error) {
|
||||
|
||||
ctx := context.WithValue(c, inventory.LoadShareUser{}, true)
|
||||
ctx = context.WithValue(ctx, inventory.LoadShareFile{}, true)
|
||||
ctx = context.WithValue(ctx, inventory.LoadFileMetadata{}, true)
|
||||
res, err := shareClient.List(ctx, args)
|
||||
if err != nil {
|
||||
return nil, serializer.NewError(serializer.CodeDBError, "Failed to list shares", err)
|
||||
@@ -150,6 +151,7 @@ func (s *ListShareService) ListInUserProfile(c *gin.Context, uid int) (*ListShar
|
||||
|
||||
ctx := context.WithValue(c, inventory.LoadShareUser{}, true)
|
||||
ctx = context.WithValue(ctx, inventory.LoadShareFile{}, true)
|
||||
ctx = context.WithValue(ctx, inventory.LoadFileMetadata{}, true)
|
||||
res, err := shareClient.List(ctx, args)
|
||||
if err != nil {
|
||||
return nil, serializer.NewError(serializer.CodeDBError, "Failed to list shares", err)
|
||||
|
||||
Reference in New Issue
Block a user