package admin import ( "strconv" "github.com/gofiber/fiber/v2" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/response" "github.com/break/junhong_cmp_fiber/internal/model" roleService "github.com/break/junhong_cmp_fiber/internal/service/role" ) // RoleHandler 角色 Handler type RoleHandler struct { service *roleService.Service } // NewRoleHandler 创建角色 Handler func NewRoleHandler(service *roleService.Service) *RoleHandler { return &RoleHandler{service: service} } // Create 创建角色 // POST /api/v1/roles func (h *RoleHandler) Create(c *fiber.Ctx) error { var req model.CreateRoleRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } role, err := h.service.Create(c.UserContext(), &req) if err != nil { return err } return response.Success(c, role) } // Get 获取角色详情 // GET /api/v1/roles/:id func (h *RoleHandler) Get(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } role, err := h.service.Get(c.UserContext(), uint(id)) if err != nil { return err } return response.Success(c, role) } // Update 更新角色 // PUT /api/v1/roles/:id func (h *RoleHandler) Update(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } var req model.UpdateRoleRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } role, err := h.service.Update(c.UserContext(), uint(id), &req) if err != nil { return err } return response.Success(c, role) } // Delete 删除角色 // DELETE /api/v1/roles/:id func (h *RoleHandler) Delete(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } if err := h.service.Delete(c.UserContext(), uint(id)); err != nil { return err } return response.Success(c, nil) } // List 查询角色列表 // GET /api/v1/roles func (h *RoleHandler) List(c *fiber.Ctx) error { var req model.RoleListRequest if err := c.QueryParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } roles, total, err := h.service.List(c.UserContext(), &req) if err != nil { return err } return response.SuccessWithPagination(c, roles, total, req.Page, req.PageSize) } // AssignPermissions 为角色分配权限 // POST /api/v1/roles/:id/permissions func (h *RoleHandler) AssignPermissions(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } var req model.AssignPermissionsRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } rps, err := h.service.AssignPermissions(c.UserContext(), uint(id), req.PermIDs) if err != nil { return err } return response.Success(c, rps) } // GetPermissions 获取角色的所有权限 // GET /api/v1/roles/:id/permissions func (h *RoleHandler) GetPermissions(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } permissions, err := h.service.GetPermissions(c.UserContext(), uint(id)) if err != nil { return err } return response.Success(c, permissions) } // RemovePermission 移除角色的权限 // DELETE /api/v1/roles/:role_id/permissions/:perm_id func (h *RoleHandler) RemovePermission(c *fiber.Ctx) error { roleID, err := strconv.ParseUint(c.Params("role_id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } permID, err := strconv.ParseUint(c.Params("perm_id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的权限 ID") } if err := h.service.RemovePermission(c.UserContext(), uint(roleID), uint(permID)); err != nil { return err } return response.Success(c, nil) } // UpdateStatus 更新角色状态 // PUT /api/v1/roles/:id/status func (h *RoleHandler) UpdateStatus(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return errors.New(errors.CodeInvalidParam, "无效的角色 ID") } var req model.UpdateRoleStatusRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } if err := h.service.UpdateStatus(c.UserContext(), uint(id), req.Status); err != nil { return err } return response.Success(c, nil) }