You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/api/settings/update.go

78 lines
1.7 KiB
Go

//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2025-03-04 16:08:06
// Distributed under terms of the MIT license.
//
package settings
import (
"github.com/veypi/vbase/auth"
"github.com/veypi/vbase/cfg"
"github.com/veypi/vbase/models"
"github.com/veypi/vigo"
"gorm.io/gorm"
)
// UpdateItem 更新项
type UpdateItem struct {
Key string `json:"key"`
Value string `json:"value"`
}
// UpdateRequest 更新请求
type UpdateRequest struct {
Settings []UpdateItem `json:"settings"`
}
// UpdateResponse 更新响应
type UpdateResponse struct {
Updated int `json:"updated"`
}
// update 批量更新设置(仅管理员可用)
func update(x *vigo.X, req *UpdateRequest) (*UpdateResponse, error) {
// 获取当前用户ID
userID := ""
if u := x.Get("user_id"); u != nil {
userID = u.(string)
}
// 检查用户是否为管理员(检查 setting:update 权限)
isAdmin, err := auth.VBaseAuth.CheckPermission(x.Context(), userID, "", "setting:update", "")
if err != nil {
return nil, vigo.ErrInternalServer.WithError(err)
}
if !isAdmin {
return nil, vigo.ErrForbidden.WithString("only admin can update settings")
}
// 使用事务确保批量更新的原子性
db := cfg.DB()
updated := 0
err = db.Transaction(func(tx *gorm.DB) error {
for _, item := range req.Settings {
var s models.Setting
if err := tx.Where("`key` = ?", item.Key).First(&s).Error; err != nil {
return err
}
s.Value = item.Value
s.UpdatedBy = userID
if err := tx.Save(&s).Error; err != nil {
return err
}
updated++
}
return nil
})
if err != nil {
return nil, vigo.ErrInternalServer.WithError(err)
}
return &UpdateResponse{
Updated: updated,
}, nil
}