From 9bb5beb620c11e8de87a45dcb9f3fa0e46925bcf Mon Sep 17 00:00:00 2001 From: toktar Date: Mon, 27 Jun 2022 19:45:48 +0300 Subject: [PATCH] Add Resource dereferencing --- services/ledger_service.go | 54 ++++++++++++++++++++++++++++++------- services/request_service.go | 23 +++++++++++++--- types/constants.go | 6 ++--- 3 files changed, 66 insertions(+), 17 deletions(-) diff --git a/services/ledger_service.go b/services/ledger_service.go index 32d16bb1..9ff040eb 100644 --- a/services/ledger_service.go +++ b/services/ledger_service.go @@ -10,6 +10,7 @@ import ( "google.golang.org/grpc/credentials" cheqd "github.com/cheqd/cheqd-node/x/cheqd/types" + resource "github.com/cheqd/cheqd-node/x/resource/types" cheqdUtils "github.com/cheqd/cheqd-node/x/cheqd/utils" "github.com/rs/zerolog/log" "google.golang.org/grpc" @@ -43,21 +44,12 @@ func (ls LedgerService) QueryDIDDoc(did string) (cheqd.Did, cheqd.Metadata, bool return cheqd.Did{}, cheqd.Metadata{}, false, fmt.Errorf("namespace not supported: %s", namespace) } - log.Info().Msgf("Connecting to the ledger: %s", serverAddr) - conn, err := ls.openGRPCConnection(serverAddr) + conn, err := ls.openConnection(serverAddr); if err != nil { log.Error().Err(err).Msg("QueryDIDDoc: failed connection") return cheqd.Did{}, cheqd.Metadata{}, false, err } - defer func(conn *grpc.ClientConn) { - err := conn.Close() - if err != nil { - log.Panic().Err(err).Msg("QueryDIDDoc: failed to close connection") - panic(err) - } - }(conn) - log.Info().Msgf("Querying did doc: %s", did) client := cheqd.NewQueryClient(conn) didDocResponse, err := client.Did(context.Background(), &cheqd.QueryGetDidRequest{Id: did}) @@ -68,6 +60,48 @@ func (ls LedgerService) QueryDIDDoc(did string) (cheqd.Did, cheqd.Metadata, bool return *didDocResponse.Did, *didDocResponse.Metadata, true, err } +func (ls LedgerService) QueryResource(collectionDid string, resourceId string) (resource.Resource, bool, error) { + collectionId, namespace, _, _ := cheqdUtils.TrySplitDID(collectionDid) + serverAddr, namespaceFound := ls.ledgers[namespace] + if !namespaceFound { + return cheqd.Did{}, false, fmt.Errorf("namespace not supported: %s", namespace) + } + + conn, err := ls.openConnection(serverAddr); + if err != nil { + log.Error().Err(err).Msg("QueryResource: failed connection") + return resource.Resource{}, false, err + } + + log.Info().Msgf("Querying did resource: %s, %s", collectionDid, resourceId) + + client := resource.NewQueryClient(conn) + resourceResponse, err := client.Resource(context.Background(), &resource.QueryGetResourceRequest{CollectionId: collectionId, Id: resourceId}) + if err != nil { + return resource.Resource{}, false, nil + } + + return *resourceResponse.Resource, true, err +} + +func (ls LedgerService) openConnection(serverAddr string) (*grpc.ClientConn, error) { + log.Info().Msgf("Connecting to the ledger: %s", serverAddr) + conn, err := ls.openGRPCConnection(serverAddr) + if err != nil { + return nil, err + } + + defer func(conn *grpc.ClientConn) { + err := conn.Close() + if err != nil { + log.Panic().Err(err).Msg("QueryDIDDoc: failed to close connection") + panic(err) + } + }(conn) + + return conn, nil +} + func (ls *LedgerService) RegisterLedger(namespace string, url string) error { if namespace == "" { err := errors.New("namespace cannot be empty") diff --git a/services/request_service.go b/services/request_service.go index b631cc54..3c36225f 100644 --- a/services/request_service.go +++ b/services/request_service.go @@ -9,6 +9,8 @@ import ( cheqdUtils "github.com/cheqd/cheqd-node/x/cheqd/utils" "github.com/cheqd/did-resolver/types" + "github.com/cheqd/did-resolver/utils" + "google.golang.org/protobuf/runtime/protoiface" ) type RequestService struct { @@ -135,7 +137,7 @@ func (rs RequestService) Dereference(didUrl string, dereferenceOptions types.Der log.Info().Msgf("did: %s, path: %s, query: %s, fragmentId: %s", did, path, query, fragmentId) // TODO: implement - if path != "" || query != "" { + if query != "" { dereferencingMetadata := types.NewDereferencingMetadata(didUrl, dereferenceOptions.Accept, types.DereferencingNotSupported) return types.DidDereferencing{DereferencingMetadata: dereferencingMetadata}, nil } @@ -153,14 +155,27 @@ func (rs RequestService) Dereference(didUrl string, dereferenceOptions types.Der if dereferencingMetadata.ResolutionError != "" { return types.DidDereferencing{DereferencingMetadata: dereferencingMetadata}, nil } + var protoiface.MessageV1 contentStream + var protoiface.MessageV1 contentMetadata + if path != "" { + resourceId := utils.GetResourceId(path) + // Only `resource` path is supported + if resourceId == "" { + dereferencingMetadata := types.NewDereferencingMetadata(didUrl, dereferenceOptions.Accept, types.DereferencingNotSupported) + return types.DidDereferencing{DereferencingMetadata: dereferencingMetadata}, nil + } + contentStream = rs.didDocService.GetResource(collectionId, resourceId) + + } else if fragmentId != "" { + contentStream = rs.didDocService.GetDIDFragment(fragmentId, didResolution.Did) + contentMetadata = didResolution.Metadata + } - contentStream := rs.didDocService.GetDIDFragment(fragmentId, didResolution.Did) if contentStream == nil { - dereferencingMetadata := types.NewDereferencingMetadata(didUrl, dereferenceOptions.Accept, types.DereferencingFragmentNotFound) + dereferencingMetadata := types.NewDereferencingMetadata(didUrl, dereferenceOptions.Accept, types.DereferencingNotFound) return types.DidDereferencing{DereferencingMetadata: dereferencingMetadata}, nil } - contentMetadata := didResolution.Metadata return types.DidDereferencing{ContentStream: contentStream, Metadata: contentMetadata, DereferencingMetadata: dereferencingMetadata}, nil } diff --git a/types/constants.go b/types/constants.go index 4d552470..1cedacc1 100644 --- a/types/constants.go +++ b/types/constants.go @@ -9,9 +9,9 @@ const ( ) const ( - DereferencingInvalidDIDUrl ErrorType = "invalidDidUrl" - DereferencingFragmentNotFound ErrorType = "FragmentNotFound" - DereferencingNotSupported ErrorType = "NotSupportedUrl" + DereferencingInvalidDIDUrl ErrorType = "invalidDidUrl" + DereferencingNotFound ErrorType = "NotFound" + DereferencingNotSupported ErrorType = "NotSupportedUrl" ) type ContentType string