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/role/patch.go

73 lines
1.9 KiB
Go

package role
import (
"github.com/veypi/vbase/cfg"
"github.com/veypi/vbase/models"
"github.com/veypi/vigo"
)
type PatchReq struct {
ID string `src:"path@id" desc:"Role ID"`
Name *string `json:"name" src:"json" desc:"Role Name"`
Code *string `json:"code" src:"json" desc:"Role Code"`
Scope *string `json:"scope" src:"json" desc:"Scope"`
Description *string `json:"description" src:"json" desc:"Role Description"`
Status *int `json:"status" src:"json" desc:"Status"`
}
func patch(x *vigo.X, req *PatchReq) (*models.Role, error) {
var role models.Role
if err := cfg.DB().First(&role, "id = ?", req.ID).Error; err != nil {
return nil, vigo.ErrNotFound
}
if role.IsSystem {
return nil, vigo.NewError("cannot modify system role").WithCode(40300)
}
updates := map[string]interface{}{}
// Check if code or scope is being updated
if req.Code != nil || req.Scope != nil {
newCode := role.Code
if req.Code != nil {
newCode = *req.Code
}
newScope := role.Scope
if req.Scope != nil {
newScope = *req.Scope
}
// Check for uniqueness if changed
if newCode != role.Code || newScope != role.Scope {
var count int64
if err := cfg.DB().Model(&models.Role{}).Where("code = ? AND scope = ? AND id != ?", newCode, newScope, role.ID).Count(&count).Error; err != nil {
return nil, vigo.ErrInternalServer.WithError(err)
}
if count > 0 {
return nil, vigo.ErrAlreadyExists.WithArgs("Role Code in Scope")
}
updates["code"] = newCode
updates["scope"] = newScope
}
}
if req.Name != nil {
updates["name"] = *req.Name
}
if req.Description != nil {
updates["description"] = *req.Description
}
if req.Status != nil {
updates["status"] = *req.Status
}
if len(updates) > 0 {
if err := cfg.DB().Model(&role).Updates(updates).Error; err != nil {
return nil, vigo.ErrDatabase.WithError(err)
}
}
return &role, nil
}