mirror of https://github.com/veypi/OneAuth.git
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.
83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package role
|
|
|
|
import (
|
|
"github.com/veypi/vbase/cfg"
|
|
"github.com/veypi/vbase/models"
|
|
"github.com/veypi/vigo"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type GetUsersReq struct {
|
|
RoleID string `src:"path@id" desc:"Role ID"`
|
|
Page int `src:"query" default:"1" desc:"Page number"`
|
|
PageSize int `src:"query" default:"50" desc:"Page size"`
|
|
}
|
|
|
|
type UsersResponse struct {
|
|
Items []models.User `json:"items"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// getUsers 获取角色下的用户列表(分页)
|
|
func getUsers(x *vigo.X, req *GetUsersReq) (*UsersResponse, error) {
|
|
var role models.Role
|
|
if err := cfg.DB().First(&role, "id = ?", req.RoleID).Error; err != nil {
|
|
return nil, vigo.ErrNotFound
|
|
}
|
|
|
|
var total int64
|
|
cfg.DB().Model(&models.UserRole{}).Where("role_id = ?", req.RoleID).Count(&total)
|
|
|
|
var users []models.User
|
|
offset := (req.Page - 1) * req.PageSize
|
|
cfg.DB().Debug().
|
|
Joins("JOIN vb_user_roles ON vb_user_roles.user_id = vb_users.id").
|
|
Where("vb_user_roles.role_id = ?", req.RoleID).
|
|
Offset(offset).Limit(req.PageSize).
|
|
Find(&users)
|
|
|
|
return &UsersResponse{Items: users, Total: total}, nil
|
|
}
|
|
|
|
type UpdateUsersReq struct {
|
|
RoleID string `src:"path@id" desc:"Role ID"`
|
|
UserIDs []string `json:"user_ids" src:"json" desc:"List of User IDs"`
|
|
}
|
|
|
|
// updateUsers 批量设置角色的用户
|
|
func updateUsers(x *vigo.X, req *UpdateUsersReq) error {
|
|
var role models.Role
|
|
if err := cfg.DB().First(&role, "id = ?", req.RoleID).Error; err != nil {
|
|
return vigo.ErrNotFound
|
|
}
|
|
|
|
if role.IsSystem {
|
|
return vigo.NewError("cannot modify users of system role").WithCode(40300)
|
|
}
|
|
|
|
return cfg.DB().Transaction(func(tx *gorm.DB) error {
|
|
// 删除不在新列表中的关联
|
|
if err := tx.Where("role_id = ? AND user_id NOT IN ?", req.RoleID, req.UserIDs).
|
|
Delete(&models.UserRole{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 添加新关联(跳过已存在的)
|
|
for _, uid := range req.UserIDs {
|
|
var count int64
|
|
tx.Model(&models.UserRole{}).
|
|
Where("role_id = ? AND user_id = ?", req.RoleID, uid).
|
|
Count(&count)
|
|
if count == 0 {
|
|
if err := tx.Create(&models.UserRole{
|
|
RoleID: req.RoleID,
|
|
UserID: uid,
|
|
}).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|