add role based permissions

This commit is contained in:
Aditya Siregar
2025-08-19 21:29:37 +07:00
parent 7d5f061a1b
commit 6da48504fa
12 changed files with 461 additions and 12 deletions
+45
View File
@@ -20,6 +20,11 @@ type RBACService interface {
UpdateRole(ctx context.Context, id uuid.UUID, req *contract.UpdateRoleRequest) (*contract.RoleWithPermissionsResponse, error)
DeleteRole(ctx context.Context, id uuid.UUID) error
ListRoles(ctx context.Context) (*contract.ListRolesResponse, error)
// New methods
GetPermissionsGrouped(ctx context.Context) (*contract.PermissionsGroupedResponse, error)
CreateOrUpdateRole(ctx context.Context, req *contract.CreateOrUpdateRoleRequest) (*contract.RoleDetailResponse, error)
GetRoleDetail(ctx context.Context, roleID uuid.UUID) (*contract.RoleDetailResponse, error)
}
type RBACHandler struct{ svc RBACService }
@@ -135,3 +140,43 @@ func (h *RBACHandler) ListRoles(c *gin.Context) {
}
c.JSON(http.StatusOK, contract.BuildSuccessResponse(resp))
}
// New handlers for the required API endpoints
func (h *RBACHandler) GetPermissionsGrouped(c *gin.Context) {
resp, err := h.svc.GetPermissionsGrouped(c.Request.Context())
if err != nil {
c.JSON(http.StatusInternalServerError, &contract.ErrorResponse{Error: err.Error(), Code: 500})
return
}
c.JSON(http.StatusOK, resp)
}
func (h *RBACHandler) CreateOrUpdateRole(c *gin.Context) {
var req contract.CreateOrUpdateRoleRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, &contract.ErrorResponse{Error: "invalid body: " + err.Error(), Code: 400})
return
}
resp, err := h.svc.CreateOrUpdateRole(c.Request.Context(), &req)
if err != nil {
c.JSON(http.StatusInternalServerError, &contract.ErrorResponse{Error: err.Error(), Code: 500})
return
}
c.JSON(http.StatusOK, resp)
}
func (h *RBACHandler) GetRoleDetail(c *gin.Context) {
id, err := uuid.Parse(c.Param("id"))
if err != nil {
c.JSON(http.StatusBadRequest, &contract.ErrorResponse{Error: "invalid id", Code: 400})
return
}
resp, err := h.svc.GetRoleDetail(c.Request.Context(), id)
if err != nil {
c.JSON(http.StatusInternalServerError, &contract.ErrorResponse{Error: err.Error(), Code: 500})
return
}
c.JSON(http.StatusOK, resp)
}