// // Copyright (C) 2024 veypi // 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 }