Update: update resp

This commit is contained in:
dukai 2025-06-04 15:17:14 +08:00
parent 838f194a51
commit 3455429b38
4 changed files with 179 additions and 38 deletions

View File

@ -6,9 +6,17 @@ import (
"gosvc/httpserver" "gosvc/httpserver"
"gosvc/logger" "gosvc/logger"
"gosvc/validator" "gosvc/validator"
"robotfs/entity"
"robotfs/utils" "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 { type Entry struct {
Name string `json:"name"` Name string `json:"name"`
IsDir bool `json:"is_dir"` IsDir bool `json:"is_dir"`
@ -18,13 +26,6 @@ type Entry struct {
S3Key string `json:"s3key"` 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 { type MkdirParams struct {
Path string Path string
} }
@ -46,10 +47,17 @@ func (s *Service) HandleMkdir(
err := s.FileSystemManager.MakeDirectory(req.Context(), utils.FullPath(newPath)) err := s.FileSystemManager.MakeDirectory(req.Context(), utils.FullPath(newPath))
if err != nil { if err != nil {
logger.Error("mkdir %s: %v", path, err) 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( func (s *Service) HandleListDirectory(
@ -71,7 +79,14 @@ func (s *Service) HandleListDirectory(
) )
if err != nil { if err != nil {
logger.Error("list dir %s %s %d: %v", path, startFileName, limit, err) 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{ result := ListResult{
@ -96,7 +111,7 @@ func (s *Service) HandleListDirectory(
result.Entries = entries result.Entries = entries
} }
return resp.OK(result).JSON() return resp.OK(entity.NewSuccess(result)).JSON()
} }
func (s *Service) HandleDeleteDirectory( func (s *Service) HandleDeleteDirectory(
@ -109,15 +124,29 @@ func (s *Service) HandleDeleteDirectory(
newPath := utils.NormalizePath(path) newPath := utils.NormalizePath(path)
if !isDir { 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 { if err := s.FileSystemManager.DeleteDirectory(req.Context(), utils.FullPath(newPath), isDir, false); err != nil {
logger.Error("del dir %s: %v", path, err) 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( func (s *Service) HandleRenameDirectory(
@ -133,10 +162,17 @@ func (s *Service) HandleRenameDirectory(
newPath := utils.FullPath(dstPath) newPath := utils.FullPath(dstPath)
if err := s.FileSystemManager.RenameDirectory(req.Context(), oldPath, newPath, isDir); err != nil { if err := s.FileSystemManager.RenameDirectory(req.Context(), oldPath, newPath, isDir); err != nil {
logger.Error("move dir %s => %s: %v", params.SrcPath, params.DstPath, err) 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( func (s *Service) HandleCopyDirectory(
@ -152,8 +188,15 @@ func (s *Service) HandleCopyDirectory(
newPath := utils.FullPath(dstPath) newPath := utils.FullPath(dstPath)
if err := s.FileSystemManager.CopyDirectory(req.Context(), oldPath, newPath, isDir); err != nil { if err := s.FileSystemManager.CopyDirectory(req.Context(), oldPath, newPath, isDir); err != nil {
logger.Error("copy dir %s => %s: %v", params.SrcPath, params.DstPath, err) 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()
} }

View File

@ -7,6 +7,7 @@ import (
"gosvc/httpserver" "gosvc/httpserver"
"gosvc/logger" "gosvc/logger"
"gosvc/validator" "gosvc/validator"
"robotfs/entity"
"robotfs/utils" "robotfs/utils"
) )
@ -21,6 +22,14 @@ func (d *DeleteParams) Validate() error {
).Validate() ).Validate()
} }
type CopyParams struct {
GeneralParams
}
type RenameParams struct {
GeneralParams
}
type GeneralParams struct { type GeneralParams struct {
SrcPath string SrcPath string
DstPath string DstPath string
@ -38,14 +47,6 @@ func (g *GeneralParams) Validate() error {
) )
} }
type CopyParams struct {
GeneralParams
}
type RenameParams struct {
GeneralParams
}
func (s *Service) HandleUploadFile( func (s *Service) HandleUploadFile(
req *httpserver.Request, req *httpserver.Request,
resp *httpserver.Response, 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 { if err := s.Engine.FileSystemManager.CreateFile(req.Context(), utils.FullPath(newPath), file, contentType, fileSize); err != nil {
logger.Error("create %s: %v", path, err) 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( func (s *Service) HandleInfoFile(
@ -80,10 +88,17 @@ func (s *Service) HandleInfoFile(
entry, err := s.FileSystemManager.FindEntry(req.Context(), utils.FullPath(newPath)) entry, err := s.FileSystemManager.FindEntry(req.Context(), utils.FullPath(newPath))
if err != nil { if err != nil {
logger.Error("info %s: %v", path, err) 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( func (s *Service) HandleDownloadFile(
@ -97,7 +112,14 @@ func (s *Service) HandleDownloadFile(
downloader, entry, err := s.FileSystemManager.DownloadFile(req.Context(), utils.FullPath(newPath)) downloader, entry, err := s.FileSystemManager.DownloadFile(req.Context(), utils.FullPath(newPath))
if err != nil { if err != nil {
logger.Error("download %s: %v", path, err) 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() defer downloader.Close()
@ -120,10 +142,17 @@ func (s *Service) HandleDeleteFile(
err := s.FileSystemManager.DeleteFile(req.Context(), utils.FullPath(newPath), isDir) err := s.FileSystemManager.DeleteFile(req.Context(), utils.FullPath(newPath), isDir)
if err != nil { if err != nil {
logger.Error("delete file %s: %v", path, err) 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( func (s *Service) HandleRenameFile(
@ -138,10 +167,17 @@ func (s *Service) HandleRenameFile(
err := s.FileSystemManager.RenameFile(req.Context(), srcPath, dstPath, isDir) err := s.FileSystemManager.RenameFile(req.Context(), srcPath, dstPath, isDir)
if err != nil { if err != nil {
logger.Error("move file %s => %s: %v", srcPath, dstPath, err) 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( func (s *Service) HandleCopyFile(
@ -156,8 +192,15 @@ func (s *Service) HandleCopyFile(
err := s.FileSystemManager.CopyFile(req.Context(), srcPath, dstPath, isDir) err := s.FileSystemManager.CopyFile(req.Context(), srcPath, dstPath, isDir)
if err != nil { if err != nil {
logger.Error("copy file %s => %s: %v", srcPath, dstPath, err) 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()
} }

55
entity/response.go Normal file
View File

@ -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,
}
}

View File

@ -10,7 +10,7 @@ import (
var ( var (
ErrUnsupportedListDirectoryPrefixed = errors.New("unsupported directory prefix listing") 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") ErrKvNotFound = errors.New("kv: not found")
) )