filer/controller/controller.go

176 lines
3.9 KiB
Go

package controller
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
"github.com/sirupsen/logrus"
"github.com/upyun/go-sdk/v3/upyun"
"github.com/wailsapp/wails/v2/pkg/runtime"
)
type Storage struct {
ctx context.Context
uper *upyun.UpYun
}
func (s *Storage) Startup(ctx context.Context) {
s.ctx = ctx
}
func NewStorage() *Storage {
return &Storage{}
}
// Quit 退出程序
func (s *Storage) Quit() {
runtime.Quit(s.ctx)
}
// GetConfig 获取所有配置
func (s *Storage) GetConfig() (resp *ServerConfig, err error) {
resp = new(ServerConfig)
cfg := GetConfig()
resp.Upyun = UpyunConfig{
Bucket: cfg.Upyun.Bucket,
Operator: cfg.Upyun.Operator,
Password: cfg.Upyun.Password,
Domain: cfg.Upyun.Domain,
}
logrus.Infof("get config: %v", resp.Upyun)
return resp, nil
}
// SetUpyunConfig 更新又拍云的配置
func (s *Storage) SetUpyunConfig(req *UpyunConfig) (err error) {
cfg := GetConfig()
logrus.Infof("event receive: %+v", req)
cfg.Upyun.Bucket = req.Bucket
cfg.Upyun.Operator = req.Operator
cfg.Upyun.Password = req.Password
cfg.Upyun.Domain = req.Domain
if err := cfg.Rewrite(); err != nil {
return err
}
s.refreshDriver(cfg.Upyun)
return nil
}
// refreshDriver 刷新驱动句柄
func (s *Storage) refreshDriver(cfg UpyunConfig) {
s.uper = upyun.NewUpYun(&upyun.UpYunConfig{
Bucket: cfg.Bucket,
Operator: cfg.Operator,
Password: cfg.Password,
})
}
func (s *Storage) isUperNil() error {
if s.uper == nil {
cfg := GetConfig().Upyun
if cfg.Bucket == "" || cfg.Operator == "" || cfg.Password == "" {
return fmt.Errorf("[upyun] please initial config")
}
s.refreshDriver(cfg)
}
return nil
}
// UperCreateDirectory 创建目录
func (s *Storage) UperCreateDirectory(dirname string) (err error) {
if err := s.isUperNil(); err != nil {
return err
}
if err := s.uper.Mkdir(dirname); err != nil {
logrus.Errorf("[upyun] mkdir %s failed: %v", dirname, err)
return fmt.Errorf("[upyun] mkdir %s failed: %v", dirname, err)
}
return nil
}
// UperList 获取文件列表
func (s *Storage) UperList(prefix string) (list []*FileInfo, err error) {
if err := s.isUperNil(); err != nil {
return list, err
}
objsChan := make(chan *upyun.FileInfo, 25)
go func() {
if err := s.uper.List(&upyun.GetObjectsConfig{
Path: prefix,
ObjectsChan: objsChan,
MaxListTries: 0,
MaxListLevel: 0,
DescOrder: true,
}); err != nil {
logrus.Errorf("[upyun] read list %s failed: %v", prefix, err)
}
}()
for file := range objsChan {
list = append(list, &FileInfo{
Filename: file.Name,
Prefix: prefix,
CreatedAt: file.Time.Format(time.DateTime),
Size: file.Size,
IsDir: file.IsDir,
})
}
return list, nil
}
// UperUpload 上传文件
func (s *Storage) UperUpload(prefix string) (err error) {
if err := s.isUperNil(); err != nil {
return err
}
filename, err := runtime.OpenFileDialog(s.ctx, runtime.OpenDialogOptions{})
basefile := filepath.Base(filename)
if prefix != "/" {
prefix += "/"
}
basefile = prefix + basefile
logrus.Infof("filename: %s, upload filename: %s", filename, basefile)
file, err := os.OpenFile(filename, os.O_RDONLY, os.ModePerm)
if err != nil {
return err
}
if err := s.uper.Put(&upyun.PutObjectConfig{
Path: basefile,
Reader: file,
}); err != nil {
logrus.Errorf("[upyun] upload file %s failed: %v", basefile, err)
return fmt.Errorf("[upyun] upload file %s failed: %v", basefile, err)
}
return nil
}
// UperDelete 删除文件或文件夹
func (s *Storage) UperDelete(filename string, isDir bool) (err error) {
if err := s.isUperNil(); err != nil {
return err
}
if err := s.uper.Delete(&upyun.DeleteObjectConfig{
Path: filename,
Async: true,
Folder: isDir,
}); err != nil {
logrus.Errorf("[upyun] delete file %s failed: %v", filename, err)
return fmt.Errorf("[upyun] delete file %s failed: %v", filename, err)
}
return nil
}