Skip to content

Commit 2a4c546

Browse files
authored
feat: default settings api (OpenListTeam#716)
* feat: default settings api * fix logic bug * chore
1 parent 750d4eb commit 2a4c546

File tree

5 files changed

+95
-45
lines changed

5 files changed

+95
-45
lines changed

internal/bootstrap/data/setting.go

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package data
22

33
import (
4+
"sort"
45
"strconv"
56

67
"github.com/OpenListTeam/OpenList/v4/cmd/flags"
@@ -15,10 +16,16 @@ import (
1516
"gorm.io/gorm"
1617
)
1718

18-
var initialSettingItems []model.SettingItem
19-
2019
func initSettings() {
21-
InitialSettings()
20+
initialSettingItems := InitialSettings()
21+
isActive := func(key string) bool {
22+
for _, item := range initialSettingItems {
23+
if item.Key == key {
24+
return true
25+
}
26+
}
27+
return false
28+
}
2229
// check deprecated
2330
settings, err := op.GetSettingItems()
2431
if err != nil {
@@ -35,13 +42,16 @@ func initSettings() {
3542
}
3643
settingMap[v.Key] = &v
3744
}
45+
op.MigrationSettingItems = map[string]op.MigrationValueItem{}
3846
// create or save setting
39-
save := false
47+
var saveItems []model.SettingItem
4048
for i := range initialSettingItems {
4149
item := &initialSettingItems[i]
4250
item.Index = uint(i)
43-
if len(item.MigrationValue) == 0 {
44-
item.MigrationValue = item.Value
51+
migrationValue := item.MigrationValue
52+
if len(migrationValue) > 0 {
53+
op.MigrationSettingItems[item.Key] = op.MigrationValueItem{MigrationValue: item.MigrationValue, Value: item.Value}
54+
item.MigrationValue = ""
4555
}
4656
// err
4757
stored, ok := settingMap[item.Key]
@@ -52,21 +62,21 @@ func initSettings() {
5262
continue
5363
}
5464
}
55-
if stored != nil && item.Key != conf.VERSION && stored.Value != item.MigrationValue {
65+
if item.Key != conf.VERSION && stored != nil &&
66+
(len(migrationValue) == 0 || stored.Value != migrationValue) {
5667
item.Value = stored.Value
5768
}
5869
_, err = op.HandleSettingItemHook(item)
5970
if err != nil {
6071
utils.Log.Errorf("failed to execute hook on %s: %+v", item.Key, err)
6172
continue
6273
}
63-
// save
6474
if stored == nil || *item != *stored {
65-
save = true
75+
saveItems = append(saveItems, *item)
6676
}
6777
}
68-
if save {
69-
err = db.SaveSettingItems(initialSettingItems)
78+
if len(saveItems) > 0 {
79+
err = db.SaveSettingItems(saveItems)
7080
if err != nil {
7181
utils.Log.Fatalf("failed save setting: %+v", err)
7282
} else {
@@ -75,23 +85,14 @@ func initSettings() {
7585
}
7686
}
7787

78-
func isActive(key string) bool {
79-
for _, item := range initialSettingItems {
80-
if item.Key == key {
81-
return true
82-
}
83-
}
84-
return false
85-
}
86-
8788
func InitialSettings() []model.SettingItem {
8889
var token string
8990
if flags.Dev {
9091
token = "dev_token"
9192
} else {
9293
token = random.Token()
9394
}
94-
initialSettingItems = []model.SettingItem{
95+
initialSettingItems := []model.SettingItem{
9596
// site settings
9697
{Key: conf.VERSION, Value: conf.Version, Type: conf.TypeString, Group: model.SITE, Flag: model.READONLY},
9798
//{Key: conf.ApiUrl, Value: "", Type: conf.TypeString, Group: model.SITE},
@@ -223,7 +224,12 @@ func InitialSettings() []model.SettingItem {
223224
{Key: conf.StreamMaxServerDownloadSpeed, Value: "-1", Type: conf.TypeNumber, Group: model.TRAFFIC, Flag: model.PRIVATE},
224225
{Key: conf.StreamMaxServerUploadSpeed, Value: "-1", Type: conf.TypeNumber, Group: model.TRAFFIC, Flag: model.PRIVATE},
225226
}
226-
initialSettingItems = append(initialSettingItems, tool.Tools.Items()...)
227+
additionalSettingItems := tool.Tools.Items()
228+
// 固定顺序
229+
sort.Slice(additionalSettingItems, func(i, j int) bool {
230+
return additionalSettingItems[i].Key < additionalSettingItems[j].Key
231+
})
232+
initialSettingItems = append(initialSettingItems, additionalSettingItems...)
227233
if flags.Dev {
228234
initialSettingItems = append(initialSettingItems, []model.SettingItem{
229235
{Key: "test_deprecated", Value: "test_value", Type: conf.TypeString, Flag: model.DEPRECATED},

internal/op/setting.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package op
22

33
import (
4+
"fmt"
45
"sort"
56
"strconv"
67
"strings"
@@ -153,42 +154,36 @@ func GetSettingItemsInGroups(groups []int) ([]model.SettingItem, error) {
153154
}
154155

155156
func SaveSettingItems(items []model.SettingItem) error {
156-
noHookItems := make([]model.SettingItem, 0)
157-
errs := make([]error, 0)
158157
for i := range items {
159-
if ok, err := HandleSettingItemHook(&items[i]); ok {
160-
if err != nil {
161-
errs = append(errs, err)
162-
} else {
163-
err = db.SaveSettingItem(&items[i])
164-
if err != nil {
165-
errs = append(errs, err)
166-
}
167-
}
168-
} else {
169-
noHookItems = append(noHookItems, items[i])
158+
item := &items[i]
159+
if it, ok := MigrationSettingItems[item.Key]; ok &&
160+
item.Value == it.MigrationValue {
161+
item.Value = it.Value
162+
}
163+
if ok, err := HandleSettingItemHook(item); ok && err != nil {
164+
return fmt.Errorf("failed to execute hook on %s: %+v", item.Key, err)
170165
}
171166
}
172-
if len(noHookItems) > 0 {
173-
err := db.SaveSettingItems(noHookItems)
167+
err := db.SaveSettingItems(items)
174168
if err != nil {
175-
errs = append(errs, err)
176-
}
169+
return fmt.Errorf("failed save setting: %+v", err)
177170
}
178-
if len(errs) < len(items)-len(noHookItems)+1 {
179171
SettingCacheUpdate()
180-
}
181-
return utils.MergeErrors(errs...)
172+
return nil
182173
}
183174

184175
func SaveSettingItem(item *model.SettingItem) (err error) {
176+
if it, ok := MigrationSettingItems[item.Key]; ok &&
177+
item.Value == it.MigrationValue {
178+
item.Value = it.Value
179+
}
185180
// hook
186181
if _, err := HandleSettingItemHook(item); err != nil {
187-
return err
182+
return fmt.Errorf("failed to execute hook on %s: %+v", item.Key, err)
188183
}
189184
// update
190185
if err = db.SaveSettingItem(item); err != nil {
191-
return err
186+
return fmt.Errorf("failed save setting on %s: %+v", item.Key, err)
192187
}
193188
SettingCacheUpdate()
194189
return nil
@@ -205,3 +200,9 @@ func DeleteSettingItemByKey(key string) error {
205200
SettingCacheUpdate()
206201
return db.DeleteSettingItemByKey(key)
207202
}
203+
204+
type MigrationValueItem struct {
205+
MigrationValue, Value string
206+
}
207+
208+
var MigrationSettingItems map[string]MigrationValueItem

server/common/proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func attachHeader(w http.ResponseWriter, file model.Obj, header http.Header) {
7373
func GetEtag(file model.Obj) string {
7474
hash := ""
7575
for _, v := range file.GetHash().Export() {
76-
if strings.Compare(v, hash) > 0 {
76+
if v > hash {
7777
hash = v
7878
}
7979
}

server/handles/setting.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package handles
22

33
import (
4+
"sort"
45
"strconv"
56
"strings"
67

8+
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap/data"
79
"github.com/OpenListTeam/OpenList/v4/internal/conf"
810
"github.com/OpenListTeam/OpenList/v4/internal/model"
911
"github.com/OpenListTeam/OpenList/v4/internal/op"
@@ -91,6 +93,46 @@ func ListSettings(c *gin.Context) {
9193
common.SuccessResp(c, settings)
9294
}
9395

96+
func DefaultSettings(c *gin.Context) {
97+
groupStr := c.Query("group")
98+
groupsStr := c.Query("groups")
99+
settings := data.InitialSettings()
100+
if groupsStr == "" && groupStr == "" {
101+
for i := range settings {
102+
(&settings[i]).Index = uint(i)
103+
}
104+
common.SuccessResp(c, settings)
105+
} else {
106+
var groupStrings []string
107+
if groupsStr != "" {
108+
groupStrings = strings.Split(groupsStr, ",")
109+
} else {
110+
groupStrings = append(groupStrings, groupStr)
111+
}
112+
var groups []int
113+
for _, str := range groupStrings {
114+
group, err := strconv.Atoi(str)
115+
if err != nil {
116+
common.ErrorResp(c, err, 400)
117+
return
118+
}
119+
groups = append(groups, group)
120+
}
121+
sort.Ints(groups)
122+
var resultItems []model.SettingItem
123+
for _, group := range groups {
124+
for i := range settings {
125+
item := settings[i]
126+
if group == item.Group {
127+
item.Index = uint(i)
128+
resultItems = append(resultItems, item)
129+
}
130+
}
131+
}
132+
common.SuccessResp(c, resultItems)
133+
}
134+
}
135+
94136
func DeleteSetting(c *gin.Context) {
95137
key := c.Query("key")
96138
if err := op.DeleteSettingItemByKey(key); err != nil {

server/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ func admin(g *gin.RouterGroup) {
140140
setting.GET("/list", handles.ListSettings)
141141
setting.POST("/save", handles.SaveSettings)
142142
setting.POST("/delete", handles.DeleteSetting)
143+
setting.POST("/default", handles.DefaultSettings)
143144
setting.POST("/reset_token", handles.ResetToken)
144145
setting.POST("/set_aria2", handles.SetAria2)
145146
setting.POST("/set_qbit", handles.SetQbittorrent)

0 commit comments

Comments
 (0)