mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-08-07 05:23:22 +08:00
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/krau/SaveAny-Bot/storage/alist"
|
|
"github.com/krau/SaveAny-Bot/storage/local"
|
|
"github.com/krau/SaveAny-Bot/storage/webdav"
|
|
"github.com/krau/SaveAny-Bot/types"
|
|
)
|
|
|
|
type Storage interface {
|
|
Init(model types.StorageModel) error
|
|
Type() types.StorageType
|
|
JoinStoragePath(task types.Task) string
|
|
Save(cttx context.Context, localFilePath, storagePath string) error
|
|
}
|
|
|
|
var (
|
|
ErrInvalidStorageID = errors.New("invalid storage ID")
|
|
)
|
|
|
|
var Storages = make(map[uint]Storage)
|
|
|
|
// Get storage from model, if it exists, otherwise create and init a new storage
|
|
func GetStorageFromModel(model types.StorageModel) (Storage, error) {
|
|
if model.ID == 0 {
|
|
return nil, ErrInvalidStorageID
|
|
}
|
|
if storage, ok := Storages[model.ID]; ok {
|
|
return storage, nil
|
|
}
|
|
storage, err := NewStorage(model)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
Storages[model.ID] = storage
|
|
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
|
|
}
|