修复 「1.2.2 用户管理-用户列表勾选单一用户会全选 」 close #216
This commit is contained in:
@ -1,10 +1,15 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"mime/multipart"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"next-terminal/server/config"
|
||||
"next-terminal/server/log"
|
||||
@ -12,37 +17,31 @@ import (
|
||||
"next-terminal/server/repository"
|
||||
"next-terminal/server/utils"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type StorageService struct {
|
||||
storageRepository *repository.StorageRepository
|
||||
userRepository *repository.UserRepository
|
||||
propertyRepository *repository.PropertyRepository
|
||||
type storageService struct {
|
||||
}
|
||||
|
||||
func NewStorageService(storageRepository *repository.StorageRepository, userRepository *repository.UserRepository, propertyRepository *repository.PropertyRepository) *StorageService {
|
||||
return &StorageService{storageRepository: storageRepository, userRepository: userRepository, propertyRepository: propertyRepository}
|
||||
}
|
||||
|
||||
func (r StorageService) InitStorages() error {
|
||||
users, err := r.userRepository.FindAll()
|
||||
func (service storageService) InitStorages() error {
|
||||
users, err := repository.UserRepository.FindAll(context.TODO())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := range users {
|
||||
userId := users[i].ID
|
||||
_, err := r.storageRepository.FindByOwnerIdAndDefault(userId, true)
|
||||
_, err := repository.StorageRepository.FindByOwnerIdAndDefault(context.TODO(), userId, true)
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
err = r.CreateStorageByUser(&users[i])
|
||||
err = service.CreateStorageByUser(&users[i])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
drivePath := r.GetBaseDrivePath()
|
||||
storages, err := r.storageRepository.FindAll()
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
storages, err := repository.StorageRepository.FindAll(context.TODO())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -59,7 +58,7 @@ func (r StorageService) InitStorages() error {
|
||||
}
|
||||
|
||||
if !userExist {
|
||||
if err := r.DeleteStorageById(storage.ID, true); err != nil {
|
||||
if err := service.DeleteStorageById(storage.ID, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -76,8 +75,8 @@ func (r StorageService) InitStorages() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r StorageService) CreateStorageByUser(user *model.User) error {
|
||||
drivePath := r.GetBaseDrivePath()
|
||||
func (service storageService) CreateStorageByUser(user *model.User) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
storage := model.Storage{
|
||||
ID: user.ID,
|
||||
Name: user.Nickname + "的默认空间",
|
||||
@ -92,7 +91,7 @@ func (r StorageService) CreateStorageByUser(user *model.User) error {
|
||||
return err
|
||||
}
|
||||
log.Infof("创建storage:「%v」文件夹: %v", storage.Name, storageDir)
|
||||
err := r.storageRepository.Create(&storage)
|
||||
err := repository.StorageRepository.Create(context.TODO(), &storage)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -109,7 +108,7 @@ type File struct {
|
||||
Size int64 `json:"size"`
|
||||
}
|
||||
|
||||
func (r StorageService) Ls(drivePath, remoteDir string) ([]File, error) {
|
||||
func (service storageService) Ls(drivePath, remoteDir string) ([]File, error) {
|
||||
fileInfos, err := ioutil.ReadDir(path.Join(drivePath, remoteDir))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -132,13 +131,13 @@ func (r StorageService) Ls(drivePath, remoteDir string) ([]File, error) {
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func (r StorageService) GetBaseDrivePath() string {
|
||||
func (service storageService) GetBaseDrivePath() string {
|
||||
return config.GlobalCfg.Guacd.Drive
|
||||
}
|
||||
|
||||
func (r StorageService) DeleteStorageById(id string, force bool) error {
|
||||
drivePath := r.GetBaseDrivePath()
|
||||
storage, err := r.storageRepository.FindById(id)
|
||||
func (service storageService) DeleteStorageById(id string, force bool) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
storage, err := repository.StorageRepository.FindById(context.TODO(), id)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil
|
||||
@ -153,7 +152,136 @@ func (r StorageService) DeleteStorageById(id string, force bool) error {
|
||||
if err := os.RemoveAll(path.Join(drivePath, id)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := r.storageRepository.DeleteById(id); err != nil {
|
||||
if err := repository.StorageRepository.DeleteById(context.TODO(), id); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service storageService) StorageUpload(c echo.Context, file *multipart.FileHeader, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
storage, _ := repository.StorageRepository.FindById(context.TODO(), storageId)
|
||||
if storage.LimitSize > 0 {
|
||||
dirSize, err := utils.DirSize(path.Join(drivePath, storageId))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if dirSize+file.Size > storage.LimitSize {
|
||||
return errors.New("可用空间不足")
|
||||
}
|
||||
}
|
||||
|
||||
filename := file.Filename
|
||||
src, err := file.Open()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
remoteDir := c.QueryParam("dir")
|
||||
remoteFile := path.Join(remoteDir, filename)
|
||||
|
||||
if strings.Contains(remoteDir, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
if strings.Contains(remoteFile, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
|
||||
// 判断文件夹不存在时自动创建
|
||||
dir := path.Join(path.Join(drivePath, storageId), remoteDir)
|
||||
if !utils.FileExists(dir) {
|
||||
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Destination
|
||||
dst, err := os.Create(path.Join(path.Join(drivePath, storageId), remoteFile))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dst.Close()
|
||||
|
||||
// Copy
|
||||
if _, err = io.Copy(dst, src); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service storageService) StorageEdit(file string, fileContent string, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(file, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
realFilePath := path.Join(path.Join(drivePath, storageId), file)
|
||||
dstFile, err := os.OpenFile(realFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dstFile.Close()
|
||||
write := bufio.NewWriter(dstFile)
|
||||
if _, err := write.WriteString(fileContent); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := write.Flush(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service storageService) StorageDownload(c echo.Context, remoteFile, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(remoteFile, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
// 获取带后缀的文件名称
|
||||
filenameWithSuffix := path.Base(remoteFile)
|
||||
return c.Attachment(path.Join(path.Join(drivePath, storageId), remoteFile), filenameWithSuffix)
|
||||
}
|
||||
|
||||
func (service storageService) StorageLs(remoteDir, storageId string) (error, []File) {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(remoteDir, "../") {
|
||||
return errors.New("非法请求 :("), nil
|
||||
}
|
||||
files, err := service.Ls(path.Join(drivePath, storageId), remoteDir)
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
return nil, files
|
||||
}
|
||||
|
||||
func (service storageService) StorageMkDir(remoteDir, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(remoteDir, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
if err := os.MkdirAll(path.Join(path.Join(drivePath, storageId), remoteDir), os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service storageService) StorageRm(file, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(file, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
if err := os.RemoveAll(path.Join(path.Join(drivePath, storageId), file)); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service storageService) StorageRename(oldName, newName, storageId string) error {
|
||||
drivePath := service.GetBaseDrivePath()
|
||||
if strings.Contains(oldName, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
if strings.Contains(newName, "../") {
|
||||
return errors.New("非法请求 :(")
|
||||
}
|
||||
if err := os.Rename(path.Join(path.Join(drivePath, storageId), oldName), path.Join(path.Join(drivePath, storageId), newName)); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
Reference in New Issue
Block a user