From 982509416e8f8f2d8936925c571ab60169b9f40a Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Mon, 22 Jun 2026 08:40:03 +0200 Subject: [PATCH] Add trust-center alias CLI subcommand Provides set and remove subcommands for managing trust center aliases from the command line. Signed-off-by: Bryan Frimin --- pkg/cmd/trust-center/alias/alias.go | 34 +++++ pkg/cmd/trust-center/alias/remove/remove.go | 105 ++++++++++++++ pkg/cmd/trust-center/alias/set/set.go | 144 ++++++++++++++++++++ pkg/cmd/trust-center/trust_center.go | 2 + 4 files changed, 285 insertions(+) create mode 100644 pkg/cmd/trust-center/alias/alias.go create mode 100644 pkg/cmd/trust-center/alias/remove/remove.go create mode 100644 pkg/cmd/trust-center/alias/set/set.go diff --git a/pkg/cmd/trust-center/alias/alias.go b/pkg/cmd/trust-center/alias/alias.go new file mode 100644 index 000000000..f3de10a43 --- /dev/null +++ b/pkg/cmd/trust-center/alias/alias.go @@ -0,0 +1,34 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package alias + +import ( + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cmd/cmdutil" + "go.probo.inc/probo/pkg/cmd/trust-center/alias/remove" + "go.probo.inc/probo/pkg/cmd/trust-center/alias/set" +) + +func NewCmdAlias(f *cmdutil.Factory) *cobra.Command { + cmd := &cobra.Command{ + Use: "alias ", + Short: "Manage trust center aliases", + } + + cmd.AddCommand(set.NewCmdSet(f)) + cmd.AddCommand(remove.NewCmdRemove(f)) + + return cmd +} diff --git a/pkg/cmd/trust-center/alias/remove/remove.go b/pkg/cmd/trust-center/alias/remove/remove.go new file mode 100644 index 000000000..4f6a6ccb6 --- /dev/null +++ b/pkg/cmd/trust-center/alias/remove/remove.go @@ -0,0 +1,105 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package remove + +import ( + "fmt" + + "github.com/charmbracelet/huh" + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cli/api" + "go.probo.inc/probo/pkg/cmd/cmdutil" +) + +const removeMutation = ` +mutation($input: RemoveTrustCenterAliasInput!) { + removeTrustCenterAlias(input: $input) { + deletedResourceId + } +} +` + +func NewCmdRemove(f *cmdutil.Factory) *cobra.Command { + var flagYes bool + + cmd := &cobra.Command{ + Use: "remove ", + Short: "Remove a trust center alias", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if !flagYes { + if !f.IOStreams.IsInteractive() { + return fmt.Errorf("cannot remove alias: confirmation required, use --yes to confirm") + } + + var confirmed bool + + err := huh.NewConfirm(). + Title(fmt.Sprintf("Remove alias for resource %s?", args[0])). + Value(&confirmed). + Run() + if err != nil { + return err + } + + if !confirmed { + return nil + } + } + + cfg, err := f.Config() + if err != nil { + return err + } + + host, hc, err := cfg.DefaultHost() + if err != nil { + return err + } + + client := api.NewClient( + host, + hc.Token, + "/api/console/v1/graphql", + cfg.HTTPTimeoutDuration(), + cmdutil.TokenRefreshOption(cfg, host, hc), + ) + + _, err = client.Do( + removeMutation, + map[string]any{ + "input": map[string]any{ + "resourceId": args[0], + }, + }, + ) + if err != nil { + return err + } + + _, _ = fmt.Fprintf( + f.IOStreams.Out, + "Removed alias for resource %s\n", + args[0], + ) + + return nil + }, + } + + cmd.Flags().BoolVarP(&flagYes, "yes", "y", false, "Skip confirmation prompt") + + return cmd +} diff --git a/pkg/cmd/trust-center/alias/set/set.go b/pkg/cmd/trust-center/alias/set/set.go new file mode 100644 index 000000000..f81b9378b --- /dev/null +++ b/pkg/cmd/trust-center/alias/set/set.go @@ -0,0 +1,144 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package set + +import ( + "encoding/json" + "fmt" + + "github.com/charmbracelet/huh" + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cli/api" + "go.probo.inc/probo/pkg/cmd/cmdutil" +) + +const setMutation = ` +mutation($input: SetTrustCenterAliasInput!) { + setTrustCenterAlias(input: $input) { + alias { + resourceId + alias + } + } +} +` + +type setResponse struct { + SetTrustCenterAlias struct { + Alias struct { + ResourceID string `json:"resourceId"` + Alias string `json:"alias"` + } `json:"alias"` + } `json:"setTrustCenterAlias"` +} + +func NewCmdSet(f *cmdutil.Factory) *cobra.Command { + var ( + flagResourceID string + flagAlias string + ) + + cmd := &cobra.Command{ + Use: "set", + Short: "Set a trust center alias", + Example: ` # Set an alias interactively + prb trust-center alias set --resource-id prbdoc_... + + # Set an alias non-interactively + prb trust-center alias set --resource-id prbdoc_... --alias privacy-policy`, + RunE: func(cmd *cobra.Command, args []string) error { + cfg, err := f.Config() + if err != nil { + return err + } + + host, hc, err := cfg.DefaultHost() + if err != nil { + return err + } + + client := api.NewClient( + host, + hc.Token, + "/api/console/v1/graphql", + cfg.HTTPTimeoutDuration(), + cmdutil.TokenRefreshOption(cfg, host, hc), + ) + + if f.IOStreams.IsInteractive() { + if flagResourceID == "" { + err := huh.NewInput(). + Title("Resource ID (document, file, or audit)"). + Value(&flagResourceID). + Run() + if err != nil { + return err + } + } + + if flagAlias == "" { + err := huh.NewInput(). + Title("Alias"). + Value(&flagAlias). + Run() + if err != nil { + return err + } + } + } + + if flagResourceID == "" { + return fmt.Errorf("resource ID is required; pass --resource-id or run interactively") + } + + if flagAlias == "" { + return fmt.Errorf("alias is required; pass --alias or run interactively") + } + + data, err := client.Do( + setMutation, + map[string]any{ + "input": map[string]any{ + "resourceId": flagResourceID, + "alias": flagAlias, + }, + }, + ) + if err != nil { + return err + } + + var resp setResponse + if err := json.Unmarshal(data, &resp); err != nil { + return fmt.Errorf("cannot parse response: %w", err) + } + + a := resp.SetTrustCenterAlias.Alias + _, _ = fmt.Fprintf( + f.IOStreams.Out, + "Set alias %q for resource %s\n", + a.Alias, + a.ResourceID, + ) + + return nil + }, + } + + cmd.Flags().StringVar(&flagResourceID, "resource-id", "", "Document, trust center file, or audit ID") + cmd.Flags().StringVar(&flagAlias, "alias", "", "Human-readable alias slug") + + return cmd +} diff --git a/pkg/cmd/trust-center/trust_center.go b/pkg/cmd/trust-center/trust_center.go index 681c9fe4b..d66b983d6 100644 --- a/pkg/cmd/trust-center/trust_center.go +++ b/pkg/cmd/trust-center/trust_center.go @@ -17,6 +17,7 @@ package trustcenter import ( "github.com/spf13/cobra" "go.probo.inc/probo/pkg/cmd/cmdutil" + "go.probo.inc/probo/pkg/cmd/trust-center/alias" "go.probo.inc/probo/pkg/cmd/trust-center/file" "go.probo.inc/probo/pkg/cmd/trust-center/reference" "go.probo.inc/probo/pkg/cmd/trust-center/update" @@ -33,6 +34,7 @@ func NewCmdTrustCenter(f *cmdutil.Factory) *cobra.Command { cmd.AddCommand(view.NewCmdView(f)) cmd.AddCommand(update.NewCmdUpdate(f)) cmd.AddCommand(reference.NewCmdReference(f)) + cmd.AddCommand(alias.NewCmdAlias(f)) cmd.AddCommand(file.NewCmdFile(f)) return cmd