Graphql schema for DAG-JSON objects #112
@ -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(),
|
||||||
®istrytypes.QueryListRecordsRequest{
|
®istrytypes.QueryListRecordsRequest{
|
||||||
Attributes: parseRequestAttributes(attributes),
|
Attributes: toRpcAttributes(attributes),
|
||||||
All: (all != nil && *all),
|
All: (all != nil && *all),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
73
gql/util.go
73
gql/util.go
@ -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:
|
||||||
var val registrytypes.QueryListRecordsRequest_ValueInput
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Int{int64(*value.Int)}
|
||||||
|
case value.Float != nil:
|
||||||
if value.String != nil {
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Float{*value.Float}
|
||||||
val.String_ = *value.String
|
case value.String != nil:
|
||||||
val.Type = "string"
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_String_{*value.String}
|
||||||
}
|
case value.Boolean != nil:
|
||||||
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Boolean{*value.Boolean}
|
||||||
if value.Int != nil {
|
case value.Link != nil:
|
||||||
val.Int = int64(*value.Int)
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Link{value.Link.String()}
|
||||||
val.Type = "int"
|
case value.Array != nil:
|
||||||
}
|
var contents registrytypes.QueryListRecordsRequest_ArrayInput
|
||||||
|
for _, val := range value.Array {
|
||||||
if value.Float != nil {
|
contents.Values = append(contents.Values, toRpcValue(val))
|
||||||
val.Float = *value.Float
|
|
||||||
val.Type = "float"
|
|
||||||
}
|
|
||||||
|
|
||||||
if value.Boolean != nil {
|
|
||||||
val.Boolean = *value.Boolean
|
|
||||||
val.Type = "boolean"
|
|
||||||
}
|
|
||||||
|
|
||||||
if value.Link != nil {
|
|
||||||
reference := ®istrytypes.QueryListRecordsRequest_ReferenceInput{
|
|
||||||
Id: value.Link.String(),
|
|
||||||
}
|
}
|
||||||
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Array{&contents}
|
||||||
val.Reference = reference
|
case value.Map != nil:
|
||||||
val.Type = "reference"
|
var contents registrytypes.QueryListRecordsRequest_MapInput
|
||||||
}
|
for _, kv := range value.Map {
|
||||||
|
contents.Values[kv.Key] = toRpcValue(kv.Value)
|
||||||
// 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
|
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Map{&contents}
|
||||||
val.Type = "array"
|
|
||||||
}
|
}
|
||||||
|
return &rpcval
|
||||||
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 := ®istrytypes.QueryListRecordsRequest_KeyValueInput{
|
kvPair := ®istrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
Key: value.Key,
|
Key: value.Key,
|
||||||
Value: parsedValue,
|
Value: parsedValue,
|
||||||
|
@ -68,8 +68,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
{
|
{
|
||||||
Key: "type",
|
Key: "type",
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
Type: "string",
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput_String_{"WebsiteRegistrationRecord"},
|
||||||
String_: "WebsiteRegistrationRecord",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -86,8 +85,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
{
|
{
|
||||||
Key: "x500state_name",
|
Key: "x500state_name",
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
Type: "string",
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput_String_{"california"},
|
||||||
String_: "california",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user