diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1710de56..aacfa5bb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,6 +13,10 @@ jobs: name: Run tests runs-on: ubuntu-latest steps: + - uses: abhi1693/setup-browser@v0.3.4 + with: + browser: chrome + version: latest - uses: ory/ci/checkout@master - uses: actions/setup-go@v2 with: diff --git a/cmd/cloudx/accountexperience/accountexperience.go b/cmd/cloudx/accountexperience/accountexperience.go new file mode 100644 index 00000000..1ff80586 --- /dev/null +++ b/cmd/cloudx/accountexperience/accountexperience.go @@ -0,0 +1,69 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +package accountexperience + +import ( + "fmt" + "os" + + "os/exec" + + "github.com/pkg/browser" + "github.com/spf13/cobra" + + client "github.com/ory/cli/cmd/cloudx/client" + cloud "github.com/ory/client-go" + "github.com/ory/x/cmdx" +) + +func NewAccountExperienceOpenCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "account-experience [project-id]", + Args: cobra.MaximumNArgs(1), + Short: "Open Ory Account Experience Pages", + } + var pages = [5]string{"login", "registration", "recovery", "verification", "settings"} + for _, p := range pages { + cmd.AddCommand(NewAxCmd(p)) + } + + return cmd +} + +func NewAxCmd(cmd string) *cobra.Command { + return &cobra.Command{ + Use: cmd, + Short: "Open " + cmd + " page", + RunE: func(cmd *cobra.Command, args []string) error { + h, err := client.NewCommandHelper(cmd) + if err != nil { + return err + } + id, err := getSelectedProjectId(h, args) + if err != nil { + return cmdx.PrintOpenAPIError(cmd, err) + } + project, err := h.GetProject(id) + if err != nil { + return cmdx.PrintOpenAPIError(cmd, err) + } + return AxWrapper(cmd, project) + + }} +} + +func AxWrapper(cmd *cobra.Command, p *cloud.Project) error { + url := fmt.Sprintf("https://%s.projects.oryapis.com/ui/%s", p.GetSlug(), cmd.CalledAs()) + + err := browser.OpenURL(url) + if err != nil { + + // #nosec G204 - this is ok + if err := exec.Command("open", url); err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Unable to automatically open the %s page in your browser. Please open it manually!", cmd.CalledAs()) + } + } + + return nil +} diff --git a/cmd/cloudx/accountexperience/accountexperience_test.go b/cmd/cloudx/accountexperience/accountexperience_test.go new file mode 100644 index 00000000..7c097ffe --- /dev/null +++ b/cmd/cloudx/accountexperience/accountexperience_test.go @@ -0,0 +1,26 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +package accountexperience_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ory/cli/cmd/cloudx/testhelpers" +) + +var _, _, _, _, defaultProject, defaultCmd = testhelpers.CreateDefaultAssets() + +func TestOpenAXPages(t *testing.T) { + + t.Run("is able to open login page", func(t *testing.T) { + var pages = [5]string{"login", "registration", "recovery", "verification", "settings"} + for _, p := range pages { + _, _, err := defaultCmd.Exec(nil, "open", "account-experience", p, "--project", defaultProject) + require.NoError(t, err) + } + }) + +} diff --git a/cmd/cloudx/accountexperience/utils.go b/cmd/cloudx/accountexperience/utils.go new file mode 100644 index 00000000..e311737a --- /dev/null +++ b/cmd/cloudx/accountexperience/utils.go @@ -0,0 +1,24 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +package accountexperience + +import ( + "github.com/pkg/errors" + + "github.com/ory/cli/cmd/cloudx/client" +) + +var defaultProjectNotSetError = errors.New("no project was specified") + +func getSelectedProjectId(h *client.CommandHelper, args []string) (string, error) { + if len(args) == 0 { + if id := h.GetDefaultProjectID(); id == "" { + return "", defaultProjectNotSetError + } else { + return id, nil + } + } else { + return args[0], nil + } +} diff --git a/cmd/cloudx/open.go b/cmd/cloudx/open.go new file mode 100644 index 00000000..b51e48b0 --- /dev/null +++ b/cmd/cloudx/open.go @@ -0,0 +1,26 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +package cloudx + +import ( + "github.com/spf13/cobra" + + "github.com/ory/cli/cmd/cloudx/accountexperience" + "github.com/ory/cli/cmd/cloudx/client" + "github.com/ory/x/cmdx" +) + +func NewOpenCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "open", + Short: "Open Ory Account Experience Pages", + } + cmd.AddCommand(accountexperience.NewAccountExperienceOpenCmd()) + client.RegisterProjectFlag(cmd.PersistentFlags()) + client.RegisterConfigFlag(cmd.PersistentFlags()) + cmdx.RegisterNoiseFlags(cmd.PersistentFlags()) + client.RegisterYesFlag(cmd.PersistentFlags()) + + return cmd +} diff --git a/cmd/root.go b/cmd/root.go index 4749ed4b..b682c6d3 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -36,6 +36,7 @@ func NewRootCmd() *cobra.Command { cloudx.NewUseCmd(), cloudx.NewListCmd(), cloudx.NewImportCmd(), + cloudx.NewOpenCmd(), cloudx.NewPatchCmd(), cloudx.NewParseCmd(), cloudx.NewPerformCmd(), diff --git a/go.mod b/go.mod index f9c1d4ca..0274c7c0 100644 --- a/go.mod +++ b/go.mod @@ -231,6 +231,7 @@ require ( github.com/pborman/uuid v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/philhofer/fwd v1.1.1 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/profile v1.7.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect diff --git a/go.sum b/go.sum index 634074c0..4fc762be 100644 --- a/go.sum +++ b/go.sum @@ -1229,6 +1229,8 @@ github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1940,6 +1942,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=