Files
goalfylearning-admin/internal/api/handlers/role_handler.go

229 lines
5.5 KiB
Go

package handlers
import (
"goalfymax-admin/internal/models"
"goalfymax-admin/internal/services"
"goalfymax-admin/pkg/utils"
"strconv"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// RoleHandler 角色处理器
type RoleHandler struct {
roleService services.RoleService
rbacService services.RBACService
response *utils.Response
logger *utils.Logger
}
// NewRoleHandler 创建角色处理器
func NewRoleHandler(roleService services.RoleService, rbacService services.RBACService, logger *utils.Logger) *RoleHandler {
return &RoleHandler{
roleService: roleService,
rbacService: rbacService,
response: utils.NewResponse(),
logger: logger,
}
}
// Create 创建角色
func (h *RoleHandler) Create(c *gin.Context) {
var req models.RoleCreateRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
role, err := h.roleService.Create(&req)
if err != nil {
h.logger.Error("创建角色失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, role)
}
// GetByID 获取角色详情
func (h *RoleHandler) GetByID(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
role, err := h.roleService.GetByID(uint(id))
if err != nil {
h.logger.Error("获取角色失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, role)
}
// Update 更新角色
func (h *RoleHandler) Update(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
var req models.RoleUpdateRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
role, err := h.roleService.Update(uint(id), &req)
if err != nil {
h.logger.Error("更新角色失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, role)
}
// Delete 删除角色
func (h *RoleHandler) Delete(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
err = h.roleService.Delete(uint(id))
if err != nil {
h.logger.Error("删除角色失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "角色删除成功"})
}
// List 获取角色列表
func (h *RoleHandler) List(c *gin.Context) {
var req models.RoleListRequest
if err := c.ShouldBindQuery(&req); err != nil {
h.response.ValidateError(c, err)
return
}
roles, total, err := h.roleService.List(&req)
if err != nil {
h.logger.Error("获取角色列表失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
// 为每个角色获取页面权限
rolesWithPermissions := make([]gin.H, len(roles))
for i, role := range roles {
// 获取角色的页面权限
pages, err := h.rbacService.GetRolePagePermissions(role.ID)
if err != nil {
h.logger.Warn("获取角色页面权限失败", zap.Uint("roleId", role.ID), zap.Error(err))
pages = []models.Page{} // 如果获取失败,返回空数组
}
rolesWithPermissions[i] = gin.H{
"id": role.ID,
"name": role.Name,
"level": role.Level,
"description": role.Description,
"isDefault": role.IsDefault,
"createdAt": role.CreatedAt,
"updatedAt": role.UpdatedAt,
"deletedAt": role.DeletedAt,
"pages": pages, // 添加页面权限信息
}
}
h.response.Success(c, gin.H{
"roles": rolesWithPermissions,
"total": total,
"page": req.Page,
"size": req.Size,
})
}
// UpdateStatus 更新角色状态
func (h *RoleHandler) UpdateStatus(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
var req struct {
Status int `json:"status" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
err = h.roleService.UpdateStatus(uint(id), req.Status)
if err != nil {
h.logger.Error("更新角色状态失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "角色状态更新成功"})
}
// UpdatePermissions 更新角色权限
func (h *RoleHandler) UpdatePermissions(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
var req models.RolePagePermissionAssignRequest
req.RoleID = uint(id)
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
err = h.rbacService.AssignRolePagePermissions(&req)
if err != nil {
h.logger.Error("更新角色权限失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "角色权限更新成功"})
}
// GetRolePermissions 获取角色权限
func (h *RoleHandler) GetRolePermissions(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的角色ID")
return
}
permissions, err := h.rbacService.GetRolePagePermissions(uint(id))
if err != nil {
h.logger.Error("获取角色权限失败", zap.Error(err))
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"permissions": permissions})
}