diff --git a/x/node/client/cli/flags.go b/x/node/client/cli/flags.go index 86c94b21..5c6e02c9 100644 --- a/x/node/client/cli/flags.go +++ b/x/node/client/cli/flags.go @@ -1,5 +1,12 @@ package cli +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/pflag" + + hubtypes "github.com/sentinel-official/hub/types" +) + const ( flagProvider = "provider" flagPlan = "plan" @@ -7,3 +14,39 @@ const ( flagRemoteURL = "remote-url" flagStatus = "status" ) + +func GetProvider(flags *pflag.FlagSet) (hubtypes.ProvAddress, error) { + s, err := flags.GetString(flagProvider) + if err != nil { + return nil, err + } + if s == "" { + return nil, nil + } + + return hubtypes.ProvAddressFromBech32(s) +} + +func GetPrice(flags *pflag.FlagSet) (sdk.Coins, error) { + s, err := flags.GetString(flagPrice) + if err != nil { + return nil, err + } + if s == "" { + return nil, nil + } + + return sdk.ParseCoinsNormalized(s) +} + +func GetStatus(flags *pflag.FlagSet) (hubtypes.Status, error) { + s, err := flags.GetString(flagStatus) + if err != nil { + return hubtypes.Unspecified, err + } + if s == "" { + return hubtypes.Unspecified, nil + } + + return hubtypes.StatusFromString(s), nil +} diff --git a/x/node/client/cli/query.go b/x/node/client/cli/query.go index 74547f3a..dad9a4fc 100644 --- a/x/node/client/cli/query.go +++ b/x/node/client/cli/query.go @@ -13,7 +13,7 @@ import ( func queryNode() *cobra.Command { cmd := &cobra.Command{ - Use: "node", + Use: "node [address]", Short: "Query a node", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -31,8 +31,12 @@ func queryNode() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryNode(context.Background(), - types.NewQueryNodeRequest(address)) + res, err := qc.QueryNode( + context.Background(), + types.NewQueryNodeRequest( + address, + ), + ) if err != nil { return err } @@ -56,7 +60,7 @@ func queryNodes() *cobra.Command { return err } - provider, err := cmd.Flags().GetString(flagProvider) + provider, err := GetProvider(cmd.Flags()) if err != nil { return err } @@ -66,7 +70,7 @@ func queryNodes() *cobra.Command { return err } - s, err := cmd.Flags().GetString(flagStatus) + status, err := GetStatus(cmd.Flags()) if err != nil { return err } @@ -77,18 +81,18 @@ func queryNodes() *cobra.Command { } var ( - status = hubtypes.StatusFromString(s) - qc = types.NewQueryServiceClient(ctx) + qc = types.NewQueryServiceClient(ctx) ) - if len(provider) > 0 { - address, err := hubtypes.ProvAddressFromBech32(provider) - if err != nil { - return err - } - - res, err := qc.QueryNodesForProvider(context.Background(), - types.NewQueryNodesForProviderRequest(address, status, pagination)) + if provider != nil { + res, err := qc.QueryNodesForProvider( + context.Background(), + types.NewQueryNodesForProviderRequest( + provider, + status, + pagination, + ), + ) if err != nil { return err } @@ -96,23 +100,28 @@ func queryNodes() *cobra.Command { return ctx.PrintProto(res) } else if plan > 0 { return nil - } else { - res, err := qc.QueryNodes(context.Background(), - types.NewQueryNodesRequest(status, pagination)) - if err != nil { - return err - } + } - return ctx.PrintProto(res) + res, err := qc.QueryNodes( + context.Background(), + types.NewQueryNodesRequest( + status, + pagination, + ), + ) + if err != nil { + return err } + + return ctx.PrintProto(res) }, } flags.AddQueryFlagsToCmd(cmd) flags.AddPaginationFlagsToCmd(cmd, "nodes") - cmd.Flags().String(flagProvider, "", "provider address") - cmd.Flags().Uint64(flagPlan, 0, "subscription plan ID") - cmd.Flags().String(flagStatus, "", "status") + cmd.Flags().String(flagProvider, "", "filter by provider address") + cmd.Flags().Uint64(flagPlan, 0, "filter by subscription plan identity") + cmd.Flags().String(flagStatus, "", "filter by status") return cmd } @@ -131,8 +140,10 @@ func queryParams() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryParams(context.Background(), - types.NewQueryParamsRequest()) + res, err := qc.QueryParams( + context.Background(), + types.NewQueryParamsRequest(), + ) if err != nil { return err } diff --git a/x/node/client/cli/tx.go b/x/node/client/cli/tx.go index 3b282ce8..2dd597ad 100644 --- a/x/node/client/cli/tx.go +++ b/x/node/client/cli/tx.go @@ -4,7 +4,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" hubtypes "github.com/sentinel-official/hub/types" @@ -13,46 +12,31 @@ import ( func txRegister() *cobra.Command { cmd := &cobra.Command{ - Use: "register", + Use: "register [remote-url]", Short: "Register a node", + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) if err != nil { return err } - s, err := cmd.Flags().GetString(flagProvider) + provider, err := GetProvider(cmd.Flags()) if err != nil { return err } - var provider hubtypes.ProvAddress - if len(s) > 0 { - provider, err = hubtypes.ProvAddressFromBech32(s) - if err != nil { - return err - } - } - - s, err = cmd.Flags().GetString(flagPrice) + price, err := GetPrice(cmd.Flags()) if err != nil { return err } - var price sdk.Coins - if len(s) > 0 { - price, err = sdk.ParseCoinsNormalized(s) - if err != nil { - return err - } - } - - remoteURL, err := cmd.Flags().GetString(flagRemoteURL) - if err != nil { - return err - } - - msg := types.NewMsgRegisterRequest(ctx.FromAddress, provider, price, remoteURL) + msg := types.NewMsgRegisterRequest( + ctx.FromAddress, + provider, + price, + args[0], + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -62,11 +46,8 @@ func txRegister() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String(flagProvider, "", "node provider address") - cmd.Flags().String(flagPrice, "", "node price per Gigabyte") - cmd.Flags().String(flagRemoteURL, "", "node remote URL") - - _ = cmd.MarkFlagRequired(flagRemoteURL) + cmd.Flags().String(flagProvider, "", "provider address of the node") + cmd.Flags().String(flagPrice, "", "price per Gigabyte of the node") return cmd } @@ -81,38 +62,27 @@ func txUpdate() *cobra.Command { return err } - s, err := cmd.Flags().GetString(flagProvider) + provider, err := GetProvider(cmd.Flags()) if err != nil { return err } - var provider hubtypes.ProvAddress - if len(s) > 0 { - provider, err = hubtypes.ProvAddressFromBech32(s) - if err != nil { - return err - } - } - - s, err = cmd.Flags().GetString(flagPrice) + price, err := GetPrice(cmd.Flags()) if err != nil { return err } - var price sdk.Coins - if len(s) > 0 { - price, err = sdk.ParseCoinsNormalized(s) - if err != nil { - return err - } - } - remoteURL, err := cmd.Flags().GetString(flagRemoteURL) if err != nil { return err } - msg := types.NewMsgUpdateRequest(ctx.FromAddress.Bytes(), provider, price, remoteURL) + msg := types.NewMsgUpdateRequest( + ctx.FromAddress.Bytes(), + provider, + price, + remoteURL, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -122,17 +92,17 @@ func txUpdate() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String(flagProvider, "", "node provider address") - cmd.Flags().String(flagPrice, "", "node price per Gigabyte") - cmd.Flags().String(flagRemoteURL, "", "node remote URL") + cmd.Flags().String(flagProvider, "", "provider address of the node") + cmd.Flags().String(flagPrice, "", "price per Gigabyte of the node") + cmd.Flags().String(flagRemoteURL, "", "remote URL of the node") return cmd } func txSetStatus() *cobra.Command { cmd := &cobra.Command{ - Use: "status-set [Active | Inactive]", - Short: "Set a node status", + Use: "status-set [status]", + Short: "Set status for a node", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -140,7 +110,10 @@ func txSetStatus() *cobra.Command { return err } - msg := types.NewMsgSetStatusRequest(ctx.FromAddress.Bytes(), hubtypes.StatusFromString(args[0])) + msg := types.NewMsgSetStatusRequest( + ctx.FromAddress.Bytes(), + hubtypes.StatusFromString(args[0]), + ) if err := msg.ValidateBasic(); err != nil { return err } diff --git a/x/node/client/rest/query.go b/x/node/client/rest/query.go index 04cb44ec..57a9b1a1 100644 --- a/x/node/client/rest/query.go +++ b/x/node/client/rest/query.go @@ -5,6 +5,7 @@ import ( "net/http" "github.com/cosmos/cosmos-sdk/client" + sdkquery "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/gorilla/mux" @@ -14,22 +15,23 @@ import ( func queryNode(ctx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) + var ( + qc = types.NewQueryServiceClient(ctx) + vars = mux.Vars(r) + ) address, err := hubtypes.NodeAddressFromBech32(vars["address"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var ( - qc = types.NewQueryServiceClient(ctx) + res, err := qc.QueryNode( + context.Background(), + types.NewQueryNodeRequest( + address, + ), ) - - res, err := qc.QueryNode(context.Background(), - types.NewQueryNodeRequest(address)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -40,22 +42,34 @@ func queryNode(ctx client.Context) http.HandlerFunc { func queryNodes(ctx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( + qc = types.NewQueryServiceClient(ctx) query = r.URL.Query() status = hubtypes.StatusFromString(query.Get("status")) - qc = types.NewQueryServiceClient(ctx) ) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + if query.Get("provider") != "" { address, err := hubtypes.ProvAddressFromBech32(query.Get("provider")) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - res, err := qc.QueryNodesForProvider(context.Background(), - types.NewQueryNodesForProviderRequest(address, status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + res, err := qc.QueryNodesForProvider( + context.Background(), + types.NewQueryNodesForProviderRequest( + address, + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } @@ -64,16 +78,22 @@ func queryNodes(ctx client.Context) http.HandlerFunc { } else if query.Get("plan") != "" { rest.PostProcessResponse(w, ctx, nil) return - } else { - res, err := qc.QueryNodes(context.Background(), - types.NewQueryNodesRequest(status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } + } - rest.PostProcessResponse(w, ctx, res) + res, err := qc.QueryNodes( + context.Background(), + types.NewQueryNodesRequest( + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } + + rest.PostProcessResponse(w, ctx, res) } } diff --git a/x/node/client/rest/rest.go b/x/node/client/rest/rest.go index 489a8cd5..ec673ba7 100644 --- a/x/node/client/rest/rest.go +++ b/x/node/client/rest/rest.go @@ -1,15 +1,17 @@ package rest import ( + "net/http" + "github.com/cosmos/cosmos-sdk/client" "github.com/gorilla/mux" ) func registerQueryRoutes(ctx client.Context, router *mux.Router) { router.HandleFunc("/nodes", queryNodes(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/nodes/{address}", queryNode(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) {