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/user/roles.go

58 lines
1.4 KiB
Go

package user
import (
"github.com/veypi/vbase/cfg"
"github.com/veypi/vbase/models"
"github.com/veypi/vigo"
"gorm.io/gorm"
)
type GetRolesReq struct {
UserID string `src:"path@user_id" desc:"User ID"`
}
func getRoles(x *vigo.X, req *GetRolesReq) ([]models.Role, error) {
var userRoles []models.UserRole
if err := cfg.DB().Preload("Role").Where("user_id = ?", req.UserID).Find(&userRoles).Error; err != nil {
return nil, vigo.ErrDatabase.WithError(err)
}
roles := make([]models.Role, 0, len(userRoles))
for _, ur := range userRoles {
roles = append(roles, ur.Role)
}
return roles, nil
}
type UpdateRolesReq struct {
UserID string `src:"path@user_id" desc:"User ID"`
RoleIDs []string `json:"role_ids" src:"json" desc:"Role IDs"`
}
func updateRoles(x *vigo.X, req *UpdateRolesReq) error {
var user models.User
if err := cfg.DB().First(&user, "id = ?", req.UserID).Error; err != nil {
return vigo.ErrNotFound
}
return cfg.DB().Transaction(func(tx *gorm.DB) error {
if err := tx.Where("user_id = ?", req.UserID).Delete(&models.UserRole{}).Error; err != nil {
return err
}
if len(req.RoleIDs) > 0 {
userRoles := make([]models.UserRole, 0, len(req.RoleIDs))
for _, rid := range req.RoleIDs {
userRoles = append(userRoles, models.UserRole{
UserID: req.UserID,
RoleID: rid,
})
}
if err := tx.Create(&userRoles).Error; err != nil {
return err
}
}
return nil
})
}