diff --git a/cmd/harbor/root/cmd.go b/cmd/harbor/root/cmd.go index 7a3fbf3d..95e58cae 100644 --- a/cmd/harbor/root/cmd.go +++ b/cmd/harbor/root/cmd.go @@ -109,6 +109,7 @@ harbor help repositry.Repository(), user.User(), artifact.Artifact(), + permissionsCommand(), ) return root diff --git a/cmd/harbor/root/permissions.go b/cmd/harbor/root/permissions.go new file mode 100644 index 00000000..cd83e9cc --- /dev/null +++ b/cmd/harbor/root/permissions.go @@ -0,0 +1,34 @@ +package root + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/goharbor/harbor-cli/pkg/api" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/permissions" +) + +func permissionsCommand() *cobra.Command { + return &cobra.Command{ + Use: "permissions", + Short: "Manage Harbor permissions", + Run: func(cmd *cobra.Command, args []string) { + ctx, client, err := utils.ContextWithClient() + if err != nil { + fmt.Printf("Error initializing client: %v\n", err) + os.Exit(1) + } + + permissionsHandler := api.NewPermissionsHandler(client.Permissions) + + perms, err := permissionsHandler.GetPermissions(ctx) + if err != nil { + fmt.Printf("Failed to get permissions: %v\n", err) + os.Exit(1) + } + permissions.PrintPermissions(perms) + }, + } +} \ No newline at end of file diff --git a/pkg/api/permissions_handler.go b/pkg/api/permissions_handler.go new file mode 100644 index 00000000..7977a270 --- /dev/null +++ b/pkg/api/permissions_handler.go @@ -0,0 +1,33 @@ +package api + +import ( + "context" + "fmt" + + "github.com/goharbor/go-client/pkg/sdk/v2.0/client/permissions" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + +) + +type PermissionsHandler struct { + client *permissions.Client +} + +func NewPermissionsHandler(client *permissions.Client) *PermissionsHandler { + return &PermissionsHandler{ + client: client, + } +} + +func (h *PermissionsHandler) GetPermissions(ctx context.Context) (*models.Permissions, error) { + params := &permissions.GetPermissionsParams{ + Context: ctx, + } + + resp, err := h.client.GetPermissions(ctx, params) + if err != nil { + return nil, fmt.Errorf("failed to get permissions: %w", err) + } + + return resp.Payload, nil +} diff --git a/pkg/views/permissions/view.go b/pkg/views/permissions/view.go new file mode 100644 index 00000000..87be26c5 --- /dev/null +++ b/pkg/views/permissions/view.go @@ -0,0 +1,54 @@ +package permissions + +import ( + "fmt" + "os" + + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" +) + +var systemColumns = []table.Column{ + {Title: "Resource", Width: 30}, + {Title: "Action", Width: 20}, +} + +var projectColumns = []table.Column{ + {Title: "Resource", Width: 30}, + {Title: "Action", Width: 20}, +} + +func PrintPermissions(perms *models.Permissions) { + var systemRows []table.Row + for _, p := range perms.System { + systemRows = append(systemRows, table.Row{ + p.Resource, + p.Action, + }) + } + + systemModel := tablelist.NewModel(systemColumns, systemRows, len(systemRows)) + var projectRows []table.Row + for _, p := range perms.Project { + projectRows = append(projectRows, table.Row{ + p.Resource, + p.Action, + }) + } + + projectModel := tablelist.NewModel(projectColumns, projectRows, len(projectRows)) + + fmt.Println("System Permissions:") + if _, err := tea.NewProgram(systemModel).Run(); err != nil { + fmt.Println("Error running system permissions table:", err) + os.Exit(1) + } + + fmt.Println("\nProject Permissions:") + if _, err := tea.NewProgram(projectModel).Run(); err != nil { + fmt.Println("Error running project permissions table:", err) + os.Exit(1) + } +}