From 3455429b387649db1a0270f27c240789fc0d1d04 Mon Sep 17 00:00:00 2001 From: dukai Date: Wed, 4 Jun 2025 15:17:14 +0800 Subject: [PATCH] Update: update resp --- api_directory.go | 79 ++++++++++++++++++++++++++++++---------- api_file.go | 81 ++++++++++++++++++++++++++++++++---------- entity/response.go | 55 ++++++++++++++++++++++++++++ pkg/meta/meta_store.go | 2 +- 4 files changed, 179 insertions(+), 38 deletions(-) create mode 100644 entity/response.go diff --git a/api_directory.go b/api_directory.go index dd07719..2467593 100644 --- a/api_directory.go +++ b/api_directory.go @@ -6,9 +6,17 @@ import ( "gosvc/httpserver" "gosvc/logger" "gosvc/validator" + "robotfs/entity" "robotfs/utils" ) +type ListResult struct { + Entries []Entry `json:"entries"` + MoreAvailable bool `json:"more_available"` + IsEmptyFolder bool `json:"is_empty_folder"` + LastFileName string `json:"last_file_name"` +} + type Entry struct { Name string `json:"name"` IsDir bool `json:"is_dir"` @@ -18,13 +26,6 @@ type Entry struct { S3Key string `json:"s3key"` } -type ListResult struct { - Entries []Entry `json:"entries"` - MoreAvailable bool `json:"more_available"` - IsEmptyFolder bool `json:"is_empty_folder"` - LastFileName string `json:"last_file_name"` -} - type MkdirParams struct { Path string } @@ -46,10 +47,17 @@ func (s *Service) HandleMkdir( err := s.FileSystemManager.MakeDirectory(req.Context(), utils.FullPath(newPath)) if err != nil { logger.Error("mkdir %s: %v", path, err) - return resp.InternalServerError("mkdir failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrMkDir, + map[string]interface{}{ + "detail": "mkdir failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleListDirectory( @@ -71,7 +79,14 @@ func (s *Service) HandleListDirectory( ) if err != nil { logger.Error("list dir %s %s %d: %v", path, startFileName, limit, err) - return resp.InternalServerError("list directory failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrListDir, + map[string]interface{}{ + "detail": "list directory failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } result := ListResult{ @@ -96,7 +111,7 @@ func (s *Service) HandleListDirectory( result.Entries = entries } - return resp.OK(result).JSON() + return resp.OK(entity.NewSuccess(result)).JSON() } func (s *Service) HandleDeleteDirectory( @@ -109,15 +124,29 @@ func (s *Service) HandleDeleteDirectory( newPath := utils.NormalizePath(path) if !isDir { - resp.BadRequest("is dir param must be true") + out := entity.NewError[any]( + entity.CodeBadRequest, + entity.ErrDeleteDir, + map[string]interface{}{ + "detail": "is dir param must be true", + }, + ) + return resp.OK(out).JSON() } if err := s.FileSystemManager.DeleteDirectory(req.Context(), utils.FullPath(newPath), isDir, false); err != nil { logger.Error("del dir %s: %v", path, err) - return resp.InternalServerError("delete directory failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrDeleteDir, + map[string]interface{}{ + "detail": "delete directory failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleRenameDirectory( @@ -133,10 +162,17 @@ func (s *Service) HandleRenameDirectory( newPath := utils.FullPath(dstPath) if err := s.FileSystemManager.RenameDirectory(req.Context(), oldPath, newPath, isDir); err != nil { logger.Error("move dir %s => %s: %v", params.SrcPath, params.DstPath, err) - return resp.InternalServerError("move directory failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrRenameDir, + map[string]interface{}{ + "detail": "move directory failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleCopyDirectory( @@ -152,8 +188,15 @@ func (s *Service) HandleCopyDirectory( newPath := utils.FullPath(dstPath) if err := s.FileSystemManager.CopyDirectory(req.Context(), oldPath, newPath, isDir); err != nil { logger.Error("copy dir %s => %s: %v", params.SrcPath, params.DstPath, err) - return resp.InternalServerError("copy directory failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrCopyDir, + map[string]interface{}{ + "detail": "copy directory failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } diff --git a/api_file.go b/api_file.go index c9aa88d..87f5561 100644 --- a/api_file.go +++ b/api_file.go @@ -7,6 +7,7 @@ import ( "gosvc/httpserver" "gosvc/logger" "gosvc/validator" + "robotfs/entity" "robotfs/utils" ) @@ -21,6 +22,14 @@ func (d *DeleteParams) Validate() error { ).Validate() } +type CopyParams struct { + GeneralParams +} + +type RenameParams struct { + GeneralParams +} + type GeneralParams struct { SrcPath string DstPath string @@ -38,14 +47,6 @@ func (g *GeneralParams) Validate() error { ) } -type CopyParams struct { - GeneralParams -} - -type RenameParams struct { - GeneralParams -} - func (s *Service) HandleUploadFile( req *httpserver.Request, resp *httpserver.Response, @@ -64,10 +65,17 @@ func (s *Service) HandleUploadFile( if err := s.Engine.FileSystemManager.CreateFile(req.Context(), utils.FullPath(newPath), file, contentType, fileSize); err != nil { logger.Error("create %s: %v", path, err) - return resp.InternalServerError("create file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrUploadFile, + map[string]interface{}{ + "detail": "upload file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleInfoFile( @@ -80,10 +88,17 @@ func (s *Service) HandleInfoFile( entry, err := s.FileSystemManager.FindEntry(req.Context(), utils.FullPath(newPath)) if err != nil { logger.Error("info %s: %v", path, err) - return resp.InternalServerError("info file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrInfoFile, + map[string]interface{}{ + "detail": "info file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.OK(entry).JSON() + return resp.OK(entity.NewSuccess(entry)).JSON() } func (s *Service) HandleDownloadFile( @@ -97,7 +112,14 @@ func (s *Service) HandleDownloadFile( downloader, entry, err := s.FileSystemManager.DownloadFile(req.Context(), utils.FullPath(newPath)) if err != nil { logger.Error("download %s: %v", path, err) - return resp.InternalServerError("download file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrDownloadFile, + map[string]interface{}{ + "detail": "download file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } defer downloader.Close() @@ -120,10 +142,17 @@ func (s *Service) HandleDeleteFile( err := s.FileSystemManager.DeleteFile(req.Context(), utils.FullPath(newPath), isDir) if err != nil { logger.Error("delete file %s: %v", path, err) - return resp.InternalServerError("delete file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrDeleteFile, + map[string]interface{}{ + "detail": "delete file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleRenameFile( @@ -138,10 +167,17 @@ func (s *Service) HandleRenameFile( err := s.FileSystemManager.RenameFile(req.Context(), srcPath, dstPath, isDir) if err != nil { logger.Error("move file %s => %s: %v", srcPath, dstPath, err) - return resp.InternalServerError("move file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrRenameFile, + map[string]interface{}{ + "detail": "move file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } func (s *Service) HandleCopyFile( @@ -156,8 +192,15 @@ func (s *Service) HandleCopyFile( err := s.FileSystemManager.CopyFile(req.Context(), srcPath, dstPath, isDir) if err != nil { logger.Error("copy file %s => %s: %v", srcPath, dstPath, err) - return resp.InternalServerError("copy file failed, " + err.Error()) + out := entity.NewError[any]( + entity.CodeInternalServer, + entity.ErrCopyFile, + map[string]interface{}{ + "detail": "copy file failed, " + err.Error(), + }, + ) + return resp.OK(out).JSON() } - return resp.NoContent() + return resp.OK(entity.NewSuccess("")).JSON() } diff --git a/entity/response.go b/entity/response.go new file mode 100644 index 0000000..1d9a532 --- /dev/null +++ b/entity/response.go @@ -0,0 +1,55 @@ +package entity + +type Message string + +const ( + ErrDownloadFile Message = "download file failed" + ErrUploadFile Message = "upload file failed" + ErrDeleteFile Message = "delete file failed" + ErrRenameFile Message = "rename file failed" + ErrCopyFile Message = "copy file failed" + ErrInfoFile Message = "info file failed" +) + +const ( + ErrMkDir Message = "make directory failed" + ErrListDir Message = "list directory failed" + ErrDeleteDir Message = "delete directory failed" + ErrRenameDir Message = "rename directory failed" + ErrCopyDir Message = "copy directory failed" +) + +const ( + Success Message = "success" +) + +type Status int + +const ( + CodeSuccess Status = 0 // success code + CodeBadRequest Status = 60004 // bad request code + CodeInternalServer Status = 60005 // internal server code +) + +type Response[T any] struct { + Status Status `json:"status"` // Status code + Message Message `json:"message"` // Response message for i18n + Data T `json:"data,omitempty"` // Response data + Extra map[string]interface{} `json:"extra,omitempty"` // Extra information for error details +} + +func NewSuccess[T any](data T) *Response[T] { + return &Response[T]{ + Status: CodeSuccess, + Message: Success, + Data: data, + } +} + +func NewError[T any](status Status, message Message, extra map[string]interface{}) *Response[T] { + return &Response[T]{ + Status: status, + Message: message, + Extra: extra, + } +} diff --git a/pkg/meta/meta_store.go b/pkg/meta/meta_store.go index 01045f9..4ad08db 100644 --- a/pkg/meta/meta_store.go +++ b/pkg/meta/meta_store.go @@ -10,7 +10,7 @@ import ( var ( ErrUnsupportedListDirectoryPrefixed = errors.New("unsupported directory prefix listing") - ErrKvNotImplemented = errors.New("kv not implemented yet") + ErrKvNotImplemented = errors.New("kv: not implemented yet") ErrKvNotFound = errors.New("kv: not found") )