gql -> rpc dag-json encoding

This commit is contained in:
Roy Crihfield 2023-10-18 19:03:21 -05:00
parent cdbb267520
commit 7a11a7c66d
4 changed files with 42 additions and 50 deletions

View File

@ -121,7 +121,7 @@ func (q queryResolver) QueryRecords(ctx context.Context, attributes []*KeyValueI
res, err := nsQueryClient.ListRecords( res, err := nsQueryClient.ListRecords(
context.Background(), context.Background(),
&registrytypes.QueryListRecordsRequest{ &registrytypes.QueryListRecordsRequest{
Attributes: parseRequestAttributes(attributes), Attributes: toRpcAttributes(attributes),
All: (all != nil && *all), All: (all != nil && *all),
}, },
) )

View File

@ -256,60 +256,43 @@ func GetGQLAuction(auction *auctiontypes.Auction, bids []*auctiontypes.Bid) (*Au
return &gqlAuction, nil return &gqlAuction, nil
} }
func parseRequestValue(value *ValueInput) *registrytypes.QueryListRecordsRequest_ValueInput { func toRpcValue(value *ValueInput) *registrytypes.QueryListRecordsRequest_ValueInput {
if value == nil { var rpcval registrytypes.QueryListRecordsRequest_ValueInput
switch {
case value == nil:
return nil return nil
case value.Int != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Int{int64(*value.Int)}
case value.Float != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Float{*value.Float}
case value.String != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_String_{*value.String}
case value.Boolean != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Boolean{*value.Boolean}
case value.Link != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Link{value.Link.String()}
case value.Array != nil:
var contents registrytypes.QueryListRecordsRequest_ArrayInput
for _, val := range value.Array {
contents.Values = append(contents.Values, toRpcValue(val))
} }
var val registrytypes.QueryListRecordsRequest_ValueInput rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Array{&contents}
case value.Map != nil:
if value.String != nil { var contents registrytypes.QueryListRecordsRequest_MapInput
val.String_ = *value.String for _, kv := range value.Map {
val.Type = "string" contents.Values[kv.Key] = toRpcValue(kv.Value)
} }
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Map{&contents}
if value.Int != nil {
val.Int = int64(*value.Int)
val.Type = "int"
} }
return &rpcval
if value.Float != nil {
val.Float = *value.Float
val.Type = "float"
}
if value.Boolean != nil {
val.Boolean = *value.Boolean
val.Type = "boolean"
}
if value.Link != nil {
reference := &registrytypes.QueryListRecordsRequest_ReferenceInput{
Id: value.Link.String(),
}
val.Reference = reference
val.Type = "reference"
}
// handle arrays
if value.Array != nil {
values := []*registrytypes.QueryListRecordsRequest_ValueInput{}
for _, v := range value.Array {
val := parseRequestValue(v)
values = append(values, val)
}
val.Values = values
val.Type = "array"
}
return &val
} }
func parseRequestAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput { func toRpcAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput {
kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{} kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{}
for _, value := range attrs { for _, value := range attrs {
parsedValue := parseRequestValue(value.Value) parsedValue := toRpcValue(value.Value)
kvPair := &registrytypes.QueryListRecordsRequest_KeyValueInput{ kvPair := &registrytypes.QueryListRecordsRequest_KeyValueInput{
Key: value.Key, Key: value.Key,
Value: parsedValue, Value: parsedValue,

View File

@ -68,8 +68,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
{ {
Key: "type", Key: "type",
Value: &registrytypes.QueryListRecordsRequest_ValueInput{ Value: &registrytypes.QueryListRecordsRequest_ValueInput{
Type: "string", Value: &registrytypes.QueryListRecordsRequest_ValueInput_String_{"WebsiteRegistrationRecord"},
String_: "WebsiteRegistrationRecord",
}, },
}, },
}, },
@ -86,8 +85,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
{ {
Key: "x500state_name", Key: "x500state_name",
Value: &registrytypes.QueryListRecordsRequest_ValueInput{ Value: &registrytypes.QueryListRecordsRequest_ValueInput{
Type: "string", Value: &registrytypes.QueryListRecordsRequest_ValueInput_String_{"california"},
String_: "california",
}, },
}, },
}, },

View File

@ -21,6 +21,9 @@ import (
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/log"
"github.com/ipld/go-ipld-prime/codec/dagjson"
basicnode "github.com/ipld/go-ipld-prime/node/basic"
) )
var ( var (
@ -336,6 +339,14 @@ func (k Keeper) PutRecord(ctx sdk.Context, record types.Record) {
} }
func (k Keeper) processAttributes(ctx sdk.Context, attrs map[string]any, id string, prefix string) error { func (k Keeper) processAttributes(ctx sdk.Context, attrs map[string]any, id string, prefix string) error {
np := basicnode.Prototype.Any // Pick a stle for the in-memory data.
nb := np.NewBuilder() // Create a builder.
err := dagjson.Decode(nb, bytes.NewReader(content)) // Hand the builder to decoding -- decoding will fill it in!
if err != nil {
return "", err
}
n := nb.Build() // Call 'Build' to get the resulting Node. (It's immutable!)
for key, value := range attrs { for key, value := range attrs {
if subRecord, ok := value.(map[string]any); ok { if subRecord, ok := value.(map[string]any); ok {
k.processAttributes(ctx, subRecord, id, key) k.processAttributes(ctx, subRecord, id, key)