Skip to content

Commit bbb7c06

Browse files
authored
feat(alias): support pass through provider (#1269)
1 parent 8bbdb27 commit bbb7c06

File tree

5 files changed

+94
-11
lines changed

5 files changed

+94
-11
lines changed

drivers/alias/driver.go

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,45 @@ func (d *Alias) Get(ctx context.Context, path string) (model.Obj, error) {
7979
if !ok {
8080
return nil, errs.ObjectNotFound
8181
}
82+
var ret *model.Object
83+
provider := ""
8284
for _, dst := range dsts {
83-
obj, err := fs.Get(ctx, stdpath.Join(dst, sub), &fs.GetArgs{NoLog: true})
85+
rawPath := stdpath.Join(dst, sub)
86+
obj, err := fs.Get(ctx, rawPath, &fs.GetArgs{NoLog: true})
8487
if err != nil {
8588
continue
8689
}
87-
return &model.Object{
88-
Path: path,
89-
Name: obj.GetName(),
90-
Size: obj.GetSize(),
91-
Modified: obj.ModTime(),
92-
IsFolder: obj.IsDir(),
93-
HashInfo: obj.GetHash(),
90+
storage, err := fs.GetStorage(rawPath, &fs.GetStoragesArgs{})
91+
if ret == nil {
92+
ret = &model.Object{
93+
Path: path,
94+
Name: obj.GetName(),
95+
Size: obj.GetSize(),
96+
Modified: obj.ModTime(),
97+
IsFolder: obj.IsDir(),
98+
HashInfo: obj.GetHash(),
99+
}
100+
if !d.ProviderPassThrough || err != nil {
101+
break
102+
}
103+
provider = storage.Config().Name
104+
} else if err != nil || provider != storage.GetStorage().Driver {
105+
provider = ""
106+
break
107+
}
108+
}
109+
if ret == nil {
110+
return nil, errs.ObjectNotFound
111+
}
112+
if provider != "" {
113+
return &model.ObjectProvider{
114+
Object: *ret,
115+
Provider: model.Provider{
116+
Provider: provider,
117+
},
94118
}, nil
95119
}
96-
return nil, errs.ObjectNotFound
120+
return ret, nil
97121
}
98122

99123
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) (
186210
return nil, errs.ObjectNotFound
187211
}
188212

213+
func (d *Alias) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
214+
root, sub := d.getRootAndPath(args.Obj.GetPath())
215+
dsts, ok := d.pathMap[root]
216+
if !ok {
217+
return nil, errs.ObjectNotFound
218+
}
219+
for _, dst := range dsts {
220+
rawPath := stdpath.Join(dst, sub)
221+
storage, actualPath, err := op.GetStorageAndActualPath(rawPath)
222+
if err != nil {
223+
continue
224+
}
225+
other, ok := storage.(driver.Other)
226+
if !ok {
227+
continue
228+
}
229+
obj, err := op.GetUnwrap(ctx, storage, actualPath)
230+
if err != nil {
231+
continue
232+
}
233+
return other.Other(ctx, model.OtherArgs{
234+
Obj: obj,
235+
Method: args.Method,
236+
Data: args.Data,
237+
})
238+
}
239+
return nil, errs.NotImplement
240+
}
241+
189242
func (d *Alias) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
190243
if !d.Writable {
191244
return errs.PermissionDenied

drivers/alias/meta.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Addition struct {
1515
DownloadConcurrency int `json:"download_concurrency" default:"0" required:"false" type:"number" help:"Need to enable proxy"`
1616
DownloadPartSize int `json:"download_part_size" default:"0" type:"number" required:"false" help:"Need to enable proxy. Unit: KB"`
1717
Writable bool `json:"writable" type:"bool" default:"false"`
18+
ProviderPassThrough bool `json:"provider_pass_through" type:"bool" default:"false"`
1819
}
1920

2021
var config = driver.Config{

internal/model/obj.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ type SetPath interface {
8080
SetPath(path string)
8181
}
8282

83+
type ObjWithProvider interface {
84+
GetProvider() string
85+
}
86+
8387
func SortFiles(objs []Obj, orderBy, orderDirection string) {
8488
if orderBy == "" {
8589
return
@@ -166,6 +170,16 @@ func GetUrl(obj Obj) (url string, ok bool) {
166170
return url, false
167171
}
168172

173+
func GetProvider(obj Obj) (string, bool) {
174+
if obj, ok := obj.(ObjWithProvider); ok {
175+
return obj.GetProvider(), true
176+
}
177+
if unwrap, ok := obj.(ObjUnwrap); ok {
178+
return GetProvider(unwrap.Unwrap())
179+
}
180+
return "unknown", false
181+
}
182+
169183
func GetRawObject(obj Obj) *Object {
170184
switch v := obj.(type) {
171185
case *ObjThumbURL:
@@ -174,6 +188,8 @@ func GetRawObject(obj Obj) *Object {
174188
return &v.Object
175189
case *ObjectURL:
176190
return &v.Object
191+
case *ObjectProvider:
192+
return &v.Object
177193
case *Object:
178194
return v
179195
}

internal/model/object.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,16 @@ type ObjThumbURL struct {
9999
Thumbnail
100100
Url
101101
}
102+
103+
type Provider struct {
104+
Provider string
105+
}
106+
107+
func (p Provider) GetProvider() string {
108+
return p.Provider
109+
}
110+
111+
type ObjectProvider struct {
112+
Object
113+
Provider
114+
}

server/handles/fsread.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ func FsGet(c *gin.Context, req *FsGetReq, user *model.User) {
301301
var rawURL string
302302

303303
storage, err := fs.GetStorage(reqPath, &fs.GetStoragesArgs{})
304-
provider := "unknown"
305-
if err == nil {
304+
provider, ok := model.GetProvider(obj)
305+
if !ok && err == nil {
306306
provider = storage.Config().Name
307307
}
308308
if !obj.IsDir() {

0 commit comments

Comments
 (0)