Skip to content

Commit 9442013

Browse files
authored
feat(cloudreve_v4): enhance metadata and lock conflict handling (#485)
* feat(cloudreve_v4): add metadata constants * fix(cloudreve_v4): enhance thumbnail handling * feat(cloudreve_v4): add HideUploading option * fix(cloudreve_v4): handle lock conflict during file deletion
1 parent 862b1c3 commit 9442013

File tree

3 files changed

+70
-13
lines changed

3 files changed

+70
-13
lines changed

drivers/cloudreve_v4/driver.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ func (d *CloudreveV4) List(ctx context.Context, dir model.Obj, args model.ListAr
9393
params["next_page_token"] = r.Pagination.NextToken
9494
}
9595

96+
if d.HideUploading {
97+
f = utils.SliceFilter(f, func(src File) bool {
98+
return src.Metadata == nil || src.Metadata[MetadataUploadSessionID] == nil
99+
})
100+
}
101+
96102
return utils.SliceConvert(f, func(src File) (model.Obj, error) {
97103
if d.EnableFolderSize && src.Type == 1 {
98104
var ds FolderSummaryResp
@@ -105,7 +111,7 @@ func (d *CloudreveV4) List(ctx context.Context, dir model.Obj, args model.ListAr
105111
}
106112
}
107113
var thumb model.Thumbnail
108-
if d.EnableThumb && src.Type == 0 {
114+
if d.EnableThumb && src.Type == 0 && (src.Metadata == nil || src.Metadata[MetadataThumbDisabled] == "") {
109115
var t FileThumbResp
110116
err := d.request(http.MethodGet, "/file/thumb", func(req *resty.Request) {
111117
req.SetQueryParam("uri", src.Path)
@@ -192,13 +198,43 @@ func (d *CloudreveV4) Copy(ctx context.Context, srcObj, dstDir model.Obj) error
192198
}
193199

194200
func (d *CloudreveV4) Remove(ctx context.Context, obj model.Obj) error {
195-
return d.request(http.MethodDelete, "/file", func(req *resty.Request) {
201+
var r FileDeleteResp
202+
err := d.request(http.MethodDelete, "/file", func(req *resty.Request) {
196203
req.SetBody(base.Json{
197204
"uris": []string{obj.GetPath()},
198205
"unlink": false,
199206
"skip_soft_delete": true,
200207
})
208+
req.SetResult(&r)
201209
}, nil)
210+
if err != nil {
211+
return err
212+
}
213+
if r.Code == 0 {
214+
return nil
215+
}
216+
if r.Code == 40073 && r.Msg == "Lock conflict" && len(r.Data) > 0 {
217+
tokens := make([]string, 0, len(r.Data))
218+
for _, item := range r.Data {
219+
tokens = append(tokens, item.Token)
220+
}
221+
err = d.request(http.MethodDelete, "/file/lock", func(req *resty.Request) {
222+
req.SetBody(base.Json{
223+
"tokens": tokens,
224+
})
225+
}, nil)
226+
if err != nil {
227+
return err
228+
}
229+
return d.request(http.MethodDelete, "/file", func(req *resty.Request) {
230+
req.SetBody(base.Json{
231+
"uris": []string{obj.GetPath()},
232+
"unlink": false,
233+
"skip_soft_delete": true,
234+
})
235+
}, nil)
236+
}
237+
return errors.New(r.Msg)
202238
}
203239

204240
func (d *CloudreveV4) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error {

drivers/cloudreve_v4/meta.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type Addition struct {
1919
EnableFolderSize bool `json:"enable_folder_size"`
2020
EnableThumb bool `json:"enable_thumb"`
2121
EnableVersionUpload bool `json:"enable_version_upload"`
22+
HideUploading bool `json:"hide_uploading"`
2223
OrderBy string `json:"order_by" type:"select" options:"name,size,updated_at,created_at" default:"name" required:"true"`
2324
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc" default:"asc" required:"true"`
2425
}

drivers/cloudreve_v4/types.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import (
66
"github.com/OpenListTeam/OpenList/internal/model"
77
)
88

9+
const (
10+
MetadataUploadSessionID = "sys:upload_session_id"
11+
MetadataThumbDisabled = "thumb:disabled"
12+
)
13+
914
type Object struct {
1015
model.Object
1116
StoragePolicy StoragePolicy
@@ -82,17 +87,17 @@ type TokenResponse struct {
8287
}
8388

8489
type File struct {
85-
Type int `json:"type"` // 0: file, 1: folder
86-
ID string `json:"id"`
87-
Name string `json:"name"`
88-
CreatedAt time.Time `json:"created_at"`
89-
UpdatedAt time.Time `json:"updated_at"`
90-
Size int64 `json:"size"`
91-
Metadata interface{} `json:"metadata"`
92-
Path string `json:"path"`
93-
Capability string `json:"capability"`
94-
Owned bool `json:"owned"`
95-
PrimaryEntity string `json:"primary_entity"`
90+
Type int `json:"type"` // 0: file, 1: folder
91+
ID string `json:"id"`
92+
Name string `json:"name"`
93+
CreatedAt time.Time `json:"created_at"`
94+
UpdatedAt time.Time `json:"updated_at"`
95+
Size int64 `json:"size"`
96+
Metadata map[string]any `json:"metadata,omitempty"`
97+
Path string `json:"path"`
98+
Capability string `json:"capability"`
99+
Owned bool `json:"owned"`
100+
PrimaryEntity string `json:"primary_entity"`
96101
}
97102

98103
type StoragePolicy struct {
@@ -147,6 +152,21 @@ type FileUploadResp struct {
147152
Credential string `json:"credential,omitempty"` // for local
148153
}
149154

155+
type FileDeleteResp struct {
156+
Resp
157+
Data []struct {
158+
Path string `json:"path"`
159+
Token string `json:"token"`
160+
// Owner struct {
161+
// Owner string `json:"owner"`
162+
// Application struct {
163+
// Type string `json:"type"`
164+
// } `json:"application"`
165+
// } `json:"owner"`
166+
Type int `json:"type"`
167+
} `json:"data,omitempty"`
168+
}
169+
150170
type FileThumbResp struct {
151171
URL string `json:"url"`
152172
Expires time.Time `json:"expires"`

0 commit comments

Comments
 (0)