diff --git a/api_directory.go b/api_directory.go index 25253dc..435807b 100644 --- a/api_directory.go +++ b/api_directory.go @@ -37,9 +37,9 @@ func (s *Service) HandleMkdir( ) *httpserver.Response { params := req.Binded.(*MkdirParams) path := params.Path - fullPath := utils.FullPath(path) + newPath := utils.NormalizePath(path) - err := s.FileSystemManager.MakeDirectory(req.Context(), fullPath) + err := s.FileSystemManager.MakeDirectory(req.Context(), utils.FullPath(newPath)) if err != nil { logger.Error("makeDirectory %s: %v", path, err) return resp.InternalServerError("mkdir failed, " + err.Error()) @@ -56,8 +56,8 @@ func (s *Service) HandleListDirectory( startFileName := req.QueryString("startFileName") inclusive := req.QueryBool("inclusive") limit := req.QueryInt("limit") - newPath := utils.NormalizePath(path) + rawEntries, moreAvailable, err := s.FileSystemManager.ListDirectoryEntries( context.Background(), utils.FullPath(newPath), diff --git a/api_file.go b/api_file.go index ad52ca9..62b5965 100644 --- a/api_file.go +++ b/api_file.go @@ -94,6 +94,17 @@ func (s *Service) HandleDeleteFile( req *httpserver.Request, resp *httpserver.Response, ) *httpserver.Response { + params := req.Binded.(*DeleteParams) + path := params.Path + isDir := params.IsDir + newPath := utils.NormalizePath(path) + + 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()) + } + return resp.NoContent() } diff --git a/engine/filesystem_manager.go b/engine/filesystem_manager.go index 0f7c475..b24de87 100644 --- a/engine/filesystem_manager.go +++ b/engine/filesystem_manager.go @@ -169,6 +169,32 @@ func (f *FileSystemManager) DownloadFile(ctx context.Context, path utils.FullPat return content, entry, nil } +func (f *FileSystemManager) DeleteFile(ctx context.Context, path utils.FullPath, isDir bool) error { + f.Lock() + defer f.Unlock() + + if string(path) == "/" { + return fmt.Errorf("cannot delete root") + } + + entry, err := f.FindEntry(ctx, path) + if err != nil { + return fmt.Errorf("find entry failed: %v", err) + } + + if !isDir { + if err := f.storage.DeleteObject(entry.S3Key); err != nil { + return fmt.Errorf("delete s3 object failed: %v", err) + } + } + + if err := f.meta.DeleteEntry(ctx, path); err != nil { + return fmt.Errorf("delete entry failed: %v", err) + } + + return nil +} + func (f *FileSystemManager) Shutdown() { if f.meta != nil { f.meta.Shutdown()