Files
SaveAny-Bot/storage/storage.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
}