Skip to content

Commit

Permalink
fix: Fix jsonld errors in didDocument [DEV-4360] (#297)
Browse files Browse the repository at this point in the history
* fix: Fix jsonld errors in didDocument

* fix lint errors

* fix unit tests

* fix integration tests

* make tidy, stick to go 1.21.x

* Update lint.yml

* Update lint.yml

* Revert "make tidy, stick to go 1.21.x"

This reverts commit 5abd88b.

* Update go.mod

* Update lint.yml

* Add context only for LinkedDomains

* fix unit tests

* Rename to LinkedDomainsJSONLD

---------

Co-authored-by: Ankur Banerjee <ankurdotb@users.noreply.github.com>
  • Loading branch information
DaevMithran and ankurdotb committed Sep 10, 2024
1 parent b516be8 commit eae9120
Show file tree
Hide file tree
Showing 20 changed files with 548 additions and 564 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## ℹ️ Overview

DID methods are expected to provide [standards-compliant methods of DID and DID Document ("DIDDoc") production](https://w3c.github.io/did-core/#production-and-consumption). The **cheqd DID Resolver** is designed to implement the [W3C DID *Resolution* specification](https://w3c.github.io/did-resolution/) for [`did:cheqd`](https://docs.cheqd.io/identity/architecture/adr-list/adr-001-cheqd-did-method) method.
DID methods are expected to provide [standards-compliant methods of DID and DID Document ("DIDDoc") production](https://w3c.github.io/did-core/#production-and-consumption). The **cheqd DID Resolver** is designed to implement the [W3C DID _Resolution_ specification](https://w3c.github.io/did-resolution/) for [`did:cheqd`](https://docs.cheqd.io/identity/architecture/adr-list/adr-001-cheqd-did-method) method.

### 📝 Architecture

Expand Down Expand Up @@ -60,7 +60,7 @@ enable = true
address = "0.0.0.0:9090"
```

**Note**: If you're pointing a DID Resolver to your own node instance, by default `cheqd-node` instance gRPC endpoints are *not* served up with a TLS certificate. This means the `useTls` property would need to be set to `false`, unless you're otherwise using a load balancer that provides TLS connections to the gRPC port.
**Note**: If you're pointing a DID Resolver to your own node instance, by default `cheqd-node` instance gRPC endpoints are _not_ served up with a TLS certificate. This means the `useTls` property would need to be set to `false`, unless you're otherwise using a load balancer that provides TLS connections to the gRPC port.

## 🧑‍💻 Building your own Docker image

Expand All @@ -87,7 +87,7 @@ image: did-resolver:local

Make sure you comment out the pre-existing `image` property that pulls in a container image from Github Container Registry, as shown above.

You can also do *just* a build with:
You can also do _just_ a build with:

```bash
docker-compose -f docker/docker-compose.yml --env-file docker/docker-compose.env build --no-cache
Expand Down Expand Up @@ -191,7 +191,7 @@ You can execute the tests as long as you have Ginkgo CLI installed, which target
ginkgo -r --tags integration --race --randomize-suites --keep-going --trace
```

**Note**: By default, the tests target `localhost:8080` as the port where it expects the running DID Resolver instance for testing. If your running instance is at a different address, you can override this by setting a value for the `TEST_HOST_ADDRESS` environment variable *before* executing the Ginkgo test suite.
**Note**: By default, the tests target `localhost:8080` as the port where it expects the running DID Resolver instance for testing. If your running instance is at a different address, you can override this by setting a value for the `TEST_HOST_ADDRESS` environment variable _before_ executing the Ginkgo test suite.

```bash
export TEST_HOST_ADDRESS="where.is.did.resolver.running:port"
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module github.com/cheqd/did-resolver

go 1.21

toolchain go1.21.0
toolchain go1.21.13

require (
github.com/cheqd/cheqd-node/api/v2 v2.2.0
Expand Down
10 changes: 9 additions & 1 deletion services/diddoc_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ func (dds DIDDocService) Resolve(did string, version string, contentType types.C
result := types.DidResolution{Did: &didDoc, Metadata: *resolvedMetadata, ResolutionMetadata: didResolutionMetadata}
if didResolutionMetadata.ContentType == types.DIDJSONLD || didResolutionMetadata.ContentType == types.JSONLD {
didDoc.AddContext(types.DIDSchemaJSONLD)

for _, service := range didDoc.Service {
if service.Type == types.LinkedDomains {
didDoc.AddContext(types.LinkedDomainsJSONLD)
break
}
}

for _, method := range didDoc.VerificationMethod {
switch method.Type {
case "Ed25519VerificationKey2020":
Expand Down Expand Up @@ -164,7 +172,7 @@ func (dds DIDDocService) DereferenceSecondary(did string, version string, fragme
return &result, nil
}

func (dds DIDDocService) resolveMetadata(did string, metadata *didTypes.Metadata, contentType types.ContentType) (*types.ResolutionDidDocMetadata, *types.IdentityError) {
func (dds DIDDocService) resolveMetadata(did string, metadata *didTypes.Metadata, _ types.ContentType) (*types.ResolutionDidDocMetadata, *types.IdentityError) {
resources, err := dds.ledgerService.QueryCollectionResources(did)
if err != nil {
return nil, err
Expand Down
3 changes: 2 additions & 1 deletion tests/constants/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

didTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/did/v2"
resourceTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/resource/v2"
"github.com/cheqd/did-resolver/types"
"google.golang.org/protobuf/types/known/timestamppb"
)

Expand All @@ -22,7 +23,7 @@ func generateVerificationMethod() didTypes.VerificationMethod {
func generateService() didTypes.Service {
return didTypes.Service{
Id: ExistentDid + "#" + ValidServiceId,
ServiceType: "DIDCommMessaging",
ServiceType: types.LinkedDomains,
ServiceEndpoint: []string{"http://example.com"},
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN",
Expand All @@ -23,16 +24,12 @@
"publicKeyMultibase": "z6Mkta7joRuvDh7UnoESdgpr9dDUMh5LvdoECDi3WGrJoscA"
}
],
"authentication": [
"did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#key1"
],
"authentication": ["did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#key1"],
"service": [
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#website",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://www.cheqd.io"
]
"serviceEndpoint": ["https://www.cheqd.io"]
},
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#non-fungible-image",
Expand All @@ -44,16 +41,12 @@
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#twitter",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://twitter.com/cheqd_io"
]
"serviceEndpoint": ["https://twitter.com/cheqd_io"]
},
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#linkedin",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://www.linkedin.com/company/cheqd-identity/"
]
"serviceEndpoint": ["https://www.linkedin.com/company/cheqd-identity/"]
}
]
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,61 +1,60 @@
{
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T14:51:09Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://bar.example.com"
]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:59:22Z",
"deactivated": true,
"versionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T14:51:09Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": ["https://bar.example.com"]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:59:22Z",
"deactivated": true,
"versionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
}
}
Original file line number Diff line number Diff line change
@@ -1,62 +1,61 @@
{
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T15:00:53Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://bar.example.com"
]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:39:48Z",
"deactivated": true,
"versionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"nextVersionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "0ce23d04-5b67-4ea6-a315-788588e53f4e",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T15:00:53Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": ["https://bar.example.com"]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:39:48Z",
"deactivated": true,
"versionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"nextVersionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "0ce23d04-5b67-4ea6-a315-788588e53f4e",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
}
}
Loading

0 comments on commit eae9120

Please sign in to comment.