From 89b12203989eff084b002981eaeb461d26411d1e Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Mon, 19 Aug 2019 10:58:11 -0400 Subject: [PATCH] Merge PR #4924: Return Height on Query Errors + Update Account Endpoint --- CHANGELOG.md | 4 ++++ client/context/query.go | 4 ++-- x/auth/client/rest/query.go | 13 ++++++++----- x/auth/types/account_retriever.go | 4 ++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 519a68800..d674aa053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,10 @@ longer panics if the store to load contains substores that we didn't explicitly * (simulation) [\#4893](https://github.com/cosmos/cosmos-sdk/issues/4893) Change SimApp keepers to be public and add getter functions for keys and codec * (simulation) [\#4906](https://github.com/cosmos/cosmos-sdk/issues/4906) Add simulation `Config` struct that wraps simulation flags * (store) [\#4792](https://github.com/cosmos/cosmos-sdk/issues/4792) panic on non-registered store +* (rest) [\#4924](https://github.com/cosmos/cosmos-sdk/pull/4924) Return response +height even upon error as it may be useful for the downstream caller and have +`/auth/accounts/{address}` return a 200 with an empty account upon error when +that error is that the account doesn't exist. * (types) [\#4821](https://github.com/cosmos/cosmos-sdk/issues/4821) types/errors package added with support for stacktraces. It is meant as a more feature-rich replacement for sdk.Errors in the mid-term. ### Bug Fixes diff --git a/client/context/query.go b/client/context/query.go index 49ec0c59f..2a553d663 100644 --- a/client/context/query.go +++ b/client/context/query.go @@ -95,7 +95,7 @@ func (ctx CLIContext) query(path string, key cmn.HexBytes) (res []byte, height i resp := result.Response if !resp.IsOK() { - return res, height, errors.New(resp.Log) + return res, resp.Height, errors.New(resp.Log) } // data from trusted node or subspace query doesn't need verification @@ -105,7 +105,7 @@ func (ctx CLIContext) query(path string, key cmn.HexBytes) (res []byte, height i err = ctx.verifyProof(path, resp) if err != nil { - return res, height, err + return res, resp.Height, err } return resp.Value, resp.Height, nil diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index d4a1a32f8..be094b6c6 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -34,14 +34,17 @@ func QueryAccountRequestHandlerFn(storeName string, cliCtx context.CLIContext) h } accGetter := types.NewAccountRetriever(cliCtx) - // the query will return empty account if there is no data - if err := accGetter.EnsureExists(addr); err != nil { - rest.PostProcessResponse(w, cliCtx, types.BaseAccount{}) - return - } account, height, err := accGetter.GetAccountWithHeight(addr) if err != nil { + // TODO: Handle more appropriately based on the error type. + // Ref: https://github.com/cosmos/cosmos-sdk/issues/4923 + if err := accGetter.EnsureExists(addr); err != nil { + cliCtx = cliCtx.WithHeight(height) + rest.PostProcessResponse(w, cliCtx, types.BaseAccount{}) + return + } + rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } diff --git a/x/auth/types/account_retriever.go b/x/auth/types/account_retriever.go index 90af84ec6..ab87e3259 100644 --- a/x/auth/types/account_retriever.go +++ b/x/auth/types/account_retriever.go @@ -44,12 +44,12 @@ func (ar AccountRetriever) GetAccountWithHeight(addr sdk.AccAddress) (exported.A res, height, err := ar.querier.QueryWithData(fmt.Sprintf("custom/%s/%s", QuerierRoute, QueryAccount), bs) if err != nil { - return nil, 0, err + return nil, height, err } var account exported.Account if err := ModuleCdc.UnmarshalJSON(res, &account); err != nil { - return nil, 0, err + return nil, height, err } return account, height, nil