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