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" ) // RBACHandler 简化的RBAC处理器 type RBACHandler struct { rbacService services.RBACService response *utils.Response logger *utils.Logger } // NewRBACHandler 创建RBAC处理器 func NewRBACHandler(rbacService services.RBACService, logger *utils.Logger) *RBACHandler { return &RBACHandler{ rbacService: rbacService, response: utils.NewResponse(), logger: logger, } } // AssignRolePagePermissions 分配角色页面权限 func (h *RBACHandler) AssignRolePagePermissions(c *gin.Context) { var req models.RolePagePermissionAssignRequest if err := c.ShouldBindJSON(&req); err != nil { h.logger.Error("参数绑定失败", zap.Error(err)) h.response.Error(c, 400, "参数错误") return } err := h.rbacService.AssignRolePagePermissions(&req) if err != nil { h.logger.Error("分配角色页面权限失败", zap.Error(err)) h.response.Error(c, 500, "分配角色页面权限失败") return } h.response.Success(c, "分配角色页面权限成功") } // RemoveRolePagePermissions 移除角色页面权限 func (h *RBACHandler) RemoveRolePagePermissions(c *gin.Context) { roleIDStr := c.Param("id") roleID, err := strconv.ParseUint(roleIDStr, 10, 32) if err != nil { h.logger.Error("角色ID格式错误", zap.Error(err)) h.response.Error(c, 400, "角色ID格式错误") return } var req struct { PageIDs []uint `json:"pageIds" binding:"required"` } if err := c.ShouldBindJSON(&req); err != nil { h.logger.Error("参数绑定失败", zap.Error(err)) h.response.Error(c, 400, "参数错误") return } err = h.rbacService.RemoveRolePagePermissions(uint(roleID), req.PageIDs) if err != nil { h.logger.Error("移除角色页面权限失败", zap.Error(err)) h.response.Error(c, 500, "移除角色页面权限失败") return } h.response.Success(c, "移除角色页面权限成功") } // GetRolePagePermissions 获取角色页面权限 func (h *RBACHandler) GetRolePagePermissions(c *gin.Context) { roleIDStr := c.Param("id") roleID, err := strconv.ParseUint(roleIDStr, 10, 32) if err != nil { h.logger.Error("角色ID格式错误", zap.Error(err)) h.response.Error(c, 400, "角色ID格式错误") return } pages, err := h.rbacService.GetRolePagePermissions(uint(roleID)) if err != nil { h.logger.Error("获取角色页面权限失败", zap.Error(err)) h.response.Error(c, 500, "获取角色页面权限失败") return } h.response.Success(c, pages) } // GetUserPermissions 获取用户权限 func (h *RBACHandler) GetUserPermissions(c *gin.Context) { userIDStr := c.Param("id") userID, err := strconv.ParseUint(userIDStr, 10, 32) if err != nil { h.logger.Error("用户ID格式错误", zap.Error(err)) h.response.Error(c, 400, "用户ID格式错误") return } permissions, err := h.rbacService.GetUserPermissionsResponse(uint(userID)) if err != nil { h.logger.Error("获取用户权限失败", zap.Error(err)) h.response.Error(c, 500, "获取用户权限失败") return } h.response.Success(c, permissions) } // GetRolePermissions 获取角色权限 func (h *RBACHandler) GetRolePermissions(c *gin.Context) { roleIDStr := c.Param("id") roleID, err := strconv.ParseUint(roleIDStr, 10, 32) if err != nil { h.logger.Error("角色ID格式错误", zap.Error(err)) h.response.Error(c, 400, "角色ID格式错误") return } permissions, err := h.rbacService.GetRolePagePermissionsResponse(uint(roleID)) if err != nil { h.logger.Error("获取角色权限失败", zap.Error(err)) h.response.Error(c, 500, "获取角色权限失败") return } h.response.Success(c, permissions) } // CheckPagePermission 检查页面权限 func (h *RBACHandler) CheckPagePermission(c *gin.Context) { userIDStr := c.Query("user_id") pagePath := c.Query("page_path") userID, err := strconv.ParseUint(userIDStr, 10, 32) if err != nil { h.logger.Error("用户ID格式错误", zap.Error(err)) h.response.Error(c, 400, "用户ID格式错误") return } hasPermission, err := h.rbacService.CheckUserPagePermission(uint(userID), pagePath) if err != nil { h.logger.Error("检查页面权限失败", zap.Error(err)) h.response.Error(c, 500, "检查页面权限失败") return } h.response.Success(c, gin.H{ "hasPermission": hasPermission, "pagePath": pagePath, }) } // GetUserAccessiblePages 获取用户可访问页面 func (h *RBACHandler) GetUserAccessiblePages(c *gin.Context) { userIDStr := c.Param("id") userID, err := strconv.ParseUint(userIDStr, 10, 32) if err != nil { h.logger.Error("用户ID格式错误", zap.Error(err)) h.response.Error(c, 400, "用户ID格式错误") return } pages, err := h.rbacService.GetUserAccessiblePages(uint(userID)) if err != nil { h.logger.Error("获取用户可访问页面失败", zap.Error(err)) h.response.Error(c, 500, "获取用户可访问页面失败") return } h.response.Success(c, gin.H{ "pages": pages, }) }