| 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 |
| } |
|
|