Skip to content
This repository has been archived by the owner on Nov 16, 2022. It is now read-only.

Commit

Permalink
Merge pull request #1905 from bandprotocol/1882-get-result-endpoint
Browse files Browse the repository at this point in the history
Add request + response packet to request rest endpoint
  • Loading branch information
taobun authored Jun 10, 2020
2 parents cb5141a + 7f9973c commit 7afe3bd
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 17 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
- (impv/chore) [\#1893](https://github.com/bandprotocol/bandchain/pull/1893) Cleanup and Add genesis command to add data sources / oracle scripts.
- (feat) [\#1910](https://github.com/bandprotocol/bandchain/pull/1910) Implement request-search REST and CLI endpoint.
- (impv) [\#1903](https://github.com/bandprotocol/bandchain/pull/1903) Store result in store instead of result hash.
- (feat) [\#1905](https://github.com/bandprotocol/bandchain/pull/1905) Add request + response packet to request rest endpoint.
- (impv) [\#1901](https://github.com/bandprotocol/bandchain/pull/1901) Added `moniker` field to `delegations_view` table.
- (feat) [\#1879](https://github.com/bandprotocol/bandchain/pull/1879) Keep `Request` and `Report` around. We avoid premature optimization at the moment.
- (feat) [\#1873](https://github.com/bandprotocol/bandchain/pull/1873) Add `in-before-resolve` field in `Report` data structure.
Expand Down
11 changes: 9 additions & 2 deletions chain/x/oracle/client/common/request_search.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,15 @@ func QuerySearchLatestRequest(
}
}
if ok && rid != "" {
// TODO: Check if request has resolved.
return queryRequest(route, cliCtx, rid)
res, h, err := queryRequest(route, cliCtx, rid)
if err != nil {
return nil, 0, err
}
var out types.QueryRequestResult
cliCtx.Codec.MustUnmarshalJSON(res, &out)
if out.Result != nil {
return res, h, nil
}
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions chain/x/oracle/keeper/owasm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,16 +323,16 @@ func TestResolveRequestSuccess(t *testing.T) {
require.NoError(t, err)

r := k.MustGetRequest(ctx, reqID)
resPacket := types.NewOracleResponsePacketData(
expectedReqPacket := types.NewOracleRequestPacketData(
r.ClientID, r.OracleScriptID, r.Calldata, r.MinCount, uint64(len(r.RequestedValidators)),
)
expectedResPacket := types.NewOracleResponsePacketData(
r.ClientID, reqID, k.GetReportCount(ctx, reqID), r.RequestTime,
ctx.BlockTime().Unix(), types.ResolveStatus_Success, []byte("beeb"),
)
reqPacket := types.NewOracleRequestPacketData(
r.ClientID, r.OracleScriptID, r.Calldata, r.MinCount, uint64(len(r.RequestedValidators)),
)
expecetRes := types.CalculateEncodedResult(reqPacket, resPacket)

require.Equal(t, expecetRes, res)
require.Equal(t, res, types.Result{RequestPacketData: expectedReqPacket, ResponsePacketData: expectedResPacket})

}

// TODO: Patch to "Bad" wasm code that is a valid wasm code.
Expand Down
13 changes: 11 additions & 2 deletions chain/x/oracle/keeper/querier.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,19 @@ func queryRequestByID(ctx sdk.Context, path []string, k Keeper) ([]byte, error)
return nil, err
}
reports := k.GetReports(ctx, types.RequestID(id))
result, _ := k.GetResult(ctx, types.RequestID(id))

if !k.HasResult(ctx, types.RequestID(id)) {
return codec.MarshalJSONIndent(types.ModuleCdc, types.QueryRequestResult{
Request: request,
Reports: reports,
Result: nil,
})
}

result := k.MustGetResult(ctx, types.RequestID(id))
return codec.MarshalJSONIndent(types.ModuleCdc, types.QueryRequestResult{
Request: request,
Reports: reports,
Result: result,
Result: &result,
})
}
24 changes: 20 additions & 4 deletions chain/x/oracle/keeper/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"

"github.com/bandprotocol/bandchain/chain/pkg/obi"
"github.com/bandprotocol/bandchain/chain/x/oracle/types"
)

Expand All @@ -18,13 +19,28 @@ func (k Keeper) SetResult(ctx sdk.Context, reqID types.RequestID, result []byte)
store.Set(types.ResultStoreKey(reqID), result)
}

// GetResult returns the result bytes for the given request ID or error if not exists.
func (k Keeper) GetResult(ctx sdk.Context, id types.RequestID) ([]byte, error) {
// GetResult returns the result for the given request ID or error if not exists.
func (k Keeper) GetResult(ctx sdk.Context, id types.RequestID) (types.Result, error) {
bz := ctx.KVStore(k.storeKey).Get(types.ResultStoreKey(id))
if bz == nil {
return nil, sdkerrors.Wrapf(types.ErrResultNotFound, "id: %d", id)
return types.Result{}, sdkerrors.Wrapf(types.ErrResultNotFound, "id: %d", id)
}
return bz, nil
var result types.Result
err := obi.Decode(bz, &result)
if err != nil {
return types.Result{}, types.ErrOBIDecode
}

return result, nil
}

// MustGetResult returns the result for the given request ID. Panics on error.
func (k Keeper) MustGetResult(ctx sdk.Context, id types.RequestID) types.Result {
result, err := k.GetResult(ctx, id)
if err != nil {
panic(err)
}
return result
}

// GetAllResults returns the list of all results in the store. Nil will be added for skipped results.
Expand Down
11 changes: 9 additions & 2 deletions chain/x/oracle/keeper/result_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,20 @@ func TestResultBasicFunctions(t *testing.T) {
k.SetResult(ctx, types.RequestID(1), encodedResult)

// Test GetResult func
encodedResultReqID1, err := k.GetResult(ctx, types.RequestID(1))
result, err := k.GetResult(ctx, types.RequestID(1))
require.NoError(t, err)
require.Equal(t, encodedResult, encodedResultReqID1)
require.Equal(t, result, types.Result{RequestPacketData: req, ResponsePacketData: res})

// Test MustGetResult func
result = k.MustGetResult(ctx, types.RequestID(1))
require.NoError(t, err)
require.Equal(t, result, types.Result{RequestPacketData: req, ResponsePacketData: res})

_, err = k.GetResult(ctx, types.RequestID(2))
require.Error(t, err)

require.Panics(t, func() { k.MustGetResult(ctx, types.RequestID(2)) })

// Test HasResult func
require.True(t, k.HasResult(ctx, types.RequestID(1)))
require.False(t, k.HasResult(ctx, types.RequestID(2)))
Expand Down
1 change: 1 addition & 0 deletions chain/x/oracle/types/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ var (
ErrInsufficientValidators = sdkerrors.Register(ModuleName, 33, "insufficent available validators")
ErrCreateWithDoNotModify = sdkerrors.Register(ModuleName, 34, "create with [do-not-modify] content")
ErrSelfReferenceAsReporter = sdkerrors.Register(ModuleName, 35, "cannot reference self as reporter")
ErrOBIDecode = sdkerrors.Register(ModuleName, 36, "cannot obi decode")
)

// WrapMaxError wraps an error message with additional info of the current and max values.
Expand Down
2 changes: 1 addition & 1 deletion chain/x/oracle/types/querier.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@ type QueryCountsResult struct {
type QueryRequestResult struct {
Request Request `json:"request"`
Reports []Report `json:"reports"`
Result []byte `json:"result"` // TODO: Update to richer data type.
Result *Result `json:"result"`
}
7 changes: 7 additions & 0 deletions chain/x/oracle/types/result.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package types

// Result is the struct for meaning result
type Result struct {
RequestPacketData OracleRequestPacketData
ResponsePacketData OracleResponsePacketData
}

0 comments on commit 7afe3bd

Please sign in to comment.