From 2e9f256462ce4b18bb2467f36e84783a6d472583 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Mon, 18 Nov 2019 19:32:06 +0800 Subject: [PATCH] Feat: after uploading finished hook --- models/folder.go | 2 +- models/folder_test.go | 20 ++++++++++++-------- pkg/filesystem/filesystem.go | 9 +++++++++ pkg/filesystem/hooks.go | 11 ++++++----- pkg/filesystem/local/handler.go | 2 +- pkg/util/path.go | 8 ++++++++ routers/controllers/file.go | 2 ++ 7 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 pkg/util/path.go diff --git a/models/folder.go b/models/folder.go index f2828ef..4b5e0fa 100644 --- a/models/folder.go +++ b/models/folder.go @@ -19,6 +19,6 @@ type Folder struct { // GetFolderByPath 根据绝对路径和UID查找目录 func GetFolderByPath(path string, uid uint) (Folder, error) { var folder Folder - result := DB.Where("owner = ? AND position_absolute = ?", uid, path).Find(&folder) + result := DB.Where("owner_id = ? AND position_absolute = ?", uid, path).Find(&folder) return folder, result.Error } diff --git a/models/folder_test.go b/models/folder_test.go index 3119339..efd08b2 100644 --- a/models/folder_test.go +++ b/models/folder_test.go @@ -1,7 +1,7 @@ package model import ( - "fmt" + "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "testing" ) @@ -9,12 +9,16 @@ import ( func TestGetFolderByPath(t *testing.T) { asserts := assert.New(t) - //policyRows := sqlmock.NewRows([]string{"id", "name"}). - // AddRow(1, "默认上传策略") - //mock.ExpectQuery("^SELECT (.+)").WillReturnRows(policyRows) - - folder,_ := GetFolderByPath("/测试/test",1) - fmt.Println(folder) + folderRows := sqlmock.NewRows([]string{"id", "name"}). + AddRow(1, "test") + mock.ExpectQuery("^SELECT (.+)").WillReturnRows(folderRows) + folder, _ := GetFolderByPath("/测试/test", 1) + asserts.Equal("test", folder.Name) + asserts.NoError(mock.ExpectationsWereMet()) + + folderRows = sqlmock.NewRows([]string{"id", "name"}) + mock.ExpectQuery("^SELECT (.+)").WillReturnRows(folderRows) + folder, err := GetFolderByPath("/测试/test", 1) + asserts.Error(err) asserts.NoError(mock.ExpectationsWereMet()) - asserts.NoError(mock.) } diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index 466826a..4be41fc 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -104,7 +104,16 @@ func (fs *FileSystem) Upload(ctx context.Context, file FileData) (err error) { if fs.AfterUpload != nil { ctx = context.WithValue(ctx, SavePathCtx, savePath) err = fs.AfterUpload(ctx, fs) + if err != nil { + // 上传完成后续处理失败 + if fs.AfterValidateFailed != nil { + followUpErr := fs.AfterValidateFailed(ctx, fs) + // 失败后再失败... + if followUpErr != nil { + util.Log().Warning("AfterValidateFailed 钩子执行失败,%s", followUpErr) + } + } return err } } diff --git a/pkg/filesystem/hooks.go b/pkg/filesystem/hooks.go index 0a42140..d957bad 100644 --- a/pkg/filesystem/hooks.go +++ b/pkg/filesystem/hooks.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/HFO4/cloudreve/pkg/util" + "github.com/gin-gonic/gin" ) // GenericBeforeUpload 通用上传前处理钩子,包含数据库操作 @@ -36,7 +37,7 @@ func GenericBeforeUpload(ctx context.Context, fs *FileSystem) error { func GenericAfterUploadCanceled(ctx context.Context, fs *FileSystem) error { file := ctx.Value(FileCtx).(FileData) - filePath := ctx.Value("path").(string) + filePath := ctx.Value(SavePathCtx).(string) // 删除临时文件 if util.Exists(filePath) { _, err := fs.Handler.Delete(ctx, []string{filePath}) @@ -55,13 +56,13 @@ func GenericAfterUploadCanceled(ctx context.Context, fs *FileSystem) error { // GenericAfterUpload 文件上传完成后,包含数据库操作 func GenericAfterUpload(ctx context.Context, fs *FileSystem) error { // 获取Gin的上下文 - //ginCtx := ctx.Value(GinCtx).(*gin.Context) + ginCtx := ctx.Value(GinCtx).(*gin.Context) // 文件存放的虚拟路径 - //virtualPath := ginCtx.GetHeader("X-Path") + virtualPath := util.DotPathToStandardPath(ginCtx.GetHeader("X-Path")) // 检查路径是否存在 - if !fs.IsPathExist("/") { - return errors.New("sss") + if !fs.IsPathExist(virtualPath) { + return errors.New("路径\"" + virtualPath + "\"不存在") } return nil } diff --git a/pkg/filesystem/local/handler.go b/pkg/filesystem/local/handler.go index c8e7110..389a5e7 100644 --- a/pkg/filesystem/local/handler.go +++ b/pkg/filesystem/local/handler.go @@ -48,8 +48,8 @@ func (handler Handler) Delete(ctx context.Context, files []string) ([]string, er err := os.Remove(value) if err == nil { deleted = append(deleted, value) - util.Log().Warning("无法删除文件,%s", err) } else { + util.Log().Warning("无法删除文件,%s", err) retErr = err } } diff --git a/pkg/util/path.go b/pkg/util/path.go new file mode 100644 index 0000000..3467993 --- /dev/null +++ b/pkg/util/path.go @@ -0,0 +1,8 @@ +package util + +import "strings" + +// DotPathToStandardPath 将","分割的路径转换为标准路径 +func DotPathToStandardPath(path string) string { + return "/" + strings.Replace(path, ",", "/", -1) +} diff --git a/routers/controllers/file.go b/routers/controllers/file.go index c1531a4..4f8d0bb 100644 --- a/routers/controllers/file.go +++ b/routers/controllers/file.go @@ -71,6 +71,8 @@ func FileUploadStream(c *gin.Context) { // 给文件系统分配钩子 fs.BeforeUpload = filesystem.GenericBeforeUpload fs.AfterUploadCanceled = filesystem.GenericAfterUploadCanceled + fs.AfterUpload = filesystem.GenericAfterUpload + fs.AfterValidateFailed = filesystem.GenericAfterUploadCanceled // 执行上传 uploadCtx := context.WithValue(ctx, filesystem.GinCtx, c)