From 56a8c005c23415b4c07cd61350c60996a343aa4d Mon Sep 17 00:00:00 2001 From: Michal Sokolowski <0michalsokolowski0@gmail.com> Date: Wed, 28 Aug 2024 14:32:19 +0200 Subject: [PATCH] refactor: Retrieve all stacks using searchStacks --- internal/cmd/stack/list.go | 48 +++++++++++++++++++++------- internal/cmd/stack/open_command.go | 18 ++++++++--- internal/cmd/stack/stack_selector.go | 8 ++--- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/internal/cmd/stack/list.go b/internal/cmd/stack/list.go index 4451853..1e040c6 100644 --- a/internal/cmd/stack/list.go +++ b/internal/cmd/stack/list.go @@ -1,9 +1,11 @@ package stack import ( + "context" "fmt" "strings" + "github.com/shurcooL/graphql" "github.com/spacelift-io/spacectl/client/structs" "github.com/spacelift-io/spacectl/internal/cmd" "github.com/urfave/cli/v2" @@ -28,7 +30,9 @@ func listStacks() cli.ActionFunc { } func listStacksJSON(ctx *cli.Context) error { - stacks, err := searchStacks(ctx.Context, structs.SearchInput{}) + stacks, err := searchAllStacks(ctx.Context, structs.SearchInput{ + First: graphql.NewInt(50), + }) if err != nil { return err } @@ -37,7 +41,8 @@ func listStacksJSON(ctx *cli.Context) error { } func listStacksTable(ctx *cli.Context) error { - stacks, err := searchStacks(ctx.Context, structs.SearchInput{ + stacks, err := searchAllStacks(ctx.Context, structs.SearchInput{ + First: graphql.NewInt(50), OrderBy: &structs.QueryOrder{ Field: "starred", Direction: "DESC", @@ -53,18 +58,18 @@ func listStacksTable(ctx *cli.Context) error { } tableData := [][]string{columns} - for _, stack := range stacks { + for _, s := range stacks { row := []string{ - stack.Name, - stack.ID, - cmd.HumanizeGitHash(stack.TrackedCommit.Hash), - stack.TrackedCommit.AuthorName, - stack.State, - stack.WorkerPool.Name, - stack.LockedBy, + s.Name, + s.ID, + cmd.HumanizeGitHash(s.TrackedCommit.Hash), + s.TrackedCommit.AuthorName, + s.State, + s.WorkerPool.Name, + s.LockedBy, } if ctx.Bool(flagShowLabels.Name) { - row = append(row, strings.Join(stack.Labels, ", ")) + row = append(row, strings.Join(s.Labels, ", ")) } tableData = append(tableData, row) @@ -73,6 +78,27 @@ func listStacksTable(ctx *cli.Context) error { return cmd.OutputTable(tableData, true) } +func searchAllStacks(ctx context.Context, input structs.SearchInput) ([]stack, error) { + out := []stack{} + + for { + result, err := searchStacks(ctx, input) + if err != nil { + return nil, err + } + + out = append(out, result.Stacks...) + + if !result.PageInfo.HasNextPage { + break + } else { + input.After = graphql.NewString(graphql.String(result.PageInfo.EndCursor)) + } + } + + return out, nil +} + type stack struct { ID string `graphql:"id" json:"id,omitempty"` Administrative bool `graphql:"administrative" json:"administrative,omitempty"` diff --git a/internal/cmd/stack/open_command.go b/internal/cmd/stack/open_command.go index 9f4e755..eec44e8 100644 --- a/internal/cmd/stack/open_command.go +++ b/internal/cmd/stack/open_command.go @@ -163,7 +163,12 @@ type stackSearchParams struct { branch *string } -func searchStacks(ctx context.Context, input structs.SearchInput) ([]stack, error) { +type searchStacksResult struct { + Stacks []stack + PageInfo structs.PageInfo +} + +func searchStacks(ctx context.Context, input structs.SearchInput) (searchStacksResult, error) { var query struct { SearchStacksOutput struct { Edges []struct { @@ -179,13 +184,16 @@ func searchStacks(ctx context.Context, input structs.SearchInput) ([]stack, erro map[string]interface{}{"input": input}, graphql.WithHeader("Spacelift-GraphQL-Query", "StacksPage"), ); err != nil { - return nil, errors.Wrap(err, "failed search for stacks") + return searchStacksResult{}, errors.Wrap(err, "failed search for stacks") } - result := make([]stack, 0) + stacks := make([]stack, 0) for _, q := range query.SearchStacksOutput.Edges { - result = append(result, q.Node) + stacks = append(stacks, q.Node) } - return result, nil + return searchStacksResult{ + Stacks: stacks, + PageInfo: query.SearchStacksOutput.PageInfo, + }, nil } diff --git a/internal/cmd/stack/stack_selector.go b/internal/cmd/stack/stack_selector.go index 4335ce9..02c4f2d 100644 --- a/internal/cmd/stack/stack_selector.go +++ b/internal/cmd/stack/stack_selector.go @@ -124,16 +124,16 @@ func findAndSelectStack(ctx context.Context, p *stackSearchParams, forcePrompt b Predicates: &conditions, } - stacks, err := searchStacks(ctx, input) + result, err := searchStacks(ctx, input) if err != nil { return nil, err } items := []string{} found := map[string]stack{} - for _, stack := range stacks { - items = append(items, stack.Name) - found[stack.Name] = stack + for _, s := range result.Stacks { + items = append(items, s.Name) + found[s.Name] = s } if len(found) == 0 {