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" ) // PermissionHandler handles permission management requests type PermissionHandler struct { permissionService *service.PermissionService } // NewPermissionHandler creates a new PermissionHandler func NewPermissionHandler(permissionService *service.PermissionService) *PermissionHandler { return &PermissionHandler{permissionService: permissionService} } func (h *PermissionHandler) CreatePermission(c *gin.Context) { var req service.CreatePermissionRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } perm, err := h.permissionService.CreatePermission(c.Request.Context(), &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusCreated, perm) } func (h *PermissionHandler) ListPermissions(c *gin.Context) { var req service.ListPermissionRequest if err := c.ShouldBindQuery(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } perms, total, err := h.permissionService.ListPermissions(c.Request.Context(), &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{ "permissions": perms, "total": total, }) } func (h *PermissionHandler) GetPermission(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid permission id"}) return } perm, err := h.permissionService.GetPermission(c.Request.Context(), id) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, perm) } func (h *PermissionHandler) UpdatePermission(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid permission id"}) return } var req service.UpdatePermissionRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } perm, err := h.permissionService.UpdatePermission(c.Request.Context(), id, &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, perm) } func (h *PermissionHandler) DeletePermission(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid permission id"}) return } if err := h.permissionService.DeletePermission(c.Request.Context(), id); err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"message": "permission deleted"}) } func (h *PermissionHandler) UpdatePermissionStatus(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid permission 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.PermissionStatus switch req.Status { case "enabled", "1": status = domain.PermissionStatusEnabled case "disabled", "0": status = domain.PermissionStatusDisabled default: c.JSON(http.StatusBadRequest, gin.H{"error": "invalid status"}) return } if err := h.permissionService.UpdatePermissionStatus(c.Request.Context(), id, status); err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"message": "status updated"}) } func (h *PermissionHandler) GetPermissionTree(c *gin.Context) { tree, err := h.permissionService.GetPermissionTree(c.Request.Context()) if err != nil { handleError(c, err) return } c.JSON(http.StatusOK, gin.H{"permissions": tree}) }