mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-05-12 04:19:40 +08:00
feat: (WIP) add storage
Co-authored-by: AHCorn <42889600+AHCorn@users.noreply.github.com>
This commit is contained in:
@@ -24,6 +24,15 @@ type Alist struct {
|
||||
config config.AlistConfig
|
||||
}
|
||||
|
||||
var ConfigurableItems = []string{
|
||||
"url",
|
||||
"username",
|
||||
"password",
|
||||
"base_path",
|
||||
"token_exp",
|
||||
"token",
|
||||
}
|
||||
|
||||
func (a *Alist) Init(model types.StorageModel) error {
|
||||
var alistConfig config.AlistConfig
|
||||
if err := json.Unmarshal([]byte(model.Config), &alistConfig); err != nil {
|
||||
|
||||
@@ -16,6 +16,10 @@ type Local struct {
|
||||
config config.LocalConfig
|
||||
}
|
||||
|
||||
var ConfigurableItems = []string{
|
||||
"base_path",
|
||||
}
|
||||
|
||||
func (l *Local) Init(model types.StorageModel) error {
|
||||
var localConfig config.LocalConfig
|
||||
if err := json.Unmarshal([]byte(model.Config), &localConfig); err != nil {
|
||||
|
||||
@@ -3,6 +3,7 @@ package storage
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/krau/SaveAny-Bot/storage/alist"
|
||||
"github.com/krau/SaveAny-Bot/storage/local"
|
||||
@@ -39,26 +40,36 @@ func GetStorageFromModel(model types.StorageModel) (Storage, error) {
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
func NewStorage(storageModel types.StorageModel) (Storage, error) {
|
||||
switch storageModel.Type {
|
||||
case string(types.StorageTypeAlist):
|
||||
alistStorage := new(alist.Alist)
|
||||
if err := alistStorage.Init(storageModel); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return alistStorage, nil
|
||||
case string(types.StorageTypeLocal):
|
||||
localStorage := new(local.Local)
|
||||
if err := localStorage.Init(storageModel); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return localStorage, nil
|
||||
case string(types.StorageTypeWebdav):
|
||||
webdavStorage := new(webdav.Webdav)
|
||||
if err := webdavStorage.Init(storageModel); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return webdavStorage, nil
|
||||
}
|
||||
return nil, nil
|
||||
type StorageConstructor func() Storage
|
||||
|
||||
var storageConstructors = map[string]StorageConstructor{
|
||||
string(types.StorageTypeAlist): func() Storage { return new(alist.Alist) },
|
||||
string(types.StorageTypeLocal): func() Storage { return new(local.Local) },
|
||||
string(types.StorageTypeWebdav): func() Storage { return new(webdav.Webdav) },
|
||||
}
|
||||
|
||||
func NewStorage(model types.StorageModel) (Storage, error) {
|
||||
constructor, ok := storageConstructors[model.Type]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unsupported storage type: %s", model.Type)
|
||||
}
|
||||
|
||||
storage := constructor()
|
||||
if err := storage.Init(model); err != nil {
|
||||
return nil, fmt.Errorf("failed to init %s storage: %w", model.Type, err)
|
||||
}
|
||||
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
func GetStorageConfigurableItems(storageType types.StorageType) []string {
|
||||
switch storageType {
|
||||
case types.StorageTypeAlist:
|
||||
return alist.ConfigurableItems
|
||||
case types.StorageTypeLocal:
|
||||
return local.ConfigurableItems
|
||||
case types.StorageTypeWebdav:
|
||||
return webdav.ConfigurableItems
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -16,11 +16,10 @@ import (
|
||||
|
||||
type Webdav struct {
|
||||
config config.WebdavConfig
|
||||
client *gowebdav.Client
|
||||
}
|
||||
|
||||
var (
|
||||
Client *gowebdav.Client
|
||||
)
|
||||
var ConfigurableItems = []string{"url", "username", "password", "base_path"}
|
||||
|
||||
func (w *Webdav) Init(model types.StorageModel) error {
|
||||
var webdavConfig config.WebdavConfig
|
||||
@@ -28,11 +27,12 @@ func (w *Webdav) Init(model types.StorageModel) error {
|
||||
return fmt.Errorf("failed to unmarshal webdav config: %w", err)
|
||||
}
|
||||
w.config = webdavConfig
|
||||
Client = gowebdav.NewClient(webdavConfig.URL, webdavConfig.Username, webdavConfig.Password)
|
||||
if err := Client.Connect(); err != nil {
|
||||
client := gowebdav.NewClient(webdavConfig.URL, webdavConfig.Username, webdavConfig.Password)
|
||||
if err := client.Connect(); err != nil {
|
||||
return fmt.Errorf("failed to connect to webdav server: %w", err)
|
||||
}
|
||||
Client.SetTimeout(12 * time.Hour)
|
||||
client.SetTimeout(12 * time.Hour)
|
||||
w.client = client
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ func (w *Webdav) Type() types.StorageType {
|
||||
}
|
||||
|
||||
func (w *Webdav) Save(ctx context.Context, filePath, storagePath string) error {
|
||||
if err := Client.MkdirAll(path.Dir(storagePath), os.ModePerm); err != nil {
|
||||
if err := w.client.MkdirAll(path.Dir(storagePath), os.ModePerm); err != nil {
|
||||
logger.L.Errorf("Failed to create directory %s: %v", path.Dir(storagePath), err)
|
||||
return ErrFailedToCreateDirectory
|
||||
}
|
||||
@@ -52,7 +52,7 @@ func (w *Webdav) Save(ctx context.Context, filePath, storagePath string) error {
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if err := Client.WriteStream(storagePath, file, os.ModePerm); err != nil {
|
||||
if err := w.client.WriteStream(storagePath, file, os.ModePerm); err != nil {
|
||||
logger.L.Errorf("Failed to write file %s: %v", storagePath, err)
|
||||
return ErrFailedToWriteFile
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user