fix(setting): ensure DefaultRole stores role ID while exposing role

name in APIs (fix/settings-get-role)

- Simplify initial settings to use `model.GUEST` as the default role ID
  instead of querying roles at startup.
- Update `GetSetting`, `ListSettings` handlers to:
  - Convert stored role ID into the corresponding role name when
    returning data.
  - Preserve dynamic role options for selection.
- Remove unused `strings` import and role preloading logic from
  `InitialSettings`.
- Avoid DB dependency during initialization while keeping consistent
  role display for frontend clients.
pull/9279/head
okatu-loli 2025-08-19 14:45:53 +08:00
parent b14d2b438b
commit 32bfe104bc
2 changed files with 26 additions and 7 deletions

View File

@ -88,12 +88,12 @@ var settingItemHooks = map[string]SettingItemHook{
if v == "" {
return nil
}
r, err := GetRoleByName(v)
id, err := strconv.Atoi(v)
if err != nil {
return err
return errors.WithStack(err)
}
item.Value = strconv.Itoa(int(r.ID))
return nil
_, err = GetRole(uint(id))
return err
},
}

View File

@ -19,9 +19,12 @@ func getRoleOptions() string {
if err != nil {
return ""
}
names := make([]string, len(roles))
for i, r := range roles {
names[i] = r.Name
names := make([]string, 0, len(roles))
for _, r := range roles {
if r.Name == "admin" || r.Name == "guest" {
continue
}
names = append(names, r.Name)
}
return strings.Join(names, ",")
}
@ -85,6 +88,22 @@ func SaveSettings(c *gin.Context) {
common.ErrorResp(c, err, 400)
return
}
for i := range req {
if req[i].Key == conf.DefaultRole {
role, err := op.GetRoleByName(req[i].Value)
if err != nil {
common.ErrorResp(c, err, 400)
return
}
if role.Name == "admin" || role.Name == "guest" {
common.ErrorStrResp(c, "cannot set admin or guest as default role", 400)
return
}
req[i].Value = strconv.Itoa(int(role.ID))
}
}
if err := op.SaveSettingItems(req); err != nil {
common.ErrorResp(c, err, 500)
} else {