diff --git a/go.mod b/go.mod index a61190c5..c03209c8 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.1.3 + github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 github.com/tendermint/tendermint v0.34.10 github.com/tendermint/tm-db v0.6.4 diff --git a/x/deposit/client/cli/query.go b/x/deposit/client/cli/query.go index e18472f6..4ffe1bd1 100644 --- a/x/deposit/client/cli/query.go +++ b/x/deposit/client/cli/query.go @@ -13,7 +13,7 @@ import ( func queryDeposit() *cobra.Command { cmd := &cobra.Command{ - Use: "deposit", + Use: "deposit [address]", Short: "Query a deposit", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -31,8 +31,12 @@ func queryDeposit() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryDeposit(context.Background(), - types.NewQueryDepositRequest(address)) + res, err := qc.QueryDeposit( + context.Background(), + types.NewQueryDepositRequest( + address, + ), + ) if err != nil { return err } @@ -42,6 +46,7 @@ func queryDeposit() *cobra.Command { } flags.AddQueryFlagsToCmd(cmd) + return cmd } @@ -64,8 +69,12 @@ func queryDeposits() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryDeposits(context.Background(), - types.NewQueryDepositsRequest(pagination)) + res, err := qc.QueryDeposits( + context.Background(), + types.NewQueryDepositsRequest( + pagination, + ), + ) if err != nil { return err } diff --git a/x/deposit/client/rest/query.go b/x/deposit/client/rest/query.go index 1dd13e67..7c84dda2 100644 --- a/x/deposit/client/rest/query.go +++ b/x/deposit/client/rest/query.go @@ -6,6 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" + 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 queryDeposit(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 := sdk.AccAddressFromBech32(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.QueryDeposit( + context.Background(), + types.NewQueryDepositRequest( + address, + ), ) - - res, err := qc.QueryDeposit(context.Background(), - types.NewQueryDepositRequest(address)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -43,10 +45,21 @@ func queryDeposits(ctx client.Context) http.HandlerFunc { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryDeposits(context.Background(), - types.NewQueryDepositsRequest(nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + + res, err := qc.QueryDeposits( + context.Background(), + types.NewQueryDepositsRequest( + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } diff --git a/x/deposit/client/rest/rest.go b/x/deposit/client/rest/rest.go index f10d8ced..316daa7b 100644 --- a/x/deposit/client/rest/rest.go +++ b/x/deposit/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("/deposits", queryDeposits(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/deposits/{address}", queryDeposit(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/deposit/simulation/decoder.go b/x/deposit/simulation/decoder.go index a1097dd3..e2471a70 100644 --- a/x/deposit/simulation/decoder.go +++ b/x/deposit/simulation/decoder.go @@ -10,7 +10,7 @@ import ( "github.com/sentinel-official/hub/x/deposit/types" ) -func NewDecodeStore(cdc codec.Marshaler) func(kvA, kvB kv.Pair) string { +func NewStoreDecoder(cdc codec.Marshaler) func(kvA, kvB kv.Pair) string { return func(kvA, kvB kv.Pair) string { if bytes.Equal(kvA.Key[:1], types.DepositKeyPrefix) { var depositA, depositB types.Deposit 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..4887adb4 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 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) { diff --git a/x/plan/client/cli/flags.go b/x/plan/client/cli/flags.go index 89e42498..2c52bddc 100644 --- a/x/plan/client/cli/flags.go +++ b/x/plan/client/cli/flags.go @@ -1,9 +1,36 @@ package cli +import ( + "github.com/spf13/pflag" + + hubtypes "github.com/sentinel-official/hub/types" +) + const ( flagProvider = "provider" - flagPrice = "price" - flagValidity = "validity" - flagBytes = "bytes" 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 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/plan/client/cli/query.go b/x/plan/client/cli/query.go index ae75019d..5393ad54 100644 --- a/x/plan/client/cli/query.go +++ b/x/plan/client/cli/query.go @@ -8,13 +8,12 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" - hubtypes "github.com/sentinel-official/hub/types" "github.com/sentinel-official/hub/x/plan/types" ) func queryPlan() *cobra.Command { cmd := &cobra.Command{ - Use: "plan", + Use: "plan [id]", Short: "Query a plan", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -32,8 +31,12 @@ func queryPlan() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryPlan(context.Background(), - types.NewQueryPlanRequest(id)) + res, err := qc.QueryPlan( + context.Background(), + types.NewQueryPlanRequest( + id, + ), + ) if err != nil { return err } @@ -57,12 +60,12 @@ func queryPlans() *cobra.Command { return err } - provider, err := cmd.Flags().GetString(flagProvider) + provider, err := GetProvider(cmd.Flags()) if err != nil { return err } - s, err := cmd.Flags().GetString(flagStatus) + status, err := GetStatus(cmd.Flags()) if err != nil { return err } @@ -73,18 +76,18 @@ func queryPlans() *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.QueryPlansForProvider(context.Background(), - types.NewQueryPlansForProviderRequest(address, status, pagination)) + if provider != nil { + res, err := qc.QueryPlansForProvider( + context.Background(), + types.NewQueryPlansForProviderRequest( + provider, + status, + pagination, + ), + ) if err != nil { return err } @@ -92,7 +95,13 @@ func queryPlans() *cobra.Command { return ctx.PrintProto(res) } - res, err := qc.QueryPlans(context.Background(), types.NewQueryPlansRequest(status, pagination)) + res, err := qc.QueryPlans( + context.Background(), + types.NewQueryPlansRequest( + status, + pagination, + ), + ) if err != nil { return err } @@ -103,8 +112,8 @@ func queryPlans() *cobra.Command { flags.AddQueryFlagsToCmd(cmd) flags.AddPaginationFlagsToCmd(cmd, "providers") - cmd.Flags().String(flagProvider, "", "provider address") - cmd.Flags().String(flagStatus, "", "status") + cmd.Flags().String(flagProvider, "", "filter by provider address") + cmd.Flags().String(flagStatus, "", "filter by status") return cmd } diff --git a/x/plan/client/cli/tx.go b/x/plan/client/cli/tx.go index 77e783e0..1565ae66 100644 --- a/x/plan/client/cli/tx.go +++ b/x/plan/client/cli/tx.go @@ -16,43 +16,36 @@ import ( func txAdd() *cobra.Command { cmd := &cobra.Command{ - Use: "add", + Use: "add [bytes] [price] [validity]", Short: "Add a plan", + Args: cobra.ExactArgs(3), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) if err != nil { return err } - s, err := cmd.Flags().GetString(flagPrice) + bytes, err := strconv.ParseInt(args[0], 10, 64) if err != nil { return err } - var price sdk.Coins - if len(s) > 0 { - price, err = sdk.ParseCoinsNormalized(s) - if err != nil { - return err - } - } - - s, err = cmd.Flags().GetString(flagValidity) + price, err := sdk.ParseCoinsNormalized(args[1]) if err != nil { return err } - validity, err := time.ParseDuration(s) + validity, err := time.ParseDuration(args[2]) if err != nil { return err } - bytes, err := cmd.Flags().GetInt64(flagBytes) - if err != nil { - return err - } - - msg := types.NewMsgAddRequest(ctx.FromAddress.Bytes(), price, validity, sdk.NewInt(bytes)) + msg := types.NewMsgAddRequest( + ctx.FromAddress.Bytes(), + price, + validity, + sdk.NewInt(bytes), + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -62,21 +55,14 @@ func txAdd() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String(flagPrice, "", "plan price") - cmd.Flags().String(flagValidity, "", "plan validity") - cmd.Flags().Int64(flagBytes, 0, "plan bytes (upload + download)") - - _ = cmd.MarkFlagRequired(flagPrice) - _ = cmd.MarkFlagRequired(flagValidity) - _ = cmd.MarkFlagRequired(flagBytes) return cmd } func txSetStatus() *cobra.Command { cmd := &cobra.Command{ - Use: "status-set [plan] [Active | Inactive]", - Short: "Set a plan status", + Use: "status-set [id] [status]", + Short: "Set status for a plan", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -89,7 +75,11 @@ func txSetStatus() *cobra.Command { return err } - msg := types.NewMsgSetStatusRequest(ctx.FromAddress.Bytes(), id, hubtypes.StatusFromString(args[1])) + msg := types.NewMsgSetStatusRequest( + ctx.FromAddress.Bytes(), + id, + hubtypes.StatusFromString(args[1]), + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -105,8 +95,8 @@ func txSetStatus() *cobra.Command { func txAddNode() *cobra.Command { cmd := &cobra.Command{ - Use: "node-add [plan] [node]", - Short: "Add a node for a plan", + Use: "node-add [id] [node]", + Short: "Add a node to a plan", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -119,12 +109,16 @@ func txAddNode() *cobra.Command { return err } - node, err := hubtypes.NodeAddressFromBech32(args[1]) + address, err := hubtypes.NodeAddressFromBech32(args[1]) if err != nil { return err } - msg := types.NewMsgAddNodeRequest(ctx.FromAddress.Bytes(), id, node) + msg := types.NewMsgAddNodeRequest( + ctx.FromAddress.Bytes(), + id, + address, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -140,8 +134,8 @@ func txAddNode() *cobra.Command { func txRemoveNode() *cobra.Command { cmd := &cobra.Command{ - Use: "node-remove [plan] [node]", - Short: "Remove a node for a plan", + Use: "node-remove [id] [node]", + Short: "Remove a node from a plan", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -154,12 +148,16 @@ func txRemoveNode() *cobra.Command { return err } - node, err := hubtypes.NodeAddressFromBech32(args[1]) + address, err := hubtypes.NodeAddressFromBech32(args[1]) if err != nil { return err } - msg := types.NewMsgRemoveNodeRequest(ctx.FromAddress, id, node) + msg := types.NewMsgRemoveNodeRequest( + ctx.FromAddress, + id, + address, + ) if err := msg.ValidateBasic(); err != nil { return err } diff --git a/x/plan/client/rest/query.go b/x/plan/client/rest/query.go index bf2054ed..537a8629 100644 --- a/x/plan/client/rest/query.go +++ b/x/plan/client/rest/query.go @@ -6,6 +6,7 @@ import ( "strconv" "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" @@ -15,22 +16,23 @@ import ( func queryPlan(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) + ) id, err := strconv.ParseUint(vars["id"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var ( - qc = types.NewQueryServiceClient(ctx) + res, err := qc.QueryPlan( + context.Background(), + types.NewQueryPlanRequest( + id, + ), ) - - res, err := qc.QueryPlan(context.Background(), - types.NewQueryPlanRequest(id)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -41,21 +43,34 @@ func queryPlan(ctx client.Context) http.HandlerFunc { func queryPlans(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.QueryPlansForProvider(context.Background(), types.NewQueryPlansForProviderRequest(address, status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + res, err := qc.QueryPlansForProvider( + context.Background(), + types.NewQueryPlansForProviderRequest( + address, + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } @@ -63,9 +78,17 @@ func queryPlans(ctx client.Context) http.HandlerFunc { return } - res, err := qc.QueryPlans(context.Background(), types.NewQueryPlansRequest(status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + res, err := qc.QueryPlans( + context.Background(), + types.NewQueryPlansRequest( + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } diff --git a/x/plan/client/rest/rest.go b/x/plan/client/rest/rest.go index baf9205d..49a37d75 100644 --- a/x/plan/client/rest/rest.go +++ b/x/plan/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("/plans", queryPlans(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/plans/{id}", queryPlan(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/provider/client/cli/query.go b/x/provider/client/cli/query.go index 7b034b44..cc39b3a0 100644 --- a/x/provider/client/cli/query.go +++ b/x/provider/client/cli/query.go @@ -13,7 +13,7 @@ import ( func queryProvider() *cobra.Command { cmd := &cobra.Command{ - Use: "provider", + Use: "provider [address]", Short: "Query a provider", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -31,8 +31,12 @@ func queryProvider() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryProvider(context.Background(), - types.NewQueryProviderRequest(address)) + res, err := qc.QueryProvider( + context.Background(), + types.NewQueryProviderRequest( + address, + ), + ) if err != nil { return err } @@ -65,8 +69,12 @@ func queryProviders() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryProviders(context.Background(), - types.NewQueryProvidersRequest(pagination)) + res, err := qc.QueryProviders( + context.Background(), + types.NewQueryProvidersRequest( + pagination, + ), + ) if err != nil { return err } @@ -95,8 +103,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/provider/client/cli/tx.go b/x/provider/client/cli/tx.go index 07a40e34..cb71d523 100644 --- a/x/provider/client/cli/tx.go +++ b/x/provider/client/cli/tx.go @@ -11,19 +11,15 @@ import ( func txRegister() *cobra.Command { cmd := &cobra.Command{ - Use: "register", + Use: "register [name]", Short: "Register a provider", + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) if err != nil { return err } - name, err := cmd.Flags().GetString(flagName) - if err != nil { - return err - } - identity, err := cmd.Flags().GetString(flagIdentity) if err != nil { return err @@ -39,7 +35,13 @@ func txRegister() *cobra.Command { return err } - msg := types.NewMsgRegisterRequest(ctx.FromAddress, name, identity, website, description) + msg := types.NewMsgRegisterRequest( + ctx.FromAddress, + args[0], + identity, + website, + description, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -49,12 +51,9 @@ func txRegister() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String(flagName, "", "provider name") - cmd.Flags().String(flagIdentity, "", "provider identity") - cmd.Flags().String(flagWebsite, "", "provider website") - cmd.Flags().String(flagDescription, "", "provider description") - - _ = cmd.MarkFlagRequired(flagName) + cmd.Flags().String(flagIdentity, "", "identity of the provider") + cmd.Flags().String(flagWebsite, "", "website of the provider") + cmd.Flags().String(flagDescription, "", "description of the provider") return cmd } @@ -89,7 +88,13 @@ func txUpdate() *cobra.Command { return err } - msg := types.NewMsgUpdateRequest(ctx.FromAddress.Bytes(), name, identity, website, description) + msg := types.NewMsgUpdateRequest( + ctx.FromAddress.Bytes(), + name, + identity, + website, + description, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -99,10 +104,10 @@ func txUpdate() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) - cmd.Flags().String(flagName, "", "provider name") - cmd.Flags().String(flagIdentity, "", "provider identity") - cmd.Flags().String(flagWebsite, "", "provider website") - cmd.Flags().String(flagDescription, "", "provider description") + cmd.Flags().String(flagName, "", "name of the provider") + cmd.Flags().String(flagIdentity, "", "identity of the provider") + cmd.Flags().String(flagWebsite, "", "website of the provider") + cmd.Flags().String(flagDescription, "", "description of the provider") return cmd } diff --git a/x/provider/client/rest/query.go b/x/provider/client/rest/query.go index 022cc981..8a843576 100644 --- a/x/provider/client/rest/query.go +++ b/x/provider/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 queryProvider(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.ProvAddressFromBech32(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.QueryProvider( + context.Background(), + types.NewQueryProviderRequest( + address, + ), ) - - res, err := qc.QueryProvider(context.Background(), - types.NewQueryProviderRequest(address)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -43,10 +45,21 @@ func queryProviders(ctx client.Context) http.HandlerFunc { qc = types.NewQueryServiceClient(ctx) ) - providers, err := qc.QueryProviders(context.Background(), - types.NewQueryProvidersRequest(nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + + providers, err := qc.QueryProviders( + context.Background(), + types.NewQueryProvidersRequest( + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } diff --git a/x/provider/client/rest/rest.go b/x/provider/client/rest/rest.go index 1ca5051b..8671fffc 100644 --- a/x/provider/client/rest/rest.go +++ b/x/provider/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("/providers", queryProviders(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/providers/{address}", queryProvider(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/provider/simulation/decoder.go b/x/provider/simulation/decoder.go index cb5b1cd0..5d7d81b9 100644 --- a/x/provider/simulation/decoder.go +++ b/x/provider/simulation/decoder.go @@ -10,7 +10,7 @@ import ( "github.com/sentinel-official/hub/x/provider/types" ) -func NewDecodeStore(cdc codec.Marshaler) func(kvA, kvB kv.Pair) string { +func NewStoreDecoder(cdc codec.Marshaler) func(kvA, kvB kv.Pair) string { return func(kvA, kvB kv.Pair) string { if bytes.Equal(kvA.Key[:1], types.ProviderKeyPrefix) { var providerA, providerB types.Provider diff --git a/x/session/client/cli/flags.go b/x/session/client/cli/flags.go index 19528d46..ed981ee7 100644 --- a/x/session/client/cli/flags.go +++ b/x/session/client/cli/flags.go @@ -1,6 +1,53 @@ package cli +import ( + "encoding/base64" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/pflag" + + hubtypes "github.com/sentinel-official/hub/types" +) + const ( - flagAddress = "address" - flagActive = "active" + flagAddress = "address" + flagRating = "rating" + flagSignature = "signature" + flagStatus = "status" ) + +func GetAddress(flags *pflag.FlagSet) (sdk.AccAddress, error) { + s, err := flags.GetString(flagAddress) + if err != nil { + return nil, err + } + if s == "" { + return nil, nil + } + + return sdk.AccAddressFromBech32(s) +} + +func GetSignature(flags *pflag.FlagSet) ([]byte, error) { + s, err := flags.GetString(flagSignature) + if err != nil { + return nil, err + } + if s == "" { + return nil, nil + } + + return base64.StdEncoding.DecodeString(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/session/client/cli/query.go b/x/session/client/cli/query.go index 02ded0a5..c867f7c5 100644 --- a/x/session/client/cli/query.go +++ b/x/session/client/cli/query.go @@ -6,16 +6,14 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" - hubtypes "github.com/sentinel-official/hub/types" "github.com/sentinel-official/hub/x/session/types" ) func querySession() *cobra.Command { cmd := &cobra.Command{ - Use: "session", + Use: "session [id]", Short: "Query a session", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -33,8 +31,12 @@ func querySession() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QuerySession(context.Background(), - types.NewQuerySessionRequest(id)) + res, err := qc.QuerySession( + context.Background(), + types.NewQuerySessionRequest( + id, + ), + ) if err != nil { return err } @@ -58,7 +60,12 @@ func querySessions() *cobra.Command { return err } - address, err := cmd.Flags().GetString(flagAddress) + address, err := GetAddress(cmd.Flags()) + if err != nil { + return err + } + + status, err := GetStatus(cmd.Flags()) if err != nil { return err } @@ -72,36 +79,27 @@ func querySessions() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - if len(address) > 0 { - address, err := sdk.AccAddressFromBech32(address) - if err != nil { - return err - } - - var ( - active bool - status hubtypes.Status + if address != nil { + res, err := qc.QuerySessionsForAddress( + context.Background(), + types.NewQuerySessionsForAddressRequest( + address, + status, + pagination, + ), ) - - active, err = cmd.Flags().GetBool(flagActive) - if err != nil { - return err - } - - if active { - status = hubtypes.StatusActive - } - - res, err := qc.QuerySessionsForAddress(context.Background(), - types.NewQuerySessionsForAddressRequest(address, status, pagination)) if err != nil { return err } return ctx.PrintProto(res) } else { - res, err := qc.QuerySessions(context.Background(), - types.NewQuerySessionsRequest(pagination)) + res, err := qc.QuerySessions( + context.Background(), + types.NewQuerySessionsRequest( + pagination, + ), + ) if err != nil { return err } @@ -113,8 +111,8 @@ func querySessions() *cobra.Command { flags.AddQueryFlagsToCmd(cmd) flags.AddPaginationFlagsToCmd(cmd, "sessions") - cmd.Flags().String(flagAddress, "", "account address") - cmd.Flags().Bool(flagActive, false, "active sessions only") + cmd.Flags().String(flagAddress, "", "filter by account address") + cmd.Flags().String(flagStatus, "", "filter by status") return cmd } @@ -133,8 +131,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/session/client/cli/tx.go b/x/session/client/cli/tx.go index da96b0bf..e2f50dc4 100644 --- a/x/session/client/cli/tx.go +++ b/x/session/client/cli/tx.go @@ -1,7 +1,6 @@ package cli import ( - "encoding/hex" "strconv" "time" @@ -16,7 +15,7 @@ import ( func txStart() *cobra.Command { cmd := &cobra.Command{ - Use: "start [id] [address]", + Use: "start [id] [node]", Short: "Start a session", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { @@ -35,7 +34,11 @@ func txStart() *cobra.Command { return err } - msg := types.NewMsgStartRequest(ctx.FromAddress, id, address) + msg := types.NewMsgStartRequest( + ctx.FromAddress, + id, + address, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -51,8 +54,8 @@ func txStart() *cobra.Command { func txUpdate() *cobra.Command { cmd := &cobra.Command{ - Use: "update [id] [upload] [download] [duration] (signature)", - Short: "Add or update a session", + Use: "update [id] [upload] [download] [duration]", + Short: "Update a session", Args: cobra.ExactArgs(4), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -80,12 +83,9 @@ func txUpdate() *cobra.Command { return err } - var signature []byte = nil - if len(args) > 4 && args[4] != "" { - signature, err = hex.DecodeString(args[4]) - if err != nil { - return err - } + signature, err := GetSignature(cmd.Flags()) + if err != nil { + return err } msg := types.NewMsgUpdateRequest( @@ -106,15 +106,16 @@ func txUpdate() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) + cmd.Flags().String(flagSignature, "", "client signature of the bandwidth info") return cmd } func txEnd() *cobra.Command { cmd := &cobra.Command{ - Use: "end [id] [rating]", + Use: "end [id]", Short: "End a session", - Args: cobra.ExactArgs(2), + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) if err != nil { @@ -126,12 +127,16 @@ func txEnd() *cobra.Command { return err } - rating, err := strconv.ParseUint(args[1], 10, 64) + rating, err := cmd.Flags().GetUint64(flagRating) if err != nil { return err } - msg := types.NewMsgEndRequest(ctx.FromAddress, id, rating) + msg := types.NewMsgEndRequest( + ctx.FromAddress, + id, + rating, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -141,6 +146,7 @@ func txEnd() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) + cmd.Flags().Uint64(flagRating, 0, "rate the session quality [0, 10]") return cmd } diff --git a/x/session/client/rest/query.go b/x/session/client/rest/query.go index a11e06b6..2a773017 100644 --- a/x/session/client/rest/query.go +++ b/x/session/client/rest/query.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" + sdkquery "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/gorilla/mux" @@ -16,22 +17,23 @@ import ( func querySession(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) + ) id, err := strconv.ParseUint(vars["id"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var ( - qc = types.NewQueryServiceClient(ctx) + res, err := qc.QuerySession( + context.Background(), + types.NewQuerySessionRequest( + id, + ), ) - - res, err := qc.QuerySession(context.Background(), - types.NewQuerySessionRequest(id)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -42,40 +44,54 @@ func querySession(ctx client.Context) http.HandlerFunc { func querySessions(ctx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( - query = r.URL.Query() - qc = types.NewQueryServiceClient(ctx) + qc = types.NewQueryServiceClient(ctx) + query = r.URL.Query() + status = hubtypes.StatusFromString(query.Get("status")) ) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + if query.Get("address") != "" { address, err := sdk.AccAddressFromBech32(query.Get("address")) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var status hubtypes.Status - if query.Get("active") != "" { - status = hubtypes.StatusActive - } - - res, err := qc.QuerySessionsForAddress(context.Background(), - types.NewQuerySessionsForAddressRequest(address, status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + res, err := qc.QuerySessionsForAddress( + context.Background(), + types.NewQuerySessionsForAddressRequest( + address, + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } rest.PostProcessResponse(w, ctx, res) return - } else { - res, err := qc.QuerySessions(context.Background(), types.NewQuerySessionsRequest(nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } + } - rest.PostProcessResponse(w, ctx, res) + res, err := qc.QuerySessions( + context.Background(), + types.NewQuerySessionsRequest( + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } + + rest.PostProcessResponse(w, ctx, res) } } diff --git a/x/session/client/rest/rest.go b/x/session/client/rest/rest.go index ff80315a..33a05e39 100644 --- a/x/session/client/rest/rest.go +++ b/x/session/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("/sessions", querySessions(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/sessions/{id}", querySession(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/subscription/client/cli/flags.go b/x/subscription/client/cli/flags.go index 95543106..0af81372 100644 --- a/x/subscription/client/cli/flags.go +++ b/x/subscription/client/cli/flags.go @@ -1,6 +1,37 @@ package cli +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/pflag" + + hubtypes "github.com/sentinel-official/hub/types" +) + const ( flagStatus = "status" flagAddress = "address" ) + +func GetAddress(flags *pflag.FlagSet) (sdk.AccAddress, error) { + s, err := flags.GetString(flagAddress) + if err != nil { + return nil, err + } + if s == "" { + return nil, nil + } + + return sdk.AccAddressFromBech32(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/subscription/client/cli/query.go b/x/subscription/client/cli/query.go index eb2f5519..4cf6b61a 100644 --- a/x/subscription/client/cli/query.go +++ b/x/subscription/client/cli/query.go @@ -9,13 +9,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" - hubtypes "github.com/sentinel-official/hub/types" "github.com/sentinel-official/hub/x/subscription/types" ) func querySubscription() *cobra.Command { cmd := &cobra.Command{ - Use: "subscription", + Use: "subscription [id]", Short: "Query a subscription", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -33,8 +32,12 @@ func querySubscription() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QuerySubscription(context.Background(), - types.NewQuerySubscriptionRequest(id)) + res, err := qc.QuerySubscription( + context.Background(), + types.NewQuerySubscriptionRequest( + id, + ), + ) if err != nil { return err } @@ -58,12 +61,12 @@ func querySubscriptions() *cobra.Command { return err } - address, err := cmd.Flags().GetString(flagAddress) + address, err := GetAddress(cmd.Flags()) if err != nil { return err } - status, err := cmd.Flags().GetString(flagStatus) + status, err := GetStatus(cmd.Flags()) if err != nil { return err } @@ -77,42 +80,47 @@ func querySubscriptions() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - if len(address) > 0 { - address, err := sdk.AccAddressFromBech32(address) - if err != nil { - return err - } - - res, err := qc.QuerySubscriptionsForAddress(context.Background(), - types.NewQuerySubscriptionsForAddressRequest(address, hubtypes.StatusFromString(status), pagination)) + if address != nil { + res, err := qc.QuerySubscriptionsForAddress( + context.Background(), + types.NewQuerySubscriptionsForAddressRequest( + address, + status, + pagination, + ), + ) if err != nil { return err } return ctx.PrintProto(res) - } else { - res, err := qc.QuerySubscriptions(context.Background(), - types.NewQuerySubscriptionsRequest(pagination)) - if err != nil { - return err - } + } - return ctx.PrintProto(res) + res, err := qc.QuerySubscriptions( + context.Background(), + types.NewQuerySubscriptionsRequest( + pagination, + ), + ) + if err != nil { + return err } + + return ctx.PrintProto(res) }, } flags.AddQueryFlagsToCmd(cmd) flags.AddPaginationFlagsToCmd(cmd, "subscriptions") - cmd.Flags().String(flagAddress, "", "account address") - cmd.Flags().String(flagStatus, "", "status") + cmd.Flags().String(flagAddress, "", "filter by account address") + cmd.Flags().String(flagStatus, "", "filter by status") return cmd } func queryQuota() *cobra.Command { cmd := &cobra.Command{ - Use: "quota [id] [address]", + Use: "quota [subscription] [address]", Short: "Query a quota of an address", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { @@ -135,8 +143,13 @@ func queryQuota() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryQuota(context.Background(), - types.NewQueryQuotaRequest(id, address)) + res, err := qc.QueryQuota( + context.Background(), + types.NewQueryQuotaRequest( + id, + address, + ), + ) if err != nil { return err } @@ -152,7 +165,7 @@ func queryQuota() *cobra.Command { func queryQuotas() *cobra.Command { cmd := &cobra.Command{ - Use: "quotas", + Use: "quotas [subscription]", Short: "Query quotas of a subscription", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) (err error) { @@ -175,7 +188,13 @@ func queryQuotas() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QueryQuotas(context.Background(), types.NewQueryQuotasRequest(id, pagination)) + res, err := qc.QueryQuotas( + context.Background(), + types.NewQueryQuotasRequest( + id, + pagination, + ), + ) if err != nil { return err } @@ -204,8 +223,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/subscription/client/cli/tx.go b/x/subscription/client/cli/tx.go index dd8e7dab..626f92d5 100644 --- a/x/subscription/client/cli/tx.go +++ b/x/subscription/client/cli/tx.go @@ -15,7 +15,7 @@ import ( func txSubscribeToPlan() *cobra.Command { cmd := &cobra.Command{ - Use: "subscribe-plan [plan] [denom]", + Use: "subscribe-to-plan [plan] [denom]", Short: "Subscribe to a plan", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { @@ -29,7 +29,11 @@ func txSubscribeToPlan() *cobra.Command { return err } - msg := types.NewMsgSubscribeToPlanRequest(ctx.FromAddress, id, args[1]) + msg := types.NewMsgSubscribeToPlanRequest( + ctx.FromAddress, + id, + args[1], + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -45,7 +49,7 @@ func txSubscribeToPlan() *cobra.Command { func txSubscribeToNode() *cobra.Command { cmd := &cobra.Command{ - Use: "subscribe-node [node] [deposit]", + Use: "subscribe-to-node [node] [deposit]", Short: "Subscribe to a node", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { @@ -64,7 +68,11 @@ func txSubscribeToNode() *cobra.Command { return err } - msg := types.NewMsgSubscribeToNodeRequest(ctx.FromAddress, address, deposit) + msg := types.NewMsgSubscribeToNodeRequest( + ctx.FromAddress, + address, + deposit, + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -81,7 +89,7 @@ func txSubscribeToNode() *cobra.Command { func txAddQuota() *cobra.Command { cmd := &cobra.Command{ Use: "quota-add [subscription] [address] [bytes]", - Short: "Add a quota of a subscription", + Short: "Add a quota for a subscription", Args: cobra.ExactArgs(3), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -104,7 +112,12 @@ func txAddQuota() *cobra.Command { return err } - msg := types.NewMsgAddQuotaRequest(ctx.FromAddress, id, address, sdk.NewInt(bytes)) + msg := types.NewMsgAddQuotaRequest( + ctx.FromAddress, + id, + address, + sdk.NewInt(bytes), + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -121,7 +134,7 @@ func txAddQuota() *cobra.Command { func txUpdateQuota() *cobra.Command { cmd := &cobra.Command{ Use: "quota-update [subscription] [address] [bytes]", - Short: "Update a quota of a subscription", + Short: "Update a quota from a subscription", Args: cobra.ExactArgs(3), RunE: func(cmd *cobra.Command, args []string) error { ctx, err := client.GetClientTxContext(cmd) @@ -144,7 +157,12 @@ func txUpdateQuota() *cobra.Command { return err } - msg := types.NewMsgUpdateQuotaRequest(ctx.FromAddress, id, address, sdk.NewInt(bytes)) + msg := types.NewMsgUpdateQuotaRequest( + ctx.FromAddress, + id, + address, + sdk.NewInt(bytes), + ) if err := msg.ValidateBasic(); err != nil { return err } @@ -160,7 +178,7 @@ func txUpdateQuota() *cobra.Command { func txCancel() *cobra.Command { cmd := &cobra.Command{ - Use: "cancel [subscription]", + Use: "cancel [id]", Short: "Cancel a subscription", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -174,7 +192,10 @@ func txCancel() *cobra.Command { return err } - msg := types.NewMsgCancelRequest(ctx.FromAddress, id) + msg := types.NewMsgCancelRequest( + ctx.FromAddress, + id, + ) if err := msg.ValidateBasic(); err != nil { return err } diff --git a/x/subscription/client/rest/query.go b/x/subscription/client/rest/query.go index 490c3927..1f9448b0 100644 --- a/x/subscription/client/rest/query.go +++ b/x/subscription/client/rest/query.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" + sdkquery "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/gorilla/mux" @@ -16,22 +17,23 @@ import ( func querySubscription(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) + ) id, err := strconv.ParseUint(vars["id"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var ( - qc = types.NewQueryServiceClient(ctx) + res, err := qc.QuerySubscription( + context.Background(), + types.NewQuerySubscriptionRequest( + id, + ), ) - - res, err := qc.QuerySubscription(context.Background(), - types.NewQuerySubscriptionRequest(id)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -42,65 +44,83 @@ func querySubscription(ctx client.Context) http.HandlerFunc { func querySubscriptions(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("address") != "" { address, err := sdk.AccAddressFromBech32(query.Get("address")) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - res, err := qc.QuerySubscriptionsForAddress(context.Background(), - types.NewQuerySubscriptionsForAddressRequest(address, status, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + res, err := qc.QuerySubscriptionsForAddress( + context.Background(), + types.NewQuerySubscriptionsForAddressRequest( + address, + status, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } rest.PostProcessResponse(w, ctx, res) return - } else { - res, err := qc.QuerySubscriptions(context.Background(), - types.NewQuerySubscriptionsRequest(nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } + } - rest.PostProcessResponse(w, ctx, res) + res, err := qc.QuerySubscriptions( + context.Background(), + types.NewQuerySubscriptionsRequest( + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } + + rest.PostProcessResponse(w, ctx, res) } } func queryQuota(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) + ) id, err := strconv.ParseUint(vars["id"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } address, err := sdk.AccAddressFromBech32(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.QueryQuota( + context.Background(), + types.NewQueryQuotaRequest( + id, + address, + ), ) - - res, err := qc.QueryQuota(context.Background(), - types.NewQueryQuotaRequest(id, address)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -111,20 +131,31 @@ func queryQuota(ctx client.Context) http.HandlerFunc { func queryQuotas(ctx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( - vars = mux.Vars(r) qc = types.NewQueryServiceClient(ctx) + vars = mux.Vars(r) ) id, err := strconv.ParseUint(vars["id"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - res, err := qc.QueryQuotas(context.Background(), - types.NewQueryQuotasRequest(id, nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + + res, err := qc.QueryQuotas( + context.Background(), + types.NewQueryQuotasRequest( + id, + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } diff --git a/x/subscription/client/rest/rest.go b/x/subscription/client/rest/rest.go index 8f212c37..fd23ff3b 100644 --- a/x/subscription/client/rest/rest.go +++ b/x/subscription/client/rest/rest.go @@ -1,19 +1,21 @@ 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("/subscriptions", querySubscriptions(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/subscriptions/{id}", querySubscription(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/subscriptions/{id}/quotas", queryQuotas(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/subscriptions/{id}/quotas/{address}", queryQuota(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/swap/client/cli/query.go b/x/swap/client/cli/query.go index 4cdffb8e..6a0677fe 100644 --- a/x/swap/client/cli/query.go +++ b/x/swap/client/cli/query.go @@ -31,8 +31,12 @@ func querySwap() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QuerySwap(context.Background(), - types.NewQuerySwapRequest(types.BytesToHash(txHash))) + res, err := qc.QuerySwap( + context.Background(), + types.NewQuerySwapRequest( + types.BytesToHash(txHash), + ), + ) if err != nil { return err } @@ -65,8 +69,12 @@ func querySwaps() *cobra.Command { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QuerySwaps(context.Background(), - types.NewQuerySwapsRequest(pagination)) + res, err := qc.QuerySwaps( + context.Background(), + types.NewQuerySwapsRequest( + pagination, + ), + ) if err != nil { return err } @@ -95,8 +103,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/swap/client/cli/tx.go b/x/swap/client/cli/tx.go index b59895b3..05984847 100644 --- a/x/swap/client/cli/tx.go +++ b/x/swap/client/cli/tx.go @@ -39,7 +39,12 @@ func txSwap() *cobra.Command { return err } - msg := types.NewMsgSwapRequest(ctx.FromAddress, types.BytesToHash(txHash), receiver, sdk.NewInt(amount)) + msg := types.NewMsgSwapRequest( + ctx.FromAddress, + types.BytesToHash(txHash), + receiver, + sdk.NewInt(amount), + ) if err := msg.ValidateBasic(); err != nil { return err } diff --git a/x/swap/client/rest/query.go b/x/swap/client/rest/query.go index 853e042f..b4108dd1 100644 --- a/x/swap/client/rest/query.go +++ b/x/swap/client/rest/query.go @@ -6,6 +6,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 querySwap(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) + ) txHash, err := hex.DecodeString(vars["txHash"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + if rest.CheckBadRequestError(w, err) { return } - var ( - qc = types.NewQueryServiceClient(ctx) + res, err := qc.QuerySwap( + context.Background(), + types.NewQuerySwapRequest( + types.BytesToHash(txHash), + ), ) - - res, err := qc.QuerySwap(context.Background(), - types.NewQuerySwapRequest(types.BytesToHash(txHash))) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + if rest.CheckInternalServerError(w, err) { return } @@ -43,10 +45,21 @@ func querySwaps(ctx client.Context) http.HandlerFunc { qc = types.NewQueryServiceClient(ctx) ) - res, err := qc.QuerySwaps(context.Background(), - types.NewQuerySwapsRequest(nil)) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + _, page, limit, err := rest.ParseHTTPArgs(r) + if rest.CheckBadRequestError(w, err) { + return + } + + res, err := qc.QuerySwaps( + context.Background(), + types.NewQuerySwapsRequest( + &sdkquery.PageRequest{ + Offset: uint64(page * limit), + Limit: uint64(limit), + }, + ), + ) + if rest.CheckInternalServerError(w, err) { return } diff --git a/x/swap/client/rest/rest.go b/x/swap/client/rest/rest.go index 838d3f95..4d3fb1a8 100644 --- a/x/swap/client/rest/rest.go +++ b/x/swap/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("/swaps", querySwaps(ctx)). - Methods("GET") + Methods(http.MethodGet) router.HandleFunc("/swaps/{txHash}", querySwap(ctx)). - Methods("GET") + Methods(http.MethodGet) } func RegisterRoutes(ctx client.Context, router *mux.Router) { diff --git a/x/swap/module.go b/x/swap/module.go index dd11a63b..ef93ab34 100644 --- a/x/swap/module.go +++ b/x/swap/module.go @@ -17,6 +17,7 @@ import ( abcitypes "github.com/tendermint/tendermint/abci/types" "github.com/sentinel-official/hub/x/swap/client/cli" + "github.com/sentinel-official/hub/x/swap/client/rest" "github.com/sentinel-official/hub/x/swap/keeper" "github.com/sentinel-official/hub/x/swap/simulation" "github.com/sentinel-official/hub/x/swap/types" @@ -55,7 +56,9 @@ func (a AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, _ client.TxEnco return state.Validate() } -func (a AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {} +func (a AppModuleBasic) RegisterRESTRoutes(ctx client.Context, router *mux.Router) { + rest.RegisterRoutes(ctx, router) +} func (a AppModuleBasic) RegisterGRPCGatewayRoutes(ctx client.Context, mux *runtime.ServeMux) { _ = types.RegisterQueryServiceHandlerClient(context.Background(), mux, types.NewQueryServiceClient(ctx)) diff --git a/x/vpn/module.go b/x/vpn/module.go index cd8b6df1..90da8da2 100644 --- a/x/vpn/module.go +++ b/x/vpn/module.go @@ -29,6 +29,7 @@ import ( subscriptionkeeper "github.com/sentinel-official/hub/x/subscription/keeper" subscriptiontypes "github.com/sentinel-official/hub/x/subscription/types" "github.com/sentinel-official/hub/x/vpn/client/cli" + "github.com/sentinel-official/hub/x/vpn/client/rest" "github.com/sentinel-official/hub/x/vpn/expected" "github.com/sentinel-official/hub/x/vpn/keeper" "github.com/sentinel-official/hub/x/vpn/simulation" @@ -68,7 +69,9 @@ func (a AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, _ client.TxEnco return state.Validate() } -func (a AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {} +func (a AppModuleBasic) RegisterRESTRoutes(ctx client.Context, router *mux.Router) { + rest.RegisterRoutes(ctx, router) +} func (a AppModuleBasic) RegisterGRPCGatewayRoutes(ctx client.Context, mux *runtime.ServeMux) { _ = deposittypes.RegisterQueryServiceHandlerClient(context.Background(), mux, deposittypes.NewQueryServiceClient(ctx))