|
package db |
|
|
|
import ( |
|
"fmt" |
|
|
|
"github.com/alist-org/alist/v3/internal/model" |
|
"github.com/pkg/errors" |
|
"gorm.io/gorm" |
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func CreateStorage(storage *model.Storage) error { |
|
return errors.WithStack(db.Create(storage).Error) |
|
} |
|
|
|
|
|
func UpdateStorage(storage *model.Storage) error { |
|
return errors.WithStack(db.Save(storage).Error) |
|
} |
|
|
|
|
|
func DeleteStorageById(id uint) error { |
|
return errors.WithStack(db.Delete(&model.Storage{}, id).Error) |
|
} |
|
|
|
|
|
func GetStorages(pageIndex, pageSize int) ([]model.Storage, int64, error) { |
|
storageDB := db.Model(&model.Storage{}) |
|
var count int64 |
|
if err := storageDB.Count(&count).Error; err != nil { |
|
return nil, 0, errors.Wrapf(err, "failed get storages count") |
|
} |
|
var storages []model.Storage |
|
if err := storageDB.Order(columnName("order")).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&storages).Error; err != nil { |
|
return nil, 0, errors.WithStack(err) |
|
} |
|
return storages, count, nil |
|
} |
|
|
|
|
|
func GetStorageById(id uint) (*model.Storage, error) { |
|
var storage model.Storage |
|
storage.ID = id |
|
if err := db.First(&storage).Error; err != nil { |
|
return nil, errors.WithStack(err) |
|
} |
|
return &storage, nil |
|
} |
|
|
|
|
|
func GetStorageByMountPath(mountPath string) (*model.Storage, error) { |
|
var storage model.Storage |
|
if err := db.Where("mount_path = ?", mountPath).First(&storage).Error; err != nil { |
|
return nil, errors.WithStack(err) |
|
} |
|
return &storage, nil |
|
} |
|
|
|
func GetEnabledStorages() ([]model.Storage, error) { |
|
var storages []model.Storage |
|
if err := db.Where(fmt.Sprintf("%s = ?", columnName("disabled")), false).Find(&storages).Error; err != nil { |
|
return nil, errors.WithStack(err) |
|
} |
|
return storages, nil |
|
} |
|
|
|
func GetGroupStorages(groupName string) ([]model.Storage, error) { |
|
var storages []model.Storage |
|
if err := db.Where(fmt.Sprintf("%s = ?", columnName("group")), groupName).Find(&storages).Error; err != nil { |
|
return nil, errors.WithStack(err) |
|
} |
|
return storages, nil |
|
} |
|
|
|
func UpdateGroupStorages(groupName string, changedAdditions map[string]interface{}) error { |
|
var storages []model.Storage |
|
if err := db.Where(fmt.Sprintf("%s = ?", columnName("group")), groupName).Find(&storages).Error; err != nil { |
|
return errors.WithStack(err) |
|
} |
|
|
|
ids := extractField(storages, func(u model.Storage) int { return int(u.ID) }) |
|
|
|
|
|
expr := "addition" |
|
var args []interface{} |
|
for key, val := range changedAdditions { |
|
expr = fmt.Sprintf("JSON_SET(%s, ?, ?)", expr) |
|
args = append(args, "$."+key, val) |
|
} |
|
updates := map[string]interface{}{ |
|
"addition": gorm.Expr(expr, args...), |
|
} |
|
|
|
if updateErr := db.Model(&model.Storage{}).Where("id IN ?", ids).Updates(updates).Error; updateErr != nil { |
|
return errors.WithStack(updateErr) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nil |
|
} |
|
|
|
func extractField[T any, F any](slice []T, getter func(T) F) []F { |
|
result := make([]F, 0, len(slice)) |
|
for _, item := range slice { |
|
result = append(result, getter(item)) |
|
} |
|
return result |
|
} |
|
|