Skip to content

Commit 1798b6f

Browse files
KirCuteForSourceCodeAnalysis
authored andcommitted
feat(alias): support pass through provider (OpenListTeam#1269)
1 parent 3c55dd7 commit 1798b6f

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
@@ -84,6 +84,10 @@ type SetPath interface {
8484
SetPath(path string)
8585
}
8686

87+
type ObjWithProvider interface {
88+
GetProvider() string
89+
}
90+
8791
func SortFiles(objs []Obj, orderBy, orderDirection string) {
8892
if orderBy == "" {
8993
return
@@ -170,6 +174,16 @@ func GetUrl(obj Obj) (url string, ok bool) {
170174
return url, false
171175
}
172176

177+
func GetProvider(obj Obj) (string, bool) {
178+
if obj, ok := obj.(ObjWithProvider); ok {
179+
return obj.GetProvider(), true
180+
}
181+
if unwrap, ok := obj.(ObjUnwrap); ok {
182+
return GetProvider(unwrap.Unwrap())
183+
}
184+
return "unknown", false
185+
}
186+
173187
func GetRawObject(obj Obj) *Object {
174188
switch v := obj.(type) {
175189
case *ObjThumbURL:
@@ -178,6 +192,8 @@ func GetRawObject(obj Obj) *Object {
178192
return &v.Object
179193
case *ObjectURL:
180194
return &v.Object
195+
case *ObjectProvider:
196+
return &v.Object
181197
case *Object:
182198
return v
183199
}

internal/model/object.go

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

server/handles/fsread.go

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

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

0 commit comments

Comments
 (0)