From 87caaf2459548d0daab0087a6c6d22817f17a85d Mon Sep 17 00:00:00 2001 From: j2rong4cn <36783515+j2rong4cn@users.noreply.github.com> Date: Sat, 3 Aug 2024 13:11:09 +0800 Subject: [PATCH] fix: out of order when database is not sqlite3 (#6560) --- internal/bootstrap/data/setting.go | 1 + internal/db/meta.go | 2 +- internal/db/settingitem.go | 3 ++- internal/db/storage.go | 9 +++------ internal/db/user.go | 2 +- internal/db/util.go | 5 +++++ internal/model/setting.go | 1 + 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/internal/bootstrap/data/setting.go b/internal/bootstrap/data/setting.go index 75244d84027..920a7a2d118 100644 --- a/internal/bootstrap/data/setting.go +++ b/internal/bootstrap/data/setting.go @@ -34,6 +34,7 @@ func initSettings() { // create or save setting for i := range initialSettingItems { item := &initialSettingItems[i] + item.Index = uint(i) if item.PreDefault == "" { item.PreDefault = item.Value } diff --git a/internal/db/meta.go b/internal/db/meta.go index 8b6a605e809..14532637a7b 100644 --- a/internal/db/meta.go +++ b/internal/db/meta.go @@ -34,7 +34,7 @@ func GetMetas(pageIndex, pageSize int) (metas []model.Meta, count int64, err err if err = metaDB.Count(&count).Error; err != nil { return nil, 0, errors.Wrapf(err, "failed get metas count") } - if err = metaDB.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&metas).Error; err != nil { + if err = metaDB.Order(columnName("id")).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&metas).Error; err != nil { return nil, 0, errors.Wrapf(err, "failed get find metas") } return metas, count, nil diff --git a/internal/db/settingitem.go b/internal/db/settingitem.go index 2ba0c665acd..9e61bfca00b 100644 --- a/internal/db/settingitem.go +++ b/internal/db/settingitem.go @@ -49,7 +49,8 @@ func GetSettingItemsByGroup(group int) ([]model.SettingItem, error) { func GetSettingItemsInGroups(groups []int) ([]model.SettingItem, error) { var settingItems []model.SettingItem - if err := db.Where(fmt.Sprintf("%s in ?", columnName("group")), groups).Find(&settingItems).Error; err != nil { + err := db.Order(columnName("index")).Where(fmt.Sprintf("%s in ?", columnName("group")), groups).Find(&settingItems).Error + if err != nil { return nil, errors.WithStack(err) } return settingItems, nil diff --git a/internal/db/storage.go b/internal/db/storage.go index d4e0730f064..376d42d7bf9 100644 --- a/internal/db/storage.go +++ b/internal/db/storage.go @@ -2,7 +2,6 @@ package db import ( "fmt" - "sort" "github.com/alist-org/alist/v3/internal/model" "github.com/pkg/errors" @@ -36,7 +35,7 @@ func GetStorages(pageIndex, pageSize int) ([]model.Storage, int64, error) { 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 { + if err := addStorageOrder(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 @@ -63,11 +62,9 @@ func GetStorageByMountPath(mountPath string) (*model.Storage, error) { func GetEnabledStorages() ([]model.Storage, error) { var storages []model.Storage - if err := db.Where(fmt.Sprintf("%s = ?", columnName("disabled")), false).Find(&storages).Error; err != nil { + err := addStorageOrder(db).Where(fmt.Sprintf("%s = ?", columnName("disabled")), false).Find(&storages).Error + if err != nil { return nil, errors.WithStack(err) } - sort.Slice(storages, func(i, j int) bool { - return storages[i].Order < storages[j].Order - }) return storages, nil } diff --git a/internal/db/user.go b/internal/db/user.go index 822926664c9..8c9641b2c55 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -54,7 +54,7 @@ func GetUsers(pageIndex, pageSize int) (users []model.User, count int64, err err if err := userDB.Count(&count).Error; err != nil { return nil, 0, errors.Wrapf(err, "failed get users count") } - if err := userDB.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&users).Error; err != nil { + if err := userDB.Order(columnName("id")).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&users).Error; err != nil { return nil, 0, errors.Wrapf(err, "failed get find users") } return users, count, nil diff --git a/internal/db/util.go b/internal/db/util.go index 38a06bcdacc..57f615bdeb1 100644 --- a/internal/db/util.go +++ b/internal/db/util.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/alist-org/alist/v3/internal/conf" + "gorm.io/gorm" ) func columnName(name string) string { @@ -12,3 +13,7 @@ func columnName(name string) string { } return fmt.Sprintf("`%s`", name) } + +func addStorageOrder(db *gorm.DB) *gorm.DB { + return db.Order(fmt.Sprintf("%s, %s", columnName("order"), columnName("id"))) +} diff --git a/internal/model/setting.go b/internal/model/setting.go index 9893124890e..c474935ed49 100644 --- a/internal/model/setting.go +++ b/internal/model/setting.go @@ -29,6 +29,7 @@ type SettingItem struct { Options string `json:"options"` // values for select Group int `json:"group"` // use to group setting in frontend Flag int `json:"flag"` // 0 = public, 1 = private, 2 = readonly, 3 = deprecated, etc. + Index uint `json:"index"` } func (s SettingItem) IsDeprecated() bool {