mirror of
				https://github.com/1Panel-dev/1Panel.git
				synced 2025-10-31 11:15:58 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			314 lines
		
	
	
	
		
			9.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
	
		
			9.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package v1
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"io/ioutil"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"path"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
 | |
| 	"github.com/1Panel-dev/1Panel/backend/app/dto"
 | |
| 	"github.com/1Panel-dev/1Panel/backend/constant"
 | |
| 	"github.com/1Panel-dev/1Panel/backend/global"
 | |
| 	websocket2 "github.com/1Panel-dev/1Panel/backend/utils/websocket"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| 	"github.com/gorilla/websocket"
 | |
| )
 | |
| 
 | |
| func (b *BaseApi) ListFiles(c *gin.Context) {
 | |
| 	var req dto.FileOption
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	files, err := fileService.GetFileList(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, files)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) GetFileTree(c *gin.Context) {
 | |
| 	var req dto.FileOption
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	tree, err := fileService.GetFileTree(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, tree)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) CreateFile(c *gin.Context) {
 | |
| 	var req dto.FileCreate
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.Create(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) DeleteFile(c *gin.Context) {
 | |
| 	var req dto.FileDelete
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.Delete(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) BatchDeleteFile(c *gin.Context) {
 | |
| 	var req dto.FileBatchDelete
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.BatchDelete(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) ChangeFileMode(c *gin.Context) {
 | |
| 	var req dto.FileCreate
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.ChangeMode(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) CompressFile(c *gin.Context) {
 | |
| 	var req dto.FileCompress
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.Compress(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) DeCompressFile(c *gin.Context) {
 | |
| 	var req dto.FileDeCompress
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	err := fileService.DeCompress(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) GetContent(c *gin.Context) {
 | |
| 	var req dto.FileOption
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	info, err := fileService.GetContent(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, info)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) SaveContent(c *gin.Context) {
 | |
| 	var req dto.FileEdit
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	if err := fileService.SaveContent(req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) UploadFiles(c *gin.Context) {
 | |
| 	form, err := c.MultipartForm()
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	files := form.File["file"]
 | |
| 	paths := form.Value["path"]
 | |
| 	if len(paths) == 0 || !strings.Contains(paths[0], "/") {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, errors.New("error paths in request"))
 | |
| 		return
 | |
| 	}
 | |
| 	dir := paths[0][:strings.LastIndex(paths[0], "/")]
 | |
| 	if _, err := os.Stat(dir); err != nil && os.IsNotExist(err) {
 | |
| 		if err = os.MkdirAll(dir, os.ModePerm); err != nil {
 | |
| 			if err != nil {
 | |
| 				helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, fmt.Errorf("mkdir %s failed, err: %v", dir, err))
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	success := 0
 | |
| 	for _, file := range files {
 | |
| 		err := c.SaveUploadedFile(file, path.Join(paths[0], file.Filename))
 | |
| 		if err != nil {
 | |
| 			global.LOG.Errorf("upload [%s] file failed, err: %v", file.Filename, err)
 | |
| 			continue
 | |
| 		}
 | |
| 		success++
 | |
| 	}
 | |
| 	helper.SuccessWithMsg(c, fmt.Sprintf("%d files upload success", success))
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) ChangeFileName(c *gin.Context) {
 | |
| 	var req dto.FileRename
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	if err := fileService.ChangeName(req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) WgetFile(c *gin.Context) {
 | |
| 	var req dto.FileWget
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	key, err := fileService.Wget(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, dto.FileWgetRes{
 | |
| 		Key: key,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) MoveFile(c *gin.Context) {
 | |
| 	var req dto.FileMove
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	if err := fileService.MvFile(req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, nil)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) Download(c *gin.Context) {
 | |
| 	var req dto.FileDownload
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	filePath, err := fileService.FileDownload(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	c.File(filePath)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) Size(c *gin.Context) {
 | |
| 	var req dto.DirSizeReq
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	res, err := fileService.DirSize(req)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, res)
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) LoadFromFile(c *gin.Context) {
 | |
| 	var req dto.FilePath
 | |
| 	if err := c.ShouldBindJSON(&req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 	if err := global.VALID.Struct(req); err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	content, err := ioutil.ReadFile(req.Path)
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	helper.SuccessWithData(c, string(content))
 | |
| }
 | |
| 
 | |
| var wsUpgrade = websocket.Upgrader{
 | |
| 	CheckOrigin: func(r *http.Request) bool {
 | |
| 		return true
 | |
| 	},
 | |
| }
 | |
| 
 | |
| var WsManager = websocket2.Manager{
 | |
| 	Group:       make(map[string]*websocket2.Client),
 | |
| 	Register:    make(chan *websocket2.Client, 128),
 | |
| 	UnRegister:  make(chan *websocket2.Client, 128),
 | |
| 	ClientCount: 0,
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) Ws(c *gin.Context) {
 | |
| 	ws, err := wsUpgrade.Upgrade(c.Writer, c.Request, nil)
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 	wsClient := websocket2.NewWsClient("13232", ws)
 | |
| 	go wsClient.Read()
 | |
| 	go wsClient.Write()
 | |
| }
 | |
| 
 | |
| func (b *BaseApi) Keys(c *gin.Context) {
 | |
| 	res := &dto.FileProcessKeys{}
 | |
| 	keys, err := global.CACHE.PrefixScanKey("file-wget-")
 | |
| 	if err != nil {
 | |
| 		helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
 | |
| 		return
 | |
| 	}
 | |
| 	res.Keys = keys
 | |
| 	helper.SuccessWithData(c, res)
 | |
| }
 |