package handler import ( "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/user-management-system/internal/domain" "github.com/user-management-system/internal/service" ) // RoleHandler handles role management requests type RoleHandler struct { roleService *service.RoleService } // NewRoleHandler creates a new RoleHandler func NewRoleHandler(roleService *service.RoleService) *RoleHandler { return &RoleHandler{roleService: roleService} } func (h *RoleHandler) CreateRole(c *gin.Context) { var req service.CreateRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } role, err := h.roleService.CreateRole(c.Request.Context(), &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusCreated, role) } func (h *RoleHandler) ListRoles(c *gin.Context) { var req service.ListRoleRequest if err := c.ShouldBindQuery(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } roles, total, err := h.roleService.ListRoles(c.Request.Context(), &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{ "roles": roles, "total": total, }) } func (h *RoleHandler) GetRole(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } role, err := h.roleService.GetRole(c.Request.Context(), id) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, role) } func (h *RoleHandler) UpdateRole(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } var req service.UpdateRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } role, err := h.roleService.UpdateRole(c.Request.Context(), id, &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, role) } func (h *RoleHandler) DeleteRole(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } if err := h.roleService.DeleteRole(c.Request.Context(), id); err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"message": "role deleted"}) } func (h *RoleHandler) UpdateRoleStatus(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } var req struct { Status string `json:"status" binding:"required"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var status domain.RoleStatus switch req.Status { case "enabled", "1": status = domain.RoleStatusEnabled case "disabled", "0": status = domain.RoleStatusDisabled default: c.JSON(http.StatusBadRequest, gin.H{"error": "invalid status"}) return } err = h.roleService.UpdateRoleStatus(c.Request.Context(), id, status) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"message": "status updated"}) } func (h *RoleHandler) GetRolePermissions(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } perms, err := h.roleService.GetRolePermissions(c.Request.Context(), id) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"permissions": perms}) } func (h *RoleHandler) AssignPermissions(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role id"}) return } var req struct { PermissionIDs []int64 `json:"permission_ids"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = h.roleService.AssignPermissions(c.Request.Context(), id, req.PermissionIDs) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"message": "permissions assigned"}) }