Skip to content

Commit

Permalink
refactor: Retrieve all stacks using searchStacks
Browse files Browse the repository at this point in the history
  • Loading branch information
0michalsokolowski0 committed Aug 28, 2024
1 parent 2d7797c commit 56a8c00
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 20 deletions.
48 changes: 37 additions & 11 deletions internal/cmd/stack/list.go
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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
}
Expand All @@ -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",
Expand All @@ -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)
Expand All @@ -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"`
Expand Down
18 changes: 13 additions & 5 deletions internal/cmd/stack/open_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}
8 changes: 4 additions & 4 deletions internal/cmd/stack/stack_selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit 56a8c00

Please sign in to comment.