From c85678de8a80e3661aa7b66e44a8845e49f860dd Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Thu, 9 Sep 2021 00:38:59 +0200 Subject: [PATCH 1/9] Poc for paginated vaults list --- cmd/baseline/participants/participants_invite.go | 2 +- cmd/common/baseline.go | 2 +- cmd/common/prompt.go | 2 +- cmd/vaults/vaults_list.go | 7 ++++--- go.mod | 2 +- go.sum | 4 ++-- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/cmd/baseline/participants/participants_invite.go b/cmd/baseline/participants/participants_invite.go index 7e62bf4..2ced709 100644 --- a/cmd/baseline/participants/participants_invite.go +++ b/cmd/baseline/participants/participants_invite.go @@ -52,7 +52,7 @@ func inviteParticipantRun(cmd *cobra.Command, args []string) { common.AuthorizeApplicationContext() common.AuthorizeOrganizationContext(false) - vaults, err := vault.ListVaults(common.OrganizationAccessToken, map[string]interface{}{ + vaults, _, err := vault.ListVaults(common.OrganizationAccessToken, map[string]interface{}{ "organization_id": common.OrganizationID, }) if err != nil { diff --git a/cmd/common/baseline.go b/cmd/common/baseline.go index 20dfa92..9b88deb 100644 --- a/cmd/common/baseline.go +++ b/cmd/common/baseline.go @@ -211,7 +211,7 @@ func RequireOrganizationVault() { } // FIXME-- parameterize with --vault or similar? - vaults, err := vault.ListVaults(OrganizationAccessToken, map[string]interface{}{ + vaults, _, err := vault.ListVaults(OrganizationAccessToken, map[string]interface{}{ "organization_id": OrganizationID, }) if err != nil { diff --git a/cmd/common/prompt.go b/cmd/common/prompt.go index 05b5e3a..619fb53 100644 --- a/cmd/common/prompt.go +++ b/cmd/common/prompt.go @@ -243,7 +243,7 @@ func RequireVault() error { } opts := make([]string, 0) - vaults, _ := vault.ListVaults(RequireAPIToken(), map[string]interface{}{}) + vaults, _, _ := vault.ListVaults(RequireAPIToken(), map[string]interface{}{}) for _, vlt := range vaults { opts = append(opts, *vlt.Name) } diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index 4255724..c5dab84 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -37,13 +37,14 @@ func listVaultsRun(cmd *cobra.Command, args []string) { if common.OrganizationID != "" { params["organization_id"] = common.OrganizationID } - resp, err := provide.ListVaults(token, params) + results, resp, err := provide.ListVaults(token, params) if err != nil { log.Printf("failed to retrieve vaults list; %s", err.Error()) os.Exit(1) } - for i := range resp { - vlt := resp[i] + fmt.Printf("Showing record(s) 1-%d out of %s record(s)\n", len(results), resp.TotalCount) + for i := range results { + vlt := results[i] result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } diff --git a/go.mod b/go.mod index d995ab4..e047816 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/ory/viper v1.7.5 - github.com/provideplatform/provide-go v0.0.0-20210823052255-cc727526a9b7 + github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac github.com/rivo/uniseg v0.2.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/spf13/cobra v1.1.3 diff --git a/go.sum b/go.sum index ca43e5f..e0f5b7e 100644 --- a/go.sum +++ b/go.sum @@ -412,8 +412,8 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/provideplatform/provide-go v0.0.0-20210823052255-cc727526a9b7 h1:BGU3eCEsPdEQ9OOcwlyPtNRW+V6l07lInGizLcymT5I= -github.com/provideplatform/provide-go v0.0.0-20210823052255-cc727526a9b7/go.mod h1:q0/Q8KaZxYg84rdwBIIE7ZwHluzM5zw7zJJoJOqAbzg= +github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac h1:Qp0qRxdckwZXhFkXaGIv8DSWW88Vn/tOFPiOFZXDUDQ= +github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac/go.mod h1:q0/Q8KaZxYg84rdwBIIE7ZwHluzM5zw7zJJoJOqAbzg= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= From 4df939baa3d9467effc25246487b5b50703b21df Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Thu, 9 Sep 2021 01:06:56 +0200 Subject: [PATCH 2/9] Modify pagination printing logic --- cmd/vaults/vaults_list.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index c5dab84..d5cd4ce 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -42,7 +42,20 @@ func listVaultsRun(cmd *cobra.Command, args []string) { log.Printf("failed to retrieve vaults list; %s", err.Error()) os.Exit(1) } - fmt.Printf("Showing record(s) 1-%d out of %s record(s)\n", len(results), resp.TotalCount) + // TODO: better conditions logic here... + firstRecordCount := 1 + if page > 1 { + firstRecordCount = int(rpp) * int(page-1) + } + secondRecordCount := firstRecordCount + len(results) + if firstRecordCount == 1 { + secondRecordCount = secondRecordCount - 1 + } + if len(results) != 0 { + fmt.Printf("Showing record(s) %d-%d out of %s record(s)\n", firstRecordCount, secondRecordCount, resp.TotalCount) + } else { + fmt.Println("No more records found") + } for i := range results { vlt := results[i] result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) From ff91b200d4cf90daf762cac0f5b73e0cad05d488 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Thu, 9 Sep 2021 01:49:05 +0200 Subject: [PATCH 3/9] Prototype prev and next page prompt basic use case for vaults list --- cmd/vaults/vaults_list.go | 5 ++++- cmd/vaults/vaults_prompt.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index d5cd4ce..0d018db 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "strconv" "github.com/provideplatform/provide-cli/cmd/common" provide "github.com/provideplatform/provide-go/api/vault" @@ -42,6 +43,7 @@ func listVaultsRun(cmd *cobra.Command, args []string) { log.Printf("failed to retrieve vaults list; %s", err.Error()) os.Exit(1) } + totalCount, _ := strconv.Atoi(resp.TotalCount) // TODO: better conditions logic here... firstRecordCount := 1 if page > 1 { @@ -52,7 +54,7 @@ func listVaultsRun(cmd *cobra.Command, args []string) { secondRecordCount = secondRecordCount - 1 } if len(results) != 0 { - fmt.Printf("Showing record(s) %d-%d out of %s record(s)\n", firstRecordCount, secondRecordCount, resp.TotalCount) + fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", firstRecordCount, secondRecordCount, totalCount) } else { fmt.Println("No more records found") } @@ -61,6 +63,7 @@ func listVaultsRun(cmd *cobra.Command, args []string) { result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } + paginationPrompt(cmd, args, "", totalCount) } func init() { diff --git a/cmd/vaults/vaults_prompt.go b/cmd/vaults/vaults_prompt.go index 2b0a8d8..c11191a 100644 --- a/cmd/vaults/vaults_prompt.go +++ b/cmd/vaults/vaults_prompt.go @@ -13,6 +13,9 @@ const promptStepList = "List" var emptyPromptArgs = []string{promptStepInit, promptStepList} var emptyPromptLabel = "What would you like to do" +var prevPage = "<< Prev Page" +var nextPage = ">> Next Page" + // General Endpoints func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { switch step := currentStep; step { @@ -50,3 +53,28 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { generalPrompt(cmd, args, result) } } + +func paginationPrompt(cmd *cobra.Command, args []string, currentStep string, totalCount int) { + switch step := currentStep; step { + case prevPage: + { + page = page - 1 + listVaultsRun(cmd, args) + } + case nextPage: + { + page = page + 1 + listVaultsRun(cmd, args) + } + case "": + prompts := []string{} + if int(page*rpp) < totalCount { + prompts = append(prompts, nextPage) + } + if page > 1 { + prompts = append(prompts, prevPage) + } + result := common.SelectInput(prompts, "") + paginationPrompt(cmd, args, result, totalCount) + } +} From 3b8d9be737611cac340e57ac9e826d1cae130914 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Thu, 9 Sep 2021 01:59:16 +0200 Subject: [PATCH 4/9] Fix edge cases with currentCount --- cmd/vaults/vaults_list.go | 2 +- cmd/vaults/vaults_prompt.go | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index 0d018db..b832ea6 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -63,7 +63,7 @@ func listVaultsRun(cmd *cobra.Command, args []string) { result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } - paginationPrompt(cmd, args, "", totalCount) + paginationPrompt(cmd, args, "", secondRecordCount, totalCount) } func init() { diff --git a/cmd/vaults/vaults_prompt.go b/cmd/vaults/vaults_prompt.go index c11191a..63b681b 100644 --- a/cmd/vaults/vaults_prompt.go +++ b/cmd/vaults/vaults_prompt.go @@ -54,7 +54,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { } } -func paginationPrompt(cmd *cobra.Command, args []string, currentStep string, totalCount int) { +func paginationPrompt(cmd *cobra.Command, args []string, currentStep string, currentCount, totalCount int) { switch step := currentStep; step { case prevPage: { @@ -68,13 +68,16 @@ func paginationPrompt(cmd *cobra.Command, args []string, currentStep string, tot } case "": prompts := []string{} - if int(page*rpp) < totalCount { + if int(page*rpp) > totalCount && page == 1 { + return + } + if currentCount < totalCount { prompts = append(prompts, nextPage) } if page > 1 { prompts = append(prompts, prevPage) } result := common.SelectInput(prompts, "") - paginationPrompt(cmd, args, result, totalCount) + paginationPrompt(cmd, args, result, currentCount, totalCount) } } From 7fb2e5e005eb85c49d63aabbd14cdf9d11ddb8ee Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Fri, 10 Sep 2021 00:39:47 +0200 Subject: [PATCH 5/9] Add new provide-go version and refactor pagination prompt (wip) --- cmd/accounts/accounts_list.go | 2 +- cmd/api_tokens/api_tokens_list.go | 2 +- cmd/applications/applications_list.go | 2 +- .../participants/participants_invite.go | 6 +- .../participants/participants_list.go | 4 +- cmd/baseline/stack/stack_start.go | 4 +- cmd/baseline/workflows/messages/send.go | 2 +- cmd/baseline/workgroups/workgroup_list.go | 2 +- cmd/common/baseline.go | 6 +- cmd/common/global.go | 16 ++++++ cmd/common/prompt.go | 56 ++++++++++++++++--- cmd/connectors/connectors_list.go | 2 +- cmd/contracts/contracts_list.go | 2 +- cmd/networks/networks_list.go | 2 +- cmd/organizations/organizations_list.go | 2 +- cmd/vaults/keys/keys_list.go | 2 +- cmd/vaults/vaults_list.go | 24 +++----- cmd/vaults/vaults_prompt.go | 31 ---------- cmd/wallets/wallets_list.go | 2 +- go.mod | 2 +- go.sum | 2 + 21 files changed, 97 insertions(+), 76 deletions(-) diff --git a/cmd/accounts/accounts_list.go b/cmd/accounts/accounts_list.go index c0c0e04..340c313 100644 --- a/cmd/accounts/accounts_list.go +++ b/cmd/accounts/accounts_list.go @@ -29,7 +29,7 @@ func listAccounts(cmd *cobra.Command, args []string) { if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, err := provide.ListAccounts(token, params) + resp, _, err := provide.ListAccounts(token, params) if err != nil { log.Printf("Failed to retrieve accounts list; %s", err.Error()) os.Exit(1) diff --git a/cmd/api_tokens/api_tokens_list.go b/cmd/api_tokens/api_tokens_list.go index ac92595..7d0fc7b 100644 --- a/cmd/api_tokens/api_tokens_list.go +++ b/cmd/api_tokens/api_tokens_list.go @@ -30,7 +30,7 @@ func listAPITokens(cmd *cobra.Command, args []string) { if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, err := provide.ListTokens(token, params) + resp, _, err := provide.ListTokens(token, params) if err != nil { log.Printf("Failed to retrieve API tokens list; %s", err.Error()) os.Exit(1) diff --git a/cmd/applications/applications_list.go b/cmd/applications/applications_list.go index ef950bc..0dbcc4c 100644 --- a/cmd/applications/applications_list.go +++ b/cmd/applications/applications_list.go @@ -27,7 +27,7 @@ func listApplications(cmd *cobra.Command, args []string) { "page": fmt.Sprintf("%d", page), "rpp": fmt.Sprintf("%d", rpp), } - applications, err := provide.ListApplications(token, params) + applications, _, err := provide.ListApplications(token, params) if err != nil { log.Printf("Failed to retrieve applications list; %s", err.Error()) os.Exit(1) diff --git a/cmd/baseline/participants/participants_invite.go b/cmd/baseline/participants/participants_invite.go index 2ced709..570aa22 100644 --- a/cmd/baseline/participants/participants_invite.go +++ b/cmd/baseline/participants/participants_invite.go @@ -60,7 +60,7 @@ func inviteParticipantRun(cmd *cobra.Command, args []string) { os.Exit(1) } - keys, err := vault.ListKeys(common.OrganizationAccessToken, vaults[0].ID.String(), map[string]interface{}{ + keys, _, err := vault.ListKeys(common.OrganizationAccessToken, vaults[0].ID.String(), map[string]interface{}{ "spec": "secp256k1", }) if err != nil { @@ -68,7 +68,7 @@ func inviteParticipantRun(cmd *cobra.Command, args []string) { os.Exit(1) } - contracts, _ := nchain.ListContracts(common.ApplicationAccessToken, map[string]interface{}{ + contracts, _, _ := nchain.ListContracts(common.ApplicationAccessToken, map[string]interface{}{ "type": "organization-registry", }) if err != nil { @@ -115,7 +115,7 @@ func inviteParticipantRun(cmd *cobra.Command, args []string) { } func vendJWT(vaultID string, params map[string]interface{}) string { - keys, err := vault.ListKeys(common.OrganizationAccessToken, vaultID, map[string]interface{}{ + keys, _, err := vault.ListKeys(common.OrganizationAccessToken, vaultID, map[string]interface{}{ "spec": "RSA-4096", }) if err != nil { diff --git a/cmd/baseline/participants/participants_list.go b/cmd/baseline/participants/participants_list.go index 0fc4c59..bac2181 100644 --- a/cmd/baseline/participants/participants_list.go +++ b/cmd/baseline/participants/participants_list.go @@ -28,7 +28,7 @@ func listParticipantsRun(cmd *cobra.Command, args []string) { common.AuthorizeApplicationContext() common.AuthorizeOrganizationContext(false) - participants, err := ident.ListApplicationOrganizations(common.OrganizationAccessToken, common.ApplicationID, map[string]interface{}{ + participants, _, err := ident.ListApplicationOrganizations(common.OrganizationAccessToken, common.ApplicationID, map[string]interface{}{ "type": "baseline", "page": fmt.Sprintf("%d", page), "rpp": fmt.Sprintf("%d", rpp), @@ -38,7 +38,7 @@ func listParticipantsRun(cmd *cobra.Command, args []string) { os.Exit(1) } - invitations, err := ident.ListApplicationInvitations(common.ApplicationAccessToken, common.ApplicationID, map[string]interface{}{}) + invitations, _, err := ident.ListApplicationInvitations(common.ApplicationAccessToken, common.ApplicationID, map[string]interface{}{}) if err != nil { // log.Printf("failed to retrieve invited baseline workgroup participants; %s", err.Error()) // os.Exit(1) diff --git a/cmd/baseline/stack/stack_start.go b/cmd/baseline/stack/stack_start.go index 71f5120..671b57c 100644 --- a/cmd/baseline/stack/stack_start.go +++ b/cmd/baseline/stack/stack_start.go @@ -442,7 +442,7 @@ func authorizeWorkgroupContext() { os.Exit(1) } - contracts, err := nchain.ListContracts(workgroupAccessToken, map[string]interface{}{ + contracts, _, err := nchain.ListContracts(workgroupAccessToken, map[string]interface{}{ "type": "organization-registry", }) if err != nil { @@ -553,7 +553,7 @@ func applyFlags() { // HACK if jwtSignerPublicKey == "" { - keys, err := vault.ListKeys(common.OrganizationAccessToken, common.VaultID, map[string]interface{}{ + keys, _, err := vault.ListKeys(common.OrganizationAccessToken, common.VaultID, map[string]interface{}{ "spec": "RSA-4096", }) if err != nil { diff --git a/cmd/baseline/workflows/messages/send.go b/cmd/baseline/workflows/messages/send.go index 3e23bc4..39268e4 100644 --- a/cmd/baseline/workflows/messages/send.go +++ b/cmd/baseline/workflows/messages/send.go @@ -53,7 +53,7 @@ func sendMessageRun(cmd *cobra.Command, args []string) { if recipients != "" { _recipients := make([]*baseline.Participant, 0) for _, id := range strings.Split(recipients, ",") { - orgs, err := ident.ListApplicationOrganizations(common.ApplicationAccessToken, common.ApplicationID, map[string]interface{}{ + orgs, _, err := ident.ListApplicationOrganizations(common.ApplicationAccessToken, common.ApplicationID, map[string]interface{}{ "organization_id": id, }) if err != nil { diff --git a/cmd/baseline/workgroups/workgroup_list.go b/cmd/baseline/workgroups/workgroup_list.go index 576b1fc..2a40287 100644 --- a/cmd/baseline/workgroups/workgroup_list.go +++ b/cmd/baseline/workgroups/workgroup_list.go @@ -26,7 +26,7 @@ func listWorkgroups(cmd *cobra.Command, args []string) { func listWorkgroupsRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() - applications, err := ident.ListApplications(token, map[string]interface{}{ + applications, _, err := ident.ListApplications(token, map[string]interface{}{ "type": "baseline", "page": fmt.Sprintf("%d", page), "rpp": fmt.Sprintf("%d", rpp), diff --git a/cmd/common/baseline.go b/cmd/common/baseline.go index 9b88deb..83175dd 100644 --- a/cmd/common/baseline.go +++ b/cmd/common/baseline.go @@ -186,7 +186,7 @@ func RegisterWorkgroupOrganization(applicationID string) { "organization_id": OrganizationID, }) if err != nil { - orgs, err := ident.ListApplicationOrganizations(ApplicationAccessToken, applicationID, map[string]interface{}{ + orgs, _, err := ident.ListApplicationOrganizations(ApplicationAccessToken, applicationID, map[string]interface{}{ "organization_id": OrganizationID, }) if err == nil { @@ -245,7 +245,7 @@ func RequireOrganizationKeypair(spec string) (*vault.Key, error) { } // FIXME-- parameterize each key i.e. --secp256k1-key or similar? - keys, err := vault.ListKeys(OrganizationAccessToken, VaultID, map[string]interface{}{ + keys, _, err := vault.ListKeys(OrganizationAccessToken, VaultID, map[string]interface{}{ "spec": spec, }) if err != nil { @@ -285,7 +285,7 @@ func RequireContract(contractID, contractType *string, printCreationTxLink bool) if contractID != nil { contract, err = nchain.GetContractDetails(ApplicationAccessToken, *contractID, map[string]interface{}{}) } else if contractType != nil { - contracts, _ := nchain.ListContracts(ApplicationAccessToken, map[string]interface{}{ + contracts, _, _ := nchain.ListContracts(ApplicationAccessToken, map[string]interface{}{ "type": contractType, }) if len(contracts) > 0 { diff --git a/cmd/common/global.go b/cmd/common/global.go index 36ecf00..a739e4f 100644 --- a/cmd/common/global.go +++ b/cmd/common/global.go @@ -94,3 +94,19 @@ func IsReleaseRepositoryContext() bool { return false } + +func GetAndPrintCurrentCount(totalCount, rpp, page, resultsLength int) int { + firstRecordIndex := 1 + currentCount := resultsLength + if page > 1 { + firstRecordIndex = rpp * (page - 1) + currentCount += firstRecordIndex + } + if resultsLength != 0 { + fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", firstRecordIndex, currentCount, totalCount) + } else { + fmt.Println("No more records found") + } + + return currentCount +} diff --git a/cmd/common/prompt.go b/cmd/common/prompt.go index 619fb53..00f42c8 100644 --- a/cmd/common/prompt.go +++ b/cmd/common/prompt.go @@ -28,6 +28,18 @@ const requireWorkgroupSelectLabel = "Select a workgroup" var commands map[string]*cobra.Command +var prevPage = "<< Prev Page" +var nextPage = ">> Next Page" + +// TODO: just a tmp step for now, idea is to pass this info to generic fn without fn ends up having lot of params +type PaginationPromptInfo struct { + Page *uint64 + IsFirstPage bool + IsLastPage bool + AreAllRecordsReturned bool + RunPageCmd func(cmd *cobra.Command, args []string) +} + func normaliseCmd(cmd *cobra.Command, args []string) (string, string) { flag, _ := regexp.Compile("\\[(.*)") r, _ := regexp.Compile("\\--(.*)") @@ -81,7 +93,7 @@ func RequireApplication() error { } opts := make([]string, 0) - apps, _ := ident.ListApplications(RequireUserAccessToken(), map[string]interface{}{}) + apps, _, _ := ident.ListApplications(RequireUserAccessToken(), map[string]interface{}{}) for _, app := range apps { opts = append(opts, *app.Name) } @@ -108,7 +120,7 @@ func RequireWorkgroup() error { } opts := make([]string, 0) - apps, _ := ident.ListApplications(RequireUserAccessToken(), map[string]interface{}{ + apps, _, _ := ident.ListApplications(RequireUserAccessToken(), map[string]interface{}{ "type": "baseline", }) for _, app := range apps { @@ -136,7 +148,7 @@ func RequireConnector(params map[string]interface{}) error { } opts := make([]string, 0) - connectors, _ := nchain.ListConnectors(RequireAPIToken(), params) + connectors, _, _ := nchain.ListConnectors(RequireAPIToken(), params) for _, connector := range connectors { opts = append(opts, *connector.Name) } @@ -162,7 +174,7 @@ func RequireNetwork() error { } opts := make([]string, 0) - networks, _ := nchain.ListNetworks(RequireAPIToken(), map[string]interface{}{}) + networks, _, _ := nchain.ListNetworks(RequireAPIToken(), map[string]interface{}{}) for _, network := range networks { opts = append(opts, *network.Name) } @@ -188,7 +200,7 @@ func RequirePublicNetwork() error { } opts := make([]string, 0) - networks, _ := nchain.ListNetworks(RequireAPIToken(), map[string]interface{}{ + networks, _, _ := nchain.ListNetworks(RequireAPIToken(), map[string]interface{}{ "public": "true", }) for _, network := range networks { @@ -216,7 +228,7 @@ func RequireOrganization() error { } opts := make([]string, 0) - orgs, _ := ident.ListOrganizations(RequireUserAccessToken(), map[string]interface{}{}) + orgs, _, _ := ident.ListOrganizations(RequireUserAccessToken(), map[string]interface{}{}) for _, org := range orgs { opts = append(opts, *org.Name) } @@ -269,7 +281,7 @@ func RequireAccount(params map[string]interface{}) error { } opts := make([]string, 0) - accounts, _ := nchain.ListAccounts(RequireAPIToken(), params) + accounts, _, _ := nchain.ListAccounts(RequireAPIToken(), params) for _, acct := range accounts { opts = append(opts, *acct.PublicKey) } @@ -295,7 +307,7 @@ func RequireWallet() error { } opts := make([]string, 0) - wallets, _ := nchain.ListWallets(RequireAPIToken(), map[string]interface{}{}) + wallets, _, _ := nchain.ListWallets(RequireAPIToken(), map[string]interface{}{}) for _, wallet := range wallets { opts = append(opts, *wallet.PublicKey) } @@ -426,3 +438,31 @@ func PromptPagination(paginate bool, page uint64, rpp uint64) (uint64, uint64) { return page, rpp } + +func AutoPromptPagination(cmd *cobra.Command, args []string, currentStep string, promptInfo *PaginationPromptInfo) { + switch step := currentStep; step { + case prevPage: + { + *promptInfo.Page = *promptInfo.Page - 1 + promptInfo.RunPageCmd(cmd, args) + } + case nextPage: + { + *promptInfo.Page = *promptInfo.Page + 1 + promptInfo.RunPageCmd(cmd, args) + } + case "": + prompts := []string{} + if promptInfo.AreAllRecordsReturned { + return + } + if !promptInfo.IsLastPage { + prompts = append(prompts, nextPage) + } + if !promptInfo.IsFirstPage { + prompts = append(prompts, prevPage) + } + result := SelectInput(prompts, "") + AutoPromptPagination(cmd, args, result, promptInfo) + } +} diff --git a/cmd/connectors/connectors_list.go b/cmd/connectors/connectors_list.go index f3a054d..29c206a 100644 --- a/cmd/connectors/connectors_list.go +++ b/cmd/connectors/connectors_list.go @@ -31,7 +31,7 @@ func listConnectors(cmd *cobra.Command, args []string) { if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - connectors, err := provide.ListConnectors(token, params) + connectors, _, err := provide.ListConnectors(token, params) if err != nil { log.Printf("Failed to retrieve connectors list; %s", err.Error()) os.Exit(1) diff --git a/cmd/contracts/contracts_list.go b/cmd/contracts/contracts_list.go index 6132e05..f487327 100644 --- a/cmd/contracts/contracts_list.go +++ b/cmd/contracts/contracts_list.go @@ -30,7 +30,7 @@ func listContracts(cmd *cobra.Command, args []string) { if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - contracts, err := provide.ListContracts(token, params) + contracts, _, err := provide.ListContracts(token, params) if err != nil { log.Printf("Failed to retrieve contracts list; %s", err.Error()) os.Exit(1) diff --git a/cmd/networks/networks_list.go b/cmd/networks/networks_list.go index 6e4b54a..0234f9c 100644 --- a/cmd/networks/networks_list.go +++ b/cmd/networks/networks_list.go @@ -32,7 +32,7 @@ func listNetworks(cmd *cobra.Command, args []string) { if public { params["public"] = "true" } - networks, err := provide.ListNetworks(token, params) + networks, _, err := provide.ListNetworks(token, params) if err != nil { log.Printf("Failed to retrieve networks list; %s", err.Error()) os.Exit(1) diff --git a/cmd/organizations/organizations_list.go b/cmd/organizations/organizations_list.go index 31faad1..06f6155 100644 --- a/cmd/organizations/organizations_list.go +++ b/cmd/organizations/organizations_list.go @@ -31,7 +31,7 @@ func listOrganizationsRun(cmd *cobra.Command, args []string) { "page": fmt.Sprintf("%d", page), "rpp": fmt.Sprintf("%d", rpp), } - organizations, err := provide.ListOrganizations(token, params) + organizations, _, err := provide.ListOrganizations(token, params) if err != nil { log.Printf("Failed to retrieve organizations list; %s", err.Error()) os.Exit(1) diff --git a/cmd/vaults/keys/keys_list.go b/cmd/vaults/keys/keys_list.go index 2302670..252cdd4 100644 --- a/cmd/vaults/keys/keys_list.go +++ b/cmd/vaults/keys/keys_list.go @@ -37,7 +37,7 @@ func listKeysRun(cmd *cobra.Command, args []string) { if common.OrganizationID != "" { params["organization_id"] = common.OrganizationID } - resp, err := vault.ListKeys(token, common.VaultID, params) + resp, _, err := vault.ListKeys(token, common.VaultID, params) if err != nil { log.Printf("failed to retrieve keys list; %s", err.Error()) os.Exit(1) diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index b832ea6..b5d2d6e 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -44,26 +44,20 @@ func listVaultsRun(cmd *cobra.Command, args []string) { os.Exit(1) } totalCount, _ := strconv.Atoi(resp.TotalCount) - // TODO: better conditions logic here... - firstRecordCount := 1 - if page > 1 { - firstRecordCount = int(rpp) * int(page-1) - } - secondRecordCount := firstRecordCount + len(results) - if firstRecordCount == 1 { - secondRecordCount = secondRecordCount - 1 - } - if len(results) != 0 { - fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", firstRecordCount, secondRecordCount, totalCount) - } else { - fmt.Println("No more records found") - } + currentCount := common.GetAndPrintCurrentCount(totalCount, int(rpp), int(page), len(results)) for i := range results { vlt := results[i] result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } - paginationPrompt(cmd, args, "", secondRecordCount, totalCount) + promptInfo := &common.PaginationPromptInfo{ + IsFirstPage: page == 1, + IsLastPage: currentCount >= totalCount, + AreAllRecordsReturned: int(page*rpp) > totalCount && page == 1, + Page: &page, + RunPageCmd: listVaultsRun, + } + common.AutoPromptPagination(cmd, args, "", promptInfo) } func init() { diff --git a/cmd/vaults/vaults_prompt.go b/cmd/vaults/vaults_prompt.go index 63b681b..2b0a8d8 100644 --- a/cmd/vaults/vaults_prompt.go +++ b/cmd/vaults/vaults_prompt.go @@ -13,9 +13,6 @@ const promptStepList = "List" var emptyPromptArgs = []string{promptStepInit, promptStepList} var emptyPromptLabel = "What would you like to do" -var prevPage = "<< Prev Page" -var nextPage = ">> Next Page" - // General Endpoints func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { switch step := currentStep; step { @@ -53,31 +50,3 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { generalPrompt(cmd, args, result) } } - -func paginationPrompt(cmd *cobra.Command, args []string, currentStep string, currentCount, totalCount int) { - switch step := currentStep; step { - case prevPage: - { - page = page - 1 - listVaultsRun(cmd, args) - } - case nextPage: - { - page = page + 1 - listVaultsRun(cmd, args) - } - case "": - prompts := []string{} - if int(page*rpp) > totalCount && page == 1 { - return - } - if currentCount < totalCount { - prompts = append(prompts, nextPage) - } - if page > 1 { - prompts = append(prompts, prevPage) - } - result := common.SelectInput(prompts, "") - paginationPrompt(cmd, args, result, currentCount, totalCount) - } -} diff --git a/cmd/wallets/wallets_list.go b/cmd/wallets/wallets_list.go index 89e1cf9..e2c2370 100644 --- a/cmd/wallets/wallets_list.go +++ b/cmd/wallets/wallets_list.go @@ -34,7 +34,7 @@ func listWalletsRun(cmd *cobra.Command, args []string) { if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, err := provide.ListWallets(token, params) + resp, _, err := provide.ListWallets(token, params) if err != nil { log.Printf("Failed to retrieve wallets list; %s", err.Error()) os.Exit(1) diff --git a/go.mod b/go.mod index e047816..cca92cf 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/ory/viper v1.7.5 - github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac + github.com/provideplatform/provide-go v0.0.0-20210909173623-7649d760db58 github.com/rivo/uniseg v0.2.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/spf13/cobra v1.1.3 diff --git a/go.sum b/go.sum index e0f5b7e..ef911d8 100644 --- a/go.sum +++ b/go.sum @@ -414,6 +414,8 @@ github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac h1:Qp0qRxdckwZXhFkXaGIv8DSWW88Vn/tOFPiOFZXDUDQ= github.com/provideplatform/provide-go v0.0.0-20210908223451-d958a55409ac/go.mod h1:q0/Q8KaZxYg84rdwBIIE7ZwHluzM5zw7zJJoJOqAbzg= +github.com/provideplatform/provide-go v0.0.0-20210909173623-7649d760db58 h1:3fZLegdok4AX+qzehOej0q79rOhhXMEcXih7K3cbOio= +github.com/provideplatform/provide-go v0.0.0-20210909173623-7649d760db58/go.mod h1:q0/Q8KaZxYg84rdwBIIE7ZwHluzM5zw7zJJoJOqAbzg= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= From 31c34d7e78052acaf33184a71c5664cca7128133 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Sun, 12 Sep 2021 01:17:23 +0200 Subject: [PATCH 6/9] Add pagination and prompt structs and refactor vaults auto prompt --- cmd/common/global.go | 16 ------------ cmd/common/pagination.go | 51 +++++++++++++++++++++++++++++++++++++++ cmd/common/prompt.go | 33 ++++++++++++------------- cmd/vaults/vaults_list.go | 30 ++++++++++------------- 4 files changed, 79 insertions(+), 51 deletions(-) create mode 100644 cmd/common/pagination.go diff --git a/cmd/common/global.go b/cmd/common/global.go index a739e4f..36ecf00 100644 --- a/cmd/common/global.go +++ b/cmd/common/global.go @@ -94,19 +94,3 @@ func IsReleaseRepositoryContext() bool { return false } - -func GetAndPrintCurrentCount(totalCount, rpp, page, resultsLength int) int { - firstRecordIndex := 1 - currentCount := resultsLength - if page > 1 { - firstRecordIndex = rpp * (page - 1) - currentCount += firstRecordIndex - } - if resultsLength != 0 { - fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", firstRecordIndex, currentCount, totalCount) - } else { - fmt.Println("No more records found") - } - - return currentCount -} diff --git a/cmd/common/pagination.go b/cmd/common/pagination.go new file mode 100644 index 0000000..5ec616b --- /dev/null +++ b/cmd/common/pagination.go @@ -0,0 +1,51 @@ +package common + +import ( + "fmt" + "strconv" +) + +type Pagination struct { + Page int + Rpp int + CurrentCount int + TotalCount int +} + +func (p *Pagination) IsFirstPage() bool { + return p.Page == 1 +} + +func (p *Pagination) IsLastPage() bool { + return p.CurrentCount >= p.TotalCount +} + +func (p *Pagination) AreAllRecordsReturned() bool { + return p.Page*p.Rpp > p.TotalCount && p.Page == 1 +} + +func (p *Pagination) NextPage() { + p.Page++ +} + +func (p *Pagination) PrevPage() { + p.Page-- +} + +func (p *Pagination) UpdateCountsAndPrintCurrentInterval(totalCount string, resultsLength int) { + p.TotalCount, _ = strconv.Atoi(totalCount) + + start := 1 + end := resultsLength + if p.Page > 1 { + start = p.Rpp * (p.Page - 1) + end += start + } + if start == end { + fmt.Println("No records found at this page") + } else { + fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", start, end, p.TotalCount) + } + + p.CurrentCount = end +} diff --git a/cmd/common/prompt.go b/cmd/common/prompt.go index 00f42c8..b5a1a52 100644 --- a/cmd/common/prompt.go +++ b/cmd/common/prompt.go @@ -31,13 +31,10 @@ var commands map[string]*cobra.Command var prevPage = "<< Prev Page" var nextPage = ">> Next Page" -// TODO: just a tmp step for now, idea is to pass this info to generic fn without fn ends up having lot of params -type PaginationPromptInfo struct { - Page *uint64 - IsFirstPage bool - IsLastPage bool - AreAllRecordsReturned bool - RunPageCmd func(cmd *cobra.Command, args []string) +type PaginationPrompt struct { + Pagination *Pagination + CurrentStep string + RunPageCmd func(cmd *cobra.Command, args []string) } func normaliseCmd(cmd *cobra.Command, args []string) (string, string) { @@ -439,30 +436,30 @@ func PromptPagination(paginate bool, page uint64, rpp uint64) (uint64, uint64) { return page, rpp } -func AutoPromptPagination(cmd *cobra.Command, args []string, currentStep string, promptInfo *PaginationPromptInfo) { - switch step := currentStep; step { +func AutoPromptPagination(cmd *cobra.Command, args []string, paginationPrompt *PaginationPrompt) { + switch step := paginationPrompt.CurrentStep; step { case prevPage: { - *promptInfo.Page = *promptInfo.Page - 1 - promptInfo.RunPageCmd(cmd, args) + paginationPrompt.Pagination.PrevPage() + paginationPrompt.RunPageCmd(cmd, args) } case nextPage: { - *promptInfo.Page = *promptInfo.Page + 1 - promptInfo.RunPageCmd(cmd, args) + paginationPrompt.Pagination.NextPage() + paginationPrompt.RunPageCmd(cmd, args) } case "": prompts := []string{} - if promptInfo.AreAllRecordsReturned { + if paginationPrompt.Pagination.AreAllRecordsReturned() { return } - if !promptInfo.IsLastPage { + if !paginationPrompt.Pagination.IsLastPage() { prompts = append(prompts, nextPage) } - if !promptInfo.IsFirstPage { + if !paginationPrompt.Pagination.IsFirstPage() { prompts = append(prompts, prevPage) } - result := SelectInput(prompts, "") - AutoPromptPagination(cmd, args, result, promptInfo) + paginationPrompt.CurrentStep = SelectInput(prompts, "") + AutoPromptPagination(cmd, args, paginationPrompt) } } diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index b5d2d6e..8ffe138 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -4,7 +4,6 @@ import ( "fmt" "log" "os" - "strconv" "github.com/provideplatform/provide-cli/cmd/common" provide "github.com/provideplatform/provide-go/api/vault" @@ -12,9 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 - +var pagination *common.Pagination var vaultsListCmd = &cobra.Command{ Use: "list", Short: "Retrieve a list of vaults", @@ -29,8 +26,8 @@ func listVaults(cmd *cobra.Command, args []string) { func listVaultsRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID @@ -43,28 +40,27 @@ func listVaultsRun(cmd *cobra.Command, args []string) { log.Printf("failed to retrieve vaults list; %s", err.Error()) os.Exit(1) } - totalCount, _ := strconv.Atoi(resp.TotalCount) - currentCount := common.GetAndPrintCurrentCount(totalCount, int(rpp), int(page), len(results)) + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(results)) for i := range results { vlt := results[i] result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } - promptInfo := &common.PaginationPromptInfo{ - IsFirstPage: page == 1, - IsLastPage: currentCount >= totalCount, - AreAllRecordsReturned: int(page*rpp) > totalCount && page == 1, - Page: &page, - RunPageCmd: listVaultsRun, + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listVaultsRun, } - common.AutoPromptPagination(cmd, args, "", promptInfo) + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} vaultsListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter vaults") vaultsListCmd.Flags().StringVar(&common.OrganizationID, "organization", "", "organization identifier to filter vaults") vaultsListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") vaultsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - vaultsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - vaultsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of vaults to retrieve per page") + vaultsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + vaultsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of vaults to retrieve per page") } From a47e3202654b7a37ae07579fdff790534183b241 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Sun, 12 Sep 2021 01:37:47 +0200 Subject: [PATCH 7/9] Modify rest of list cases --- cmd/accounts/accounts_list.go | 26 ++++++++++++------- cmd/accounts/accounts_prompt.go | 2 +- cmd/api_tokens/api_tokens_list.go | 26 ++++++++++++------- cmd/api_tokens/api_tokens_prompt.go | 2 +- cmd/applications/application_prompt.go | 2 +- cmd/applications/applications_list.go | 22 +++++++++++----- cmd/baseline/participants/participants.go | 1 - .../participants/participants_invite.go | 1 - .../participants/participants_list.go | 8 ------ .../participants/participants_prompt.go | 1 - cmd/baseline/workgroups/workgroup_list.go | 22 +++++++++++----- cmd/baseline/workgroups/workgroups_prompt.go | 2 +- cmd/common/prompt.go | 12 ++++----- cmd/connectors/connectors_list.go | 22 +++++++++++----- cmd/connectors/connectors_prompt.go | 2 +- cmd/contracts/contracts_list.go | 22 +++++++++++----- cmd/contracts/contracts_prompt.go | 2 +- cmd/networks/networks_list.go | 22 +++++++++++----- cmd/networks/networks_prompt.go | 2 +- cmd/nodes/nodes_logs.go | 8 +++--- cmd/nodes/nodes_prompt.go | 8 +++--- cmd/organizations/organizations_list.go | 22 +++++++++++----- cmd/organizations/organizations_prompt.go | 2 +- cmd/vaults/keys/keys_list.go | 26 ++++++++++++------- cmd/vaults/keys/keys_prompt.go | 2 +- cmd/vaults/vaults_list.go | 1 + cmd/vaults/vaults_prompt.go | 2 +- cmd/wallets/wallets_list.go | 26 ++++++++++++------- cmd/wallets/wallets_prompt.go | 2 +- 29 files changed, 183 insertions(+), 115 deletions(-) diff --git a/cmd/accounts/accounts_list.go b/cmd/accounts/accounts_list.go index 340c313..787f23d 100644 --- a/cmd/accounts/accounts_list.go +++ b/cmd/accounts/accounts_list.go @@ -10,8 +10,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var accountsListCmd = &cobra.Command{ Use: "list", @@ -23,13 +22,13 @@ var accountsListCmd = &cobra.Command{ func listAccounts(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, _, err := provide.ListAccounts(token, params) + results, resp, err := provide.ListAccounts(token, params) if err != nil { log.Printf("Failed to retrieve accounts list; %s", err.Error()) os.Exit(1) @@ -38,18 +37,27 @@ func listAccounts(cmd *cobra.Command, args []string) { // log.Printf("Failed to retrieve accounts list; received status: %d", status) // os.Exit(1) // } - for i := range resp { - account := resp[i] + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(results)) + for i := range results { + account := results[i] result := fmt.Sprintf("%s\t%s\n", account.ID.String(), account.Address) // TODO-- when account.Name exists... result = fmt.Sprintf("%s\t%s - %s\n", name, account, *account.Address) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listAccounts, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} accountsListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter accounts") accountsListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") accountsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - accountsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - accountsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of accounts to retrieve per page") + accountsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + accountsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of accounts to retrieve per page") } diff --git a/cmd/accounts/accounts_prompt.go b/cmd/accounts/accounts_prompt.go index 3695661..8b61275 100644 --- a/cmd/accounts/accounts_prompt.go +++ b/cmd/accounts/accounts_prompt.go @@ -48,7 +48,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { fmt.Println("Optional Flags:") common.RequireApplication() } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listAccounts(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/api_tokens/api_tokens_list.go b/cmd/api_tokens/api_tokens_list.go index 7d0fc7b..43ea1ee 100644 --- a/cmd/api_tokens/api_tokens_list.go +++ b/cmd/api_tokens/api_tokens_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var apiTokensListCmd = &cobra.Command{ Use: "list", @@ -24,13 +23,13 @@ var apiTokensListCmd = &cobra.Command{ func listAPITokens(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, _, err := provide.ListTokens(token, params) + results, resp, err := provide.ListTokens(token, params) if err != nil { log.Printf("Failed to retrieve API tokens list; %s", err.Error()) os.Exit(1) @@ -39,17 +38,26 @@ func listAPITokens(cmd *cobra.Command, args []string) { // log.Printf("Failed to retrieve API tokens list; received status: %d", status) // os.Exit(1) // } - for i := range resp { - apiToken := resp[i] + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(results)) + for i := range results { + apiToken := results[i] result := fmt.Sprintf("%s\t%s\n", apiToken.ID.String(), *apiToken.Token) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listAPITokens, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} apiTokensListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter API tokens") apiTokensListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") apiTokensListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - apiTokensListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - apiTokensListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of API tokens to retrieve per page") + apiTokensListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + apiTokensListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of API tokens to retrieve per page") } diff --git a/cmd/api_tokens/api_tokens_prompt.go b/cmd/api_tokens/api_tokens_prompt.go index e33b17d..fa73055 100644 --- a/cmd/api_tokens/api_tokens_prompt.go +++ b/cmd/api_tokens/api_tokens_prompt.go @@ -47,7 +47,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { if optional { common.RequireApplication() } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listAPITokens(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/applications/application_prompt.go b/cmd/applications/application_prompt.go index 2253afb..00f8cd8 100644 --- a/cmd/applications/application_prompt.go +++ b/cmd/applications/application_prompt.go @@ -56,7 +56,7 @@ func generalPrompt(cmd *cobra.Command, args []string, step string) { common.RequireApplication() fetchApplicationDetails(cmd, args) case promptStepList: - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listApplications(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/applications/applications_list.go b/cmd/applications/applications_list.go index 0dbcc4c..cece637 100644 --- a/cmd/applications/applications_list.go +++ b/cmd/applications/applications_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var applicationsListCmd = &cobra.Command{ Use: "list", @@ -24,23 +23,32 @@ var applicationsListCmd = &cobra.Command{ func listApplications(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } - applications, _, err := provide.ListApplications(token, params) + applications, resp, err := provide.ListApplications(token, params) if err != nil { log.Printf("Failed to retrieve applications list; %s", err.Error()) os.Exit(1) } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(applications)) for i := range applications { application := applications[i] result := fmt.Sprintf("%s\t%s\n", application.ID.String(), *application.Name) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listApplications, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { - applicationsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - applicationsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of applications to retrieve per page") + pagination = &common.Pagination{} + applicationsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + applicationsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of applications to retrieve per page") applicationsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") } diff --git a/cmd/baseline/participants/participants.go b/cmd/baseline/participants/participants.go index 3a57081..e0c8610 100644 --- a/cmd/baseline/participants/participants.go +++ b/cmd/baseline/participants/participants.go @@ -20,5 +20,4 @@ func init() { ParticipantsCmd.AddCommand(inviteBaselineWorkgroupParticipantCmd) ParticipantsCmd.AddCommand(listBaselineWorkgroupParticipantsCmd) ParticipantsCmd.Flags().BoolVarP(&Optional, "Optional", "", false, "List all the Optional flags") - ParticipantsCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") } diff --git a/cmd/baseline/participants/participants_invite.go b/cmd/baseline/participants/participants_invite.go index 570aa22..e40be09 100644 --- a/cmd/baseline/participants/participants_invite.go +++ b/cmd/baseline/participants/participants_invite.go @@ -27,7 +27,6 @@ var invitorAddress string var registryContractAddress string var managedTenant bool var Optional bool -var paginate bool var inviteBaselineWorkgroupParticipantCmd = &cobra.Command{ Use: "invite", diff --git a/cmd/baseline/participants/participants_list.go b/cmd/baseline/participants/participants_list.go index bac2181..fae5acb 100644 --- a/cmd/baseline/participants/participants_list.go +++ b/cmd/baseline/participants/participants_list.go @@ -10,9 +10,6 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 - var listBaselineWorkgroupParticipantsCmd = &cobra.Command{ Use: "list", Short: "List workgroup participants", @@ -30,8 +27,6 @@ func listParticipantsRun(cmd *cobra.Command, args []string) { participants, _, err := ident.ListApplicationOrganizations(common.OrganizationAccessToken, common.ApplicationID, map[string]interface{}{ "type": "baseline", - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), }) if err != nil { log.Printf("failed to retrieve baseline workgroup participants; %s", err.Error()) @@ -78,7 +73,4 @@ func listParticipantsRun(cmd *cobra.Command, args []string) { func init() { listBaselineWorkgroupParticipantsCmd.Flags().StringVar(&common.ApplicationID, "workgroup", "", "workgroup identifier") listBaselineWorkgroupParticipantsCmd.Flags().BoolVarP(&Optional, "Optional", "", false, "List all the Optional flags") - listBaselineWorkgroupParticipantsCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - listBaselineWorkgroupParticipantsCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - listBaselineWorkgroupParticipantsCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of participants to retrieve per page") } diff --git a/cmd/baseline/participants/participants_prompt.go b/cmd/baseline/participants/participants_prompt.go index 33f6fd1..e18eed4 100644 --- a/cmd/baseline/participants/participants_prompt.go +++ b/cmd/baseline/participants/participants_prompt.go @@ -51,7 +51,6 @@ func generalPrompt(cmd *cobra.Command, args []string, step string) { common.RequireApplication() } } - page, rpp = common.PromptPagination(paginate, page, rpp) listParticipantsRun(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/baseline/workgroups/workgroup_list.go b/cmd/baseline/workgroups/workgroup_list.go index 2a40287..738031b 100644 --- a/cmd/baseline/workgroups/workgroup_list.go +++ b/cmd/baseline/workgroups/workgroup_list.go @@ -10,8 +10,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var listBaselineWorkgroupsCmd = &cobra.Command{ Use: "list", @@ -26,24 +25,33 @@ func listWorkgroups(cmd *cobra.Command, args []string) { func listWorkgroupsRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() - applications, _, err := ident.ListApplications(token, map[string]interface{}{ + applications, resp, err := ident.ListApplications(token, map[string]interface{}{ "type": "baseline", - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), }) if err != nil { log.Printf("failed to retrieve baseline workgroups; %s", err.Error()) os.Exit(1) } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(applications)) for i := range applications { workgroup := applications[i] result := fmt.Sprintf("%s\t%s\n", workgroup.ID.String(), *workgroup.Name) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listWorkgroupsRun, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { - listBaselineWorkgroupsCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - listBaselineWorkgroupsCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of baseline workgroups to retrieve per page") + pagination = &common.Pagination{} + listBaselineWorkgroupsCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + listBaselineWorkgroupsCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of baseline workgroups to retrieve per page") listBaselineWorkgroupsCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") } diff --git a/cmd/baseline/workgroups/workgroups_prompt.go b/cmd/baseline/workgroups/workgroups_prompt.go index 1799385..4fd8308 100644 --- a/cmd/baseline/workgroups/workgroups_prompt.go +++ b/cmd/baseline/workgroups/workgroups_prompt.go @@ -36,7 +36,7 @@ func generalPrompt(cmd *cobra.Command, args []string, step string) { } initWorkgroupRun(cmd, args) case promptStepList: - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listWorkgroupsRun(cmd, args) case promptStepJoin: if Optional { diff --git a/cmd/common/prompt.go b/cmd/common/prompt.go index b5a1a52..7b226a8 100644 --- a/cmd/common/prompt.go +++ b/cmd/common/prompt.go @@ -421,19 +421,17 @@ func SelectInput(args []string, label string) string { return result } -func PromptPagination(paginate bool, page uint64, rpp uint64) (uint64, uint64) { +func PromptPagination(paginate bool, pagination *Pagination) { if paginate { - if page == DefaultPage { + if pagination.Page == DefaultPage { result := FreeInput("Page", fmt.Sprintf("%d", DefaultPage), MandatoryNumberValidation) - page, _ = strconv.ParseUint(result, 10, 64) + pagination.Page, _ = strconv.Atoi(result) } - if rpp == DefaultRpp { + if pagination.Rpp == DefaultRpp { result := FreeInput("RPP", fmt.Sprintf("%d", DefaultRpp), MandatoryValidation) - rpp, _ = strconv.ParseUint(result, 10, 64) + pagination.Rpp, _ = strconv.Atoi(result) } } - - return page, rpp } func AutoPromptPagination(cmd *cobra.Command, args []string, paginationPrompt *PaginationPrompt) { diff --git a/cmd/connectors/connectors_list.go b/cmd/connectors/connectors_list.go index 29c206a..eaec5d6 100644 --- a/cmd/connectors/connectors_list.go +++ b/cmd/connectors/connectors_list.go @@ -12,8 +12,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var connectorsListCmd = &cobra.Command{ Use: "list", @@ -25,13 +24,13 @@ var connectorsListCmd = &cobra.Command{ func listConnectors(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - connectors, _, err := provide.ListConnectors(token, params) + connectors, resp, err := provide.ListConnectors(token, params) if err != nil { log.Printf("Failed to retrieve connectors list; %s", err.Error()) os.Exit(1) @@ -40,6 +39,7 @@ func listConnectors(cmd *cobra.Command, args []string) { // log.Printf("Failed to retrieve connectors list; received status: %d", status) // os.Exit(1) // } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(connectors)) for i := range connectors { connector := connectors[i] var config map[string]interface{} @@ -50,12 +50,20 @@ func listConnectors(cmd *cobra.Command, args []string) { } fmt.Printf("%s\n", result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listConnectors, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} connectorsListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter connectors") connectorsListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") connectorsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - connectorsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - connectorsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of connectors to retrieve per page") + connectorsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + connectorsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of connectors to retrieve per page") } diff --git a/cmd/connectors/connectors_prompt.go b/cmd/connectors/connectors_prompt.go index 85d1fb1..ab19ae6 100644 --- a/cmd/connectors/connectors_prompt.go +++ b/cmd/connectors/connectors_prompt.go @@ -46,7 +46,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { if optional { common.RequireApplication() } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listConnectors(cmd, args) case promptStepDetails: common.RequireConnector(map[string]interface{}{}) diff --git a/cmd/contracts/contracts_list.go b/cmd/contracts/contracts_list.go index f487327..c4c63a4 100644 --- a/cmd/contracts/contracts_list.go +++ b/cmd/contracts/contracts_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var contractsListCmd = &cobra.Command{ Use: "list", @@ -24,28 +23,37 @@ var contractsListCmd = &cobra.Command{ func listContracts(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - contracts, _, err := provide.ListContracts(token, params) + contracts, resp, err := provide.ListContracts(token, params) if err != nil { log.Printf("Failed to retrieve contracts list; %s", err.Error()) os.Exit(1) } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(contracts)) for i := range contracts { contract := contracts[i] result := fmt.Sprintf("%s\t%s\t%s\n", contract.ID.String(), *contract.Address, *contract.Name) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listContracts, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} contractsListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter contracts") contractsListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") contractsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - contractsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - contractsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of contracts to retrieve per page") + contractsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + contractsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of contracts to retrieve per page") } diff --git a/cmd/contracts/contracts_prompt.go b/cmd/contracts/contracts_prompt.go index 9a36317..5ef3484 100644 --- a/cmd/contracts/contracts_prompt.go +++ b/cmd/contracts/contracts_prompt.go @@ -41,7 +41,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { if optional { common.RequireApplication() } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) case "": listContracts(cmd, args) result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/networks/networks_list.go b/cmd/networks/networks_list.go index 0234f9c..b3e590e 100644 --- a/cmd/networks/networks_list.go +++ b/cmd/networks/networks_list.go @@ -13,8 +13,7 @@ import ( var public bool -var page uint64 -var rpp uint64 +var pagination *common.Pagination var networksListCmd = &cobra.Command{ Use: "list", @@ -26,28 +25,37 @@ var networksListCmd = &cobra.Command{ func listNetworks(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if public { params["public"] = "true" } - networks, _, err := provide.ListNetworks(token, params) + networks, resp, err := provide.ListNetworks(token, params) if err != nil { log.Printf("Failed to retrieve networks list; %s", err.Error()) os.Exit(1) } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(networks)) for i := range networks { network := networks[i] result := fmt.Sprintf("%s\t%s\n", network.ID.String(), *network.Name) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listNetworks, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} networksListCmd.Flags().BoolVarP(&public, "public", "p", false, "filter private networks (false by default)") networksListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") networksListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - networksListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - networksListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of networks to retrieve per page") + networksListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + networksListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of networks to retrieve per page") } diff --git a/cmd/networks/networks_prompt.go b/cmd/networks/networks_prompt.go index 99b51a5..6cbe812 100644 --- a/cmd/networks/networks_prompt.go +++ b/cmd/networks/networks_prompt.go @@ -41,7 +41,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { result := common.SelectInput(publicPromptArgs, publicPromptLabel) public = result == "Yes" } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listNetworks(cmd, args) case promptStepDisable: common.RequireNetwork() diff --git a/cmd/nodes/nodes_logs.go b/cmd/nodes/nodes_logs.go index b2e9a2c..a2bd34e 100644 --- a/cmd/nodes/nodes_logs.go +++ b/cmd/nodes/nodes_logs.go @@ -7,8 +7,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var nodesLogsCmd = &cobra.Command{ Use: "logs", @@ -48,15 +47,16 @@ func nodeLogsRun(cmd *cobra.Command, args []string) { } func init() { + pagination = &common.Pagination{} nodesLogsCmd.Flags().StringVar(&common.NetworkID, "network", "", "network id") nodesLogsCmd.MarkFlagRequired("network") nodesLogsCmd.Flags().StringVar(&common.NodeID, "node", "", "id of the node") nodesLogsCmd.MarkFlagRequired("node") - nodesLogsCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") + nodesLogsCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") nodesLogsCmd.MarkFlagRequired("page") - nodesLogsCmd.Flags().Uint64Var(&rpp, "rpp", 100, "number of log events to retrieve per page") + nodesLogsCmd.Flags().IntVar(&pagination.Rpp, "rpp", 100, "number of log events to retrieve per page") nodesLogsCmd.MarkFlagRequired("rpp") } diff --git a/cmd/nodes/nodes_prompt.go b/cmd/nodes/nodes_prompt.go index f0f88bb..0be6334 100644 --- a/cmd/nodes/nodes_prompt.go +++ b/cmd/nodes/nodes_prompt.go @@ -61,14 +61,14 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { common.NodeID = common.FreeInput("Node ID", "", common.MandatoryValidation) } // Validation Number - if page == 1 { + if pagination.Page == 1 { result := common.FreeInput("Page", "1", common.MandatoryNumberValidation) - page, _ = strconv.ParseUint(result, 10, 64) + pagination.Page, _ = strconv.Atoi(result) } // Validation Number - if rpp == 100 { + if pagination.Rpp == 100 { result := common.FreeInput("RPP", "100", common.MandatoryValidation) - rpp, _ = strconv.ParseUint(result, 10, 64) + pagination.Rpp, _ = strconv.Atoi(result) } nodeLogsRun(cmd, args) case "": diff --git a/cmd/organizations/organizations_list.go b/cmd/organizations/organizations_list.go index 06f6155..222453c 100644 --- a/cmd/organizations/organizations_list.go +++ b/cmd/organizations/organizations_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var organizationsListCmd = &cobra.Command{ Use: "list", @@ -28,14 +27,15 @@ func listOrganizations(cmd *cobra.Command, args []string) { func listOrganizationsRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } - organizations, _, err := provide.ListOrganizations(token, params) + organizations, resp, err := provide.ListOrganizations(token, params) if err != nil { log.Printf("Failed to retrieve organizations list; %s", err.Error()) os.Exit(1) } + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(organizations)) for i := range organizations { organization := organizations[i] address := "0x" @@ -45,10 +45,18 @@ func listOrganizationsRun(cmd *cobra.Command, args []string) { result := fmt.Sprintf("%s\t%s\t%s\n", organization.ID.String(), *organization.Name, address) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listOrganizationsRun, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} organizationsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - organizationsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - organizationsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of organizations to retrieve per page") + organizationsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + organizationsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of organizations to retrieve per page") } diff --git a/cmd/organizations/organizations_prompt.go b/cmd/organizations/organizations_prompt.go index 1bec48c..106e862 100644 --- a/cmd/organizations/organizations_prompt.go +++ b/cmd/organizations/organizations_prompt.go @@ -19,7 +19,7 @@ func generalPrompt(cmd *cobra.Command, args []string, step string) { organizationName = common.FreeInput("Organization Name", "", common.MandatoryValidation) createOrganizationRun(cmd, args) case promptStepList: - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listOrganizationsRun(cmd, args) case promptStepDetails: common.RequireOrganization() diff --git a/cmd/vaults/keys/keys_list.go b/cmd/vaults/keys/keys_list.go index 252cdd4..73543cf 100644 --- a/cmd/vaults/keys/keys_list.go +++ b/cmd/vaults/keys/keys_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var keysListCmd = &cobra.Command{ Use: "list", @@ -28,8 +27,8 @@ func listKeys(cmd *cobra.Command, args []string) { func listKeysRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID @@ -37,19 +36,28 @@ func listKeysRun(cmd *cobra.Command, args []string) { if common.OrganizationID != "" { params["organization_id"] = common.OrganizationID } - resp, _, err := vault.ListKeys(token, common.VaultID, params) + results, resp, err := vault.ListKeys(token, common.VaultID, params) if err != nil { log.Printf("failed to retrieve keys list; %s", err.Error()) os.Exit(1) } - for i := range resp { - vlt := resp[i] + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(results)) + for i := range results { + vlt := results[i] result := fmt.Sprintf("%s\t%s\t%s\n", vlt.ID.String(), *vlt.Name, *vlt.Description) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listKeysRun, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} keysListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter keys") keysListCmd.Flags().StringVar(&common.OrganizationID, "organization", "", "organization identifier to filter keys") keysListCmd.Flags().StringVar(&common.VaultID, "vault", "", "identifier of the vault") @@ -59,6 +67,6 @@ func init() { keysListCmd.Flags().StringVar(&keyusage, "usage", "", "key usage query; non-matching keys are filtered") keysListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - keysListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - keysListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of keys to retrieve per page") + keysListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + keysListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of keys to retrieve per page") } diff --git a/cmd/vaults/keys/keys_prompt.go b/cmd/vaults/keys/keys_prompt.go index 389d811..5f8e681 100644 --- a/cmd/vaults/keys/keys_prompt.go +++ b/cmd/vaults/keys/keys_prompt.go @@ -101,7 +101,7 @@ func promptList(cmd *cobra.Command, args []string) { if common.OrganizationID == "" { organizationidFlagPrompt() } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) } func optionalFlagsList(cmd *cobra.Command, args []string) { diff --git a/cmd/vaults/vaults_list.go b/cmd/vaults/vaults_list.go index 8ffe138..437941c 100644 --- a/cmd/vaults/vaults_list.go +++ b/cmd/vaults/vaults_list.go @@ -12,6 +12,7 @@ import ( ) var pagination *common.Pagination + var vaultsListCmd = &cobra.Command{ Use: "list", Short: "Retrieve a list of vaults", diff --git a/cmd/vaults/vaults_prompt.go b/cmd/vaults/vaults_prompt.go index 2b0a8d8..c95c23f 100644 --- a/cmd/vaults/vaults_prompt.go +++ b/cmd/vaults/vaults_prompt.go @@ -43,7 +43,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { common.RequireOrganization() } } - page, rpp = common.PromptPagination(paginate, page, rpp) + // page, rpp = common.PromptPagination(paginate, page, rpp) listVaultsRun(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) diff --git a/cmd/wallets/wallets_list.go b/cmd/wallets/wallets_list.go index e2c2370..16c7b42 100644 --- a/cmd/wallets/wallets_list.go +++ b/cmd/wallets/wallets_list.go @@ -11,8 +11,7 @@ import ( "github.com/spf13/cobra" ) -var page uint64 -var rpp uint64 +var pagination *common.Pagination var walletsListCmd = &cobra.Command{ Use: "list", @@ -28,29 +27,38 @@ func listWallets(cmd *cobra.Command, args []string) { func listWalletsRun(cmd *cobra.Command, args []string) { token := common.RequireAPIToken() params := map[string]interface{}{ - "page": fmt.Sprintf("%d", page), - "rpp": fmt.Sprintf("%d", rpp), + "page": fmt.Sprintf("%d", pagination.Page), + "rpp": fmt.Sprintf("%d", pagination.Rpp), } if common.ApplicationID != "" { params["application_id"] = common.ApplicationID } - resp, _, err := provide.ListWallets(token, params) + results, resp, err := provide.ListWallets(token, params) if err != nil { log.Printf("Failed to retrieve wallets list; %s", err.Error()) os.Exit(1) } - for i := range resp { - wallet := resp[i] + pagination.UpdateCountsAndPrintCurrentInterval(resp.TotalCount, len(results)) + for i := range results { + wallet := results[i] result := fmt.Sprintf("%s\t%s\n", wallet.ID.String(), *wallet.PublicKey) // FIXME-- when wallet.Name exists... result = fmt.Sprintf("Wallet %s\t%s - %s\n", wallet.Name, wallet.ID.String(), *wallet.Address) fmt.Print(result) } + + paginationPrompt := &common.PaginationPrompt{ + Pagination: pagination, + CurrentStep: "", + RunPageCmd: listWalletsRun, + } + common.AutoPromptPagination(cmd, args, paginationPrompt) } func init() { + pagination = &common.Pagination{} walletsListCmd.Flags().StringVar(&common.ApplicationID, "application", "", "application identifier to filter HD wallets") walletsListCmd.Flags().BoolVarP(&optional, "optional", "", false, "List all the optional flags") walletsListCmd.Flags().BoolVarP(&paginate, "paginate", "", false, "List pagination flags") - walletsListCmd.Flags().Uint64Var(&page, "page", common.DefaultPage, "page number to retrieve") - walletsListCmd.Flags().Uint64Var(&rpp, "rpp", common.DefaultRpp, "number of wallets to retrieve per page") + walletsListCmd.Flags().IntVar(&pagination.Page, "page", common.DefaultPage, "page number to retrieve") + walletsListCmd.Flags().IntVar(&pagination.Rpp, "rpp", common.DefaultRpp, "number of wallets to retrieve per page") } diff --git a/cmd/wallets/wallets_prompt.go b/cmd/wallets/wallets_prompt.go index 62b3281..056b1ea 100644 --- a/cmd/wallets/wallets_prompt.go +++ b/cmd/wallets/wallets_prompt.go @@ -49,7 +49,7 @@ func generalPrompt(cmd *cobra.Command, args []string, step string) { common.RequireApplication() } } - page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listWalletsRun(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel) From ede91ca601a1c8b61ad3513d62ba36302fc31441 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Mon, 13 Sep 2021 23:28:19 +0200 Subject: [PATCH 8/9] Fix interval edge case when list is empty --- cmd/common/pagination.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/common/pagination.go b/cmd/common/pagination.go index 5ec616b..ab8b9ad 100644 --- a/cmd/common/pagination.go +++ b/cmd/common/pagination.go @@ -41,7 +41,7 @@ func (p *Pagination) UpdateCountsAndPrintCurrentInterval(totalCount string, resu start = p.Rpp * (p.Page - 1) end += start } - if start == end { + if start >= end { fmt.Println("No records found at this page") } else { fmt.Printf("Showing record(s) %d-%d out of %d record(s)\n", start, end, p.TotalCount) From 4fedc64a69ff6bf7d559ae64a48564c6a3772b6e Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Mon, 13 Sep 2021 23:32:01 +0200 Subject: [PATCH 9/9] Fix commented out vaults list optional pagination prompt --- cmd/vaults/vaults_prompt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/vaults/vaults_prompt.go b/cmd/vaults/vaults_prompt.go index c95c23f..fc5db48 100644 --- a/cmd/vaults/vaults_prompt.go +++ b/cmd/vaults/vaults_prompt.go @@ -43,7 +43,7 @@ func generalPrompt(cmd *cobra.Command, args []string, currentStep string) { common.RequireOrganization() } } - // page, rpp = common.PromptPagination(paginate, page, rpp) + common.PromptPagination(paginate, pagination) listVaultsRun(cmd, args) case "": result := common.SelectInput(emptyPromptArgs, emptyPromptLabel)