Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/fs/other.go
2327 views
1
package fs
2
3
import (
4
"context"
5
"encoding/json"
6
stdpath "path"
7
"strings"
8
9
"github.com/alist-org/alist/v3/drivers/s3"
10
"github.com/alist-org/alist/v3/internal/errs"
11
"github.com/alist-org/alist/v3/internal/model"
12
"github.com/alist-org/alist/v3/internal/op"
13
"github.com/alist-org/alist/v3/internal/task"
14
"github.com/pkg/errors"
15
)
16
17
func makeDir(ctx context.Context, path string, lazyCache ...bool) error {
18
storage, actualPath, err := op.GetStorageAndActualPath(path)
19
if err != nil {
20
return errors.WithMessage(err, "failed get storage")
21
}
22
return op.MakeDir(ctx, storage, actualPath, lazyCache...)
23
}
24
25
func move(ctx context.Context, srcPath, dstDirPath string, lazyCache ...bool) error {
26
srcStorage, srcActualPath, err := op.GetStorageAndActualPath(srcPath)
27
if err != nil {
28
return errors.WithMessage(err, "failed get src storage")
29
}
30
dstStorage, dstDirActualPath, err := op.GetStorageAndActualPath(dstDirPath)
31
if err != nil {
32
return errors.WithMessage(err, "failed get dst storage")
33
}
34
if srcStorage.GetStorage() != dstStorage.GetStorage() {
35
return errors.WithStack(errs.MoveBetweenTwoStorages)
36
}
37
return op.Move(ctx, srcStorage, srcActualPath, dstDirActualPath, lazyCache...)
38
}
39
40
func rename(ctx context.Context, srcPath, dstName string, lazyCache ...bool) error {
41
storage, srcActualPath, err := op.GetStorageAndActualPath(srcPath)
42
if err != nil {
43
return errors.WithMessage(err, "failed get storage")
44
}
45
return op.Rename(ctx, storage, srcActualPath, dstName, lazyCache...)
46
}
47
48
func remove(ctx context.Context, path string) error {
49
storage, actualPath, err := op.GetStorageAndActualPath(path)
50
if err != nil {
51
return errors.WithMessage(err, "failed get storage")
52
}
53
return op.Remove(ctx, storage, actualPath)
54
}
55
56
func other(ctx context.Context, args model.FsOtherArgs) (interface{}, error) {
57
storage, actualPath, err := op.GetStorageAndActualPath(args.Path)
58
if err != nil {
59
return nil, errors.WithMessage(err, "failed get storage")
60
}
61
originalPath := args.Path
62
63
if _, ok := storage.(*s3.S3); ok {
64
method := strings.ToLower(strings.TrimSpace(args.Method))
65
if method == s3.OtherMethodArchive || method == s3.OtherMethodThaw {
66
if S3TransitionTaskManager == nil {
67
return nil, errors.New("s3 transition task manager is not initialized")
68
}
69
var payload json.RawMessage
70
if args.Data != nil {
71
raw, err := json.Marshal(args.Data)
72
if err != nil {
73
return nil, errors.WithMessage(err, "failed to encode request payload")
74
}
75
payload = raw
76
}
77
taskCreator, _ := ctx.Value("user").(*model.User)
78
tsk := &S3TransitionTask{
79
TaskExtension: task.TaskExtension{Creator: taskCreator},
80
status: "queued",
81
StorageMountPath: storage.GetStorage().MountPath,
82
ObjectPath: actualPath,
83
DisplayPath: originalPath,
84
ObjectName: stdpath.Base(actualPath),
85
Transition: method,
86
Payload: payload,
87
}
88
S3TransitionTaskManager.Add(tsk)
89
return map[string]string{"task_id": tsk.GetID()}, nil
90
}
91
}
92
93
args.Path = actualPath
94
return op.Other(ctx, storage, args)
95
}
96
97