Files
crawlab/core/controllers/base_file.go
Marvin Zhang 43d1c7692b refactor: standardize response types across controllers
- Updated multiple controller methods to return VoidResponse instead of generic Response[any].
- Consolidated error handling to utilize GetErrorVoidResponse for consistent error responses.
- Enhanced parameter handling in export and file management functions for improved clarity and maintainability.
- Refactored health check and login/logout methods to align with new response structure.
- Improved overall consistency in response formatting across various endpoints.
2025-03-16 22:25:13 +08:00

224 lines
4.9 KiB
Go

package controllers
import (
"errors"
"fmt"
"io"
"mime/multipart"
"os"
"sync"
"github.com/crawlab-team/crawlab/core/fs"
"github.com/crawlab-team/crawlab/core/interfaces"
"github.com/gin-gonic/gin"
)
func GetBaseFileListDir(rootPath, path string) (response *Response[[]interfaces.FsFileInfo], err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorResponse[[]interfaces.FsFileInfo](err)
}
files, err := fsSvc.List(path)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
return GetErrorResponse[[]interfaces.FsFileInfo](err)
}
}
return GetDataResponse(files)
}
func GetBaseFileContent(rootPath, path string) (response *Response[string], err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorResponse[string](err)
}
data, err := fsSvc.GetFile(path)
if err != nil {
return GetErrorResponse[string](err)
}
return GetDataResponse(string(data))
}
func GetBaseFileInfo(rootPath, path string) (response *Response[interfaces.FsFileInfo], err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorResponse[interfaces.FsFileInfo](err)
}
info, err := fsSvc.GetFileInfo(path)
if err != nil {
return GetErrorResponse[interfaces.FsFileInfo](err)
}
return GetDataResponse(info)
}
type PostBaseFileSaveOneParams struct {
Path string `json:"path" form:"path"`
Data string `json:"data"`
}
func PostBaseFileSaveOne(rootPath, path, data string) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.Save(path, []byte(data)); err != nil {
return GetErrorVoidResponse(err)
}
return GetVoidResponse()
}
func PostBaseFileSaveOneForm(rootPath, path string, file *multipart.FileHeader) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
f, err := file.Open()
if err != nil {
return GetErrorVoidResponse(err)
}
fileData, err := io.ReadAll(f)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.Save(path, fileData); err != nil {
return GetErrorVoidResponse(err)
}
return GetVoidResponse()
}
func PostBaseFileSaveMany(rootPath string, form *multipart.Form) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
wg := sync.WaitGroup{}
wg.Add(len(form.File))
for path := range form.File {
go func(path string) {
file := form.File[path][0]
if err != nil {
logger.Warnf("invalid file header: %s", path)
logger.Error(err.Error())
wg.Done()
return
}
f, err := file.Open()
if err != nil {
logger.Warnf("unable to open file: %s", path)
logger.Error(err.Error())
wg.Done()
return
}
fileData, err := io.ReadAll(f)
if err != nil {
logger.Warnf("unable to read file: %s", path)
logger.Error(err.Error())
wg.Done()
return
}
if err := fsSvc.Save(path, fileData); err != nil {
logger.Warnf("unable to save file: %s", path)
logger.Error(err.Error())
wg.Done()
return
}
wg.Done()
}(path)
}
wg.Wait()
return GetVoidResponse()
}
func PostBaseFileSaveDir(rootPath, path string) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.CreateDir(path); err != nil {
return GetErrorVoidResponse(err)
}
return GetVoidResponse()
}
func PostBaseFileRename(rootPath, path, newPath string) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.Rename(path, newPath); err != nil {
return GetErrorVoidResponse(err)
}
return GetVoidResponse()
}
func DeleteBaseFile(rootPath, path string) (response *VoidResponse, err error) {
if path == "~" {
path = "."
}
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.Delete(path); err != nil {
return GetErrorVoidResponse(err)
}
_, err = fsSvc.GetFileInfo(".")
if err != nil {
_ = fsSvc.CreateDir("/")
}
return GetVoidResponse()
}
func PostBaseFileCopy(rootPath, path, newPath string) (response *VoidResponse, err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return GetErrorVoidResponse(err)
}
if err := fsSvc.Copy(path, newPath); err != nil {
return GetErrorVoidResponse(err)
}
return GetVoidResponse()
}
func PostBaseFileExport(rootPath string, c *gin.Context) (err error) {
fsSvc, err := fs.GetBaseFileFsSvc(rootPath)
if err != nil {
return err
}
// zip file path
zipFilePath, err := fsSvc.Export()
if err != nil {
return err
}
// download
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", zipFilePath))
c.File(zipFilePath)
return nil
}