Skip to content

Commit f0e53d1

Browse files
authored
fix(drivers/alias): default sort & substitute link (#1917)
* fix(drivers/alias): default sort & substitute link * fix * fix
1 parent a2573fb commit f0e53d1

File tree

2 files changed

+77
-11
lines changed

2 files changed

+77
-11
lines changed

drivers/alias/driver.go

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ func (d *Alias) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([
229229
for _, obj := range objMap {
230230
objs = append(objs, obj)
231231
}
232+
if d.OrderBy == "" {
233+
sort := getAllSort(dirs)
234+
if sort.OrderBy != "" {
235+
model.SortFiles(objs, sort.OrderBy, sort.OrderDirection)
236+
}
237+
if d.ExtractFolder == "" && sort.ExtractFolder != "" {
238+
model.ExtractFolder(objs, sort.ExtractFolder)
239+
}
240+
}
232241
return objs, nil
233242
}
234243

@@ -276,21 +285,38 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
276285
}, nil
277286
}
278287

279-
reqPath := d.getBalancedPath(ctx, file)
280-
link, fi, err := d.link(ctx, reqPath, args)
288+
var link *model.Link
289+
var fi model.Obj
290+
var err error
291+
files := file.(BalancedObjs)
292+
if d.ReadConflictPolicy == RandomBalancedRP || d.ReadConflictPolicy == AllRWP {
293+
rand.Shuffle(len(files), func(i, j int) {
294+
files[i], files[j] = files[j], files[i]
295+
})
296+
}
297+
for _, f := range files {
298+
if f == nil {
299+
continue
300+
}
301+
link, fi, err = d.link(ctx, f.GetPath(), args)
302+
if err == nil {
303+
if link == nil {
304+
// 重定向且需要通过代理
305+
return &model.Link{
306+
URL: fmt.Sprintf("%s/p%s?sign=%s",
307+
common.GetApiUrl(ctx),
308+
utils.EncodePath(f.GetPath(), true),
309+
sign.Sign(f.GetPath())),
310+
}, nil
311+
}
312+
break
313+
}
314+
}
281315
if err != nil {
282316
return nil, err
283317
}
284-
if link == nil {
285-
// 重定向且需要通过代理
286-
return &model.Link{
287-
URL: fmt.Sprintf("%s/p%s?sign=%s",
288-
common.GetApiUrl(ctx),
289-
utils.EncodePath(reqPath, true),
290-
sign.Sign(reqPath)),
291-
}, nil
292-
}
293318
resultLink := *link // 复制一份,避免修改到原始link
319+
resultLink.Expiration = nil
294320
resultLink.SyncClosers = utils.NewSyncClosers(link)
295321
if args.Redirect {
296322
return &resultLink, nil

drivers/alias/util.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,3 +490,43 @@ func (d *Alias) extract(ctx context.Context, reqPath string, args model.ArchiveI
490490
link, _, err := op.DriverExtract(ctx, storage, reqActualPath, args)
491491
return link, err
492492
}
493+
494+
func getAllSort(dirs []model.Obj) model.Sort {
495+
ret := model.Sort{}
496+
noSort := false
497+
noExtractFolder := false
498+
for _, dir := range dirs {
499+
if dir == nil {
500+
continue
501+
}
502+
storage, err := fs.GetStorage(dir.GetPath(), &fs.GetStoragesArgs{})
503+
if err != nil {
504+
continue
505+
}
506+
if !noSort && storage.GetStorage().OrderBy != "" {
507+
if ret.OrderBy == "" {
508+
ret.OrderBy = storage.GetStorage().OrderBy
509+
ret.OrderDirection = storage.GetStorage().OrderDirection
510+
if ret.OrderDirection == "" {
511+
ret.OrderDirection = "asc"
512+
}
513+
} else if ret.OrderBy != storage.GetStorage().OrderBy || ret.OrderDirection != storage.GetStorage().OrderDirection {
514+
ret.OrderBy = ""
515+
ret.OrderDirection = ""
516+
noSort = true
517+
}
518+
}
519+
if !noExtractFolder && storage.GetStorage().ExtractFolder != "" {
520+
if ret.ExtractFolder == "" {
521+
ret.ExtractFolder = storage.GetStorage().ExtractFolder
522+
} else if ret.ExtractFolder != storage.GetStorage().ExtractFolder {
523+
ret.ExtractFolder = ""
524+
noExtractFolder = true
525+
}
526+
}
527+
if noSort && noExtractFolder {
528+
break
529+
}
530+
}
531+
return ret
532+
}

0 commit comments

Comments
 (0)