Skip to content

Commit 2bd6f53

Browse files
committed
feat(dataverse): implement get resource gov addr
1 parent 9b2e1e3 commit 2bd6f53

File tree

3 files changed

+116
-7
lines changed

3 files changed

+116
-7
lines changed

dataverse/client.go

+44-7
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package dataverse
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
6-
7+
cgschema "github.com/axone-protocol/axone-contract-schema/go/cognitarium-schema/v5"
78
dvschema "github.com/axone-protocol/axone-contract-schema/go/dataverse-schema/v5"
89
"google.golang.org/grpc"
910
)
@@ -14,18 +15,20 @@ type Client interface {
1415
}
1516

1617
type client struct {
17-
dataverseClient dvschema.QueryClient
18-
cognitariumAddr string
18+
dataverseClient dvschema.QueryClient
19+
cognitariumClient cgschema.QueryClient
20+
cognitariumAddr string
1921
}
2022

21-
func NewDataverseClient(ctx context.Context, dataverseClient dvschema.QueryClient) (Client, error) {
23+
func NewDataverseClient(ctx context.Context, dataverseClient dvschema.QueryClient, cognitariumClient cgschema.QueryClient) (Client, error) {
2224
cognitariumAddr, err := getCognitariumAddr(ctx, dataverseClient)
2325
if err != nil {
2426
return nil, fmt.Errorf("failed to get cognitarium address: %w", err)
2527
}
2628

2729
return &client{
2830
dataverseClient,
31+
cognitariumClient,
2932
cognitariumAddr,
3033
}, nil
3134
}
@@ -39,11 +42,45 @@ func NewClient(ctx context.Context,
3942
return nil, fmt.Errorf("failed to create dataverse client: %w", err)
4043
}
4144

42-
return NewDataverseClient(ctx, dataverseClient)
45+
cognitariumAddr, err := getCognitariumAddr(ctx, dataverseClient)
46+
if err != nil {
47+
return nil, fmt.Errorf("failed to get cognitarium address: %w", err)
48+
}
49+
50+
cognitariumClient, err := cgschema.NewQueryClient(grpcAddr, cognitariumAddr, opts...)
51+
if err != nil {
52+
return nil, fmt.Errorf("failed to create cognitarium client: %w", err)
53+
}
54+
55+
return &client{
56+
dataverseClient,
57+
cognitariumClient,
58+
cognitariumAddr,
59+
}, nil
4360
}
4461

45-
func (c *client) GetResourceGovAddr(_ context.Context, _ string) (string, error) {
46-
panic("not implemented")
62+
func (c *client) GetResourceGovAddr(_ context.Context, resourceDID string) (string, error) {
63+
query := buildGetResourceGovAddrRequest(resourceDID)
64+
queryB, _ := json.Marshal(query)
65+
fmt.Printf("query : %s", queryB)
66+
response, err := c.cognitariumClient.Select(context.Background(), &cgschema.QueryMsg_Select{Query: query})
67+
if err != nil {
68+
return "", err
69+
}
70+
71+
if len(response.Results.Bindings) != 1 {
72+
return "", fmt.Errorf("could not find governance code")
73+
}
74+
75+
codeBinding, ok := response.Results.Bindings[0]["code"]
76+
if !ok {
77+
return "", fmt.Errorf("could not find governance code")
78+
}
79+
code, ok := codeBinding.ValueType.(cgschema.URI)
80+
if !ok {
81+
return "", fmt.Errorf("could not decode governance code")
82+
}
83+
return string(*code.Value.Full), nil
4784
}
4885

4986
func (c *client) ExecGov(_ context.Context, _ string, _ string) (interface{}, error) {

dataverse/predicate.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dataverse
2+
3+
import cgschema "github.com/axone-protocol/axone-contract-schema/go/cognitarium-schema/v5"
4+
5+
var (
6+
VcBodySubject = cgschema.IRI_Full("dataverse:credential:body#subject")
7+
VcBodyType = cgschema.IRI_Full("dataverse:credential:body#type")
8+
VcBodyClaim = cgschema.IRI_Full("dataverse:credential:body#claim")
9+
)

dataverse/query.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dataverse
2+
3+
import cgschema "github.com/axone-protocol/axone-contract-schema/go/cognitarium-schema/v5"
4+
5+
func buildGetResourceGovAddrRequest(resource string) cgschema.SelectQuery {
6+
limit := 1
7+
selectVar := cgschema.SelectItem_Variable("code")
8+
codeVarOrNodeOrLit := cgschema.VarOrNodeOrLiteral_Variable("code")
9+
credId := cgschema.VarOrNode_Variable("credId")
10+
resourceIRI := cgschema.IRI_Full(resource)
11+
govType := cgschema.IRI_Prefixed("gov:GovernanceTextCredential")
12+
claimVar := cgschema.VarOrNode_Variable("claim")
13+
claimVarOrNode := cgschema.VarOrNodeOrLiteral_Variable("claim")
14+
isGovernedBy := cgschema.IRI_Prefixed("gov:isGovernedBy")
15+
fromGovernance := cgschema.IRI_Prefixed("gov:fromGovernance")
16+
govVarOrNodeOrLit := cgschema.VarOrNodeOrLiteral_Variable("gov")
17+
govVar := cgschema.VarOrNode_Variable("gov")
18+
return cgschema.SelectQuery{
19+
Limit: &limit,
20+
Prefixes: []cgschema.Prefix{
21+
{
22+
Prefix: "gov",
23+
Namespace: "https://w3id.org/axone/ontology/v4/schema/credential/governance/text/",
24+
},
25+
},
26+
Select: []cgschema.SelectItem{
27+
{
28+
Variable: &selectVar,
29+
},
30+
},
31+
Where: cgschema.WhereClause{
32+
Bgp: &cgschema.WhereClause_Bgp{
33+
Patterns: []cgschema.TriplePattern{
34+
{
35+
Subject: cgschema.VarOrNode{Variable: &credId},
36+
Predicate: cgschema.VarOrNamedNode{NamedNode: &cgschema.VarOrNamedNode_NamedNode{Full: &VcBodySubject}},
37+
Object: cgschema.VarOrNodeOrLiteral{Node: &cgschema.VarOrNodeOrLiteral_Node{NamedNode: &cgschema.Node_NamedNode{Full: &resourceIRI}}},
38+
},
39+
{
40+
Subject: cgschema.VarOrNode{Variable: &credId},
41+
Predicate: cgschema.VarOrNamedNode{NamedNode: &cgschema.VarOrNamedNode_NamedNode{Full: &VcBodyType}},
42+
Object: cgschema.VarOrNodeOrLiteral{Node: &cgschema.VarOrNodeOrLiteral_Node{NamedNode: &cgschema.Node_NamedNode{Prefixed: &govType}}},
43+
},
44+
{
45+
Subject: cgschema.VarOrNode{Variable: &credId},
46+
Predicate: cgschema.VarOrNamedNode{NamedNode: &cgschema.VarOrNamedNode_NamedNode{Full: &VcBodyClaim}},
47+
Object: cgschema.VarOrNodeOrLiteral{Variable: &claimVarOrNode},
48+
},
49+
{
50+
Subject: cgschema.VarOrNode{Variable: &claimVar},
51+
Predicate: cgschema.VarOrNamedNode{NamedNode: &cgschema.VarOrNamedNode_NamedNode{Prefixed: &isGovernedBy}},
52+
Object: cgschema.VarOrNodeOrLiteral{Variable: &govVarOrNodeOrLit},
53+
},
54+
{
55+
Subject: cgschema.VarOrNode{Variable: &govVar},
56+
Predicate: cgschema.VarOrNamedNode{NamedNode: &cgschema.VarOrNamedNode_NamedNode{Prefixed: &fromGovernance}},
57+
Object: cgschema.VarOrNodeOrLiteral{Variable: &codeVarOrNodeOrLit},
58+
},
59+
},
60+
},
61+
},
62+
}
63+
}

0 commit comments

Comments
 (0)