feat(alias): support pass through provider (#1269)

This commit is contained in:
KirCute
2025-09-14 21:36:38 +08:00
committed by GitHub
parent 8bbdb272d4
commit bbb7c06504
5 changed files with 94 additions and 11 deletions

View File

@ -79,21 +79,45 @@ func (d *Alias) Get(ctx context.Context, path string) (model.Obj, error) {
if !ok {
return nil, errs.ObjectNotFound
}
var ret *model.Object
provider := ""
for _, dst := range dsts {
obj, err := fs.Get(ctx, stdpath.Join(dst, sub), &fs.GetArgs{NoLog: true})
rawPath := stdpath.Join(dst, sub)
obj, err := fs.Get(ctx, rawPath, &fs.GetArgs{NoLog: true})
if err != nil {
continue
}
return &model.Object{
Path: path,
Name: obj.GetName(),
Size: obj.GetSize(),
Modified: obj.ModTime(),
IsFolder: obj.IsDir(),
HashInfo: obj.GetHash(),
storage, err := fs.GetStorage(rawPath, &fs.GetStoragesArgs{})
if ret == nil {
ret = &model.Object{
Path: path,
Name: obj.GetName(),
Size: obj.GetSize(),
Modified: obj.ModTime(),
IsFolder: obj.IsDir(),
HashInfo: obj.GetHash(),
}
if !d.ProviderPassThrough || err != nil {
break
}
provider = storage.Config().Name
} else if err != nil || provider != storage.GetStorage().Driver {
provider = ""
break
}
}
if ret == nil {
return nil, errs.ObjectNotFound
}
if provider != "" {
return &model.ObjectProvider{
Object: *ret,
Provider: model.Provider{
Provider: provider,
},
}, nil
}
return nil, errs.ObjectNotFound
return ret, nil
}
func (d *Alias) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
@ -186,6 +210,35 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
return nil, errs.ObjectNotFound
}
func (d *Alias) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
root, sub := d.getRootAndPath(args.Obj.GetPath())
dsts, ok := d.pathMap[root]
if !ok {
return nil, errs.ObjectNotFound
}
for _, dst := range dsts {
rawPath := stdpath.Join(dst, sub)
storage, actualPath, err := op.GetStorageAndActualPath(rawPath)
if err != nil {
continue
}
other, ok := storage.(driver.Other)
if !ok {
continue
}
obj, err := op.GetUnwrap(ctx, storage, actualPath)
if err != nil {
continue
}
return other.Other(ctx, model.OtherArgs{
Obj: obj,
Method: args.Method,
Data: args.Data,
})
}
return nil, errs.NotImplement
}
func (d *Alias) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
if !d.Writable {
return errs.PermissionDenied

View File

@ -15,6 +15,7 @@ type Addition struct {
DownloadConcurrency int `json:"download_concurrency" default:"0" required:"false" type:"number" help:"Need to enable proxy"`
DownloadPartSize int `json:"download_part_size" default:"0" type:"number" required:"false" help:"Need to enable proxy. Unit: KB"`
Writable bool `json:"writable" type:"bool" default:"false"`
ProviderPassThrough bool `json:"provider_pass_through" type:"bool" default:"false"`
}
var config = driver.Config{

View File

@ -80,6 +80,10 @@ type SetPath interface {
SetPath(path string)
}
type ObjWithProvider interface {
GetProvider() string
}
func SortFiles(objs []Obj, orderBy, orderDirection string) {
if orderBy == "" {
return
@ -166,6 +170,16 @@ func GetUrl(obj Obj) (url string, ok bool) {
return url, false
}
func GetProvider(obj Obj) (string, bool) {
if obj, ok := obj.(ObjWithProvider); ok {
return obj.GetProvider(), true
}
if unwrap, ok := obj.(ObjUnwrap); ok {
return GetProvider(unwrap.Unwrap())
}
return "unknown", false
}
func GetRawObject(obj Obj) *Object {
switch v := obj.(type) {
case *ObjThumbURL:
@ -174,6 +188,8 @@ func GetRawObject(obj Obj) *Object {
return &v.Object
case *ObjectURL:
return &v.Object
case *ObjectProvider:
return &v.Object
case *Object:
return v
}

View File

@ -99,3 +99,16 @@ type ObjThumbURL struct {
Thumbnail
Url
}
type Provider struct {
Provider string
}
func (p Provider) GetProvider() string {
return p.Provider
}
type ObjectProvider struct {
Object
Provider
}

View File

@ -301,8 +301,8 @@ func FsGet(c *gin.Context, req *FsGetReq, user *model.User) {
var rawURL string
storage, err := fs.GetStorage(reqPath, &fs.GetStoragesArgs{})
provider := "unknown"
if err == nil {
provider, ok := model.GetProvider(obj)
if !ok && err == nil {
provider = storage.Config().Name
}
if !obj.IsDir() {