diff --git a/docs/docs.go b/docs/docs.go index 08cfa205..287ae39a 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -96,6 +96,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -168,6 +174,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -234,6 +246,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -301,6 +319,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -368,6 +392,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -435,6 +465,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -507,6 +543,12 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } diff --git a/docs/swagger.json b/docs/swagger.json index 2aee370c..2a33af34 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -94,6 +94,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -166,6 +172,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -232,6 +244,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -299,6 +317,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -366,6 +390,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -433,6 +463,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } @@ -505,6 +541,12 @@ "schema": { "$ref": "#/definitions/types.IdentityError" } + }, + "501": { + "description": "Not Implemented", + "schema": { + "$ref": "#/definitions/types.IdentityError" + } } } } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index ea4e9b72..16f3f41b 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -308,6 +308,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Resolve DID Document on did:cheqd tags: - DID Resolution @@ -354,6 +358,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Fetch metadata for all Resources tags: - Resource Resolution @@ -398,6 +406,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Fetch specific Resource tags: - Resource Resolution @@ -444,6 +456,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Fetch Resource-specific metadata tags: - Resource Resolution @@ -491,6 +507,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Resolve DID Document Version on did:cheqd tags: - DID Resolution @@ -538,6 +558,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Resolve DID Document Version Metadata on did:cheqd tags: - DID Resolution @@ -585,6 +609,10 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/types.IdentityError' + "501": + description: Not Implemented + schema: + $ref: '#/definitions/types.IdentityError' summary: Resolve DID Document Versions on did:cheqd tags: - DID Resolution diff --git a/services/ledger_service.go b/services/ledger_service.go index 6d48f3da..d8c04859 100644 --- a/services/ledger_service.go +++ b/services/ledger_service.go @@ -54,6 +54,7 @@ func NewLedgerService() LedgerService { // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did} [get] func (ls LedgerService) QueryDIDDoc(did string, version string) (*didTypes.DidDocWithMetadata, *types.IdentityError) { @@ -103,6 +104,7 @@ func (ls LedgerService) QueryDIDDoc(did string, version string) (*didTypes.DidDo // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/versions [get] func (ls LedgerService) QueryAllDidDocVersionsMetadata(did string) ([]*didTypes.Metadata, *types.IdentityError) { @@ -143,6 +145,7 @@ func (ls LedgerService) QueryAllDidDocVersionsMetadata(did string) ([]*didTypes. // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/resources/{resourceId} [get] func (ls LedgerService) QueryResource(did string, resourceId string) (*resourceTypes.ResourceWithMetadata, *types.IdentityError) { @@ -184,6 +187,7 @@ func (ls LedgerService) QueryResource(did string, resourceId string) (*resourceT // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/metadata [get] func (ls LedgerService) QueryCollectionResources(did string) ([]*resourceTypes.Metadata, *types.IdentityError) { diff --git a/services/request_service.go b/services/request_service.go index be97d424..bc5c0a72 100644 --- a/services/request_service.go +++ b/services/request_service.go @@ -37,36 +37,23 @@ func (rs RequestService) ResolveDIDDoc(c echo.Context) error { return types.NewInvalidDIDUrlError(splitDID[0], requestedContentType, err, true) } + didMethod, _, identifier, _ := types.TrySplitDID(did) + if didMethod != rs.didDocService.didMethod { + return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) + } + var fragmentId string if len(splitDID) == 2 { fragmentId = splitDID[1] } queryRaw, flag := prepareQueries(c) - queries, err := url.ParseQuery(queryRaw) - if err != nil { - return err - } - - didMethod, _, identifier, _ := types.TrySplitDID(did) - if didMethod != rs.didDocService.didMethod { - return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) - } - //nolint: nestif if !utils.IsValidDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) { err := utils.ValidateDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) if err.Error() == types.NewInvalidIdentifierError().Error() && utils.IsMigrationNeeded(identifier) { did = migrations.MigrateDID(did) - path := types.RESOLVER_PATH + did - - if fragmentId != "" { - path += url.PathEscape(fmt.Sprintf("#%s", fragmentId)) - } - - if queryRaw != "" { - path += fmt.Sprintf("?%s", queryRaw) - } + path := types.RESOLVER_PATH + did + getQuery(queryRaw) + getFragment(fragmentId) return c.Redirect(http.StatusMovedPermanently, path) } else { @@ -74,6 +61,11 @@ func (rs RequestService) ResolveDIDDoc(c echo.Context) error { } } + queries, err := url.ParseQuery(queryRaw) + if err != nil { + return err + } + result, rErr := rs.didDocService.ProcessDIDRequest(did, fragmentId, queries, flag, requestedContentType) if rErr != nil { return rErr @@ -92,13 +84,16 @@ func (rs RequestService) ResolveDIDDocVersion(c echo.Context) error { return types.NewInvalidDIDUrlError(c.Param("did"), requestedContentType, err, true) } - version := c.Param("version") - didMethod, _, identifier, _ := types.TrySplitDID(did) if didMethod != rs.didDocService.didMethod { return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) } + version := c.Param("version") + if !utils.IsValidUUID(version) { + return types.NewInvalidDIDUrlError(c.Param("version"), requestedContentType, err, true) + } + if !utils.IsValidDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) { err := utils.ValidateDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) if err.Error() == types.NewInvalidIdentifierError().Error() && utils.IsMigrationNeeded(identifier) { @@ -134,6 +129,7 @@ func (rs RequestService) ResolveDIDDocVersion(c echo.Context) error { // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/version/{versionId}/metadata [get] func (rs RequestService) ResolveDIDDocVersionMetadata(c echo.Context) error { @@ -144,13 +140,16 @@ func (rs RequestService) ResolveDIDDocVersionMetadata(c echo.Context) error { return types.NewInvalidDIDUrlError(c.Param("did"), requestedContentType, err, true) } - version := c.Param("version") - didMethod, _, identifier, _ := types.TrySplitDID(did) if didMethod != rs.didDocService.didMethod { return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) } + version := c.Param("version") + if !utils.IsValidUUID(version) { + return types.NewInvalidDIDUrlError(c.Param("version"), requestedContentType, err, true) + } + if !utils.IsValidDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) { err := utils.ValidateDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) if err.Error() == types.NewInvalidIdentifierError().Error() && utils.IsMigrationNeeded(identifier) { @@ -186,6 +185,7 @@ func (rs RequestService) ResolveDIDDocVersionMetadata(c echo.Context) error { // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/version/{versionId} [get] func (rs RequestService) ResolveAllDidDocVersionsMetadata(c echo.Context) error { @@ -235,6 +235,7 @@ func (rs RequestService) ResolveAllDidDocVersionsMetadata(c echo.Context) error // @Failure 400 {object} types.IdentityError // @Failure 404 {object} types.IdentityError // @Failure 406 {object} types.IdentityError +// @Failure 501 {object} types.IdentityError // @Failure 500 {object} types.IdentityError // @Router /{did}/resources/{resourceId}/metadata [get] func (rs RequestService) DereferenceResourceMetadata(c echo.Context) error { @@ -243,13 +244,17 @@ func (rs RequestService) DereferenceResourceMetadata(c echo.Context) error { if err != nil { return types.NewInvalidDIDUrlError(c.Param("did"), requestedContentType, err, true) } - resourceId := c.Param("resource") didMethod, _, identifier, _ := types.TrySplitDID(did) if didMethod != rs.didDocService.didMethod { return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) } + resourceId := c.Param("resource") + if !utils.IsValidUUID(resourceId) { + return types.NewInvalidDIDUrlError(c.Param("resource"), requestedContentType, err, true) + } + if !utils.IsValidDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) { err := utils.ValidateDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) if err.Error() == types.NewInvalidIdentifierError().Error() && utils.IsMigrationNeeded(identifier) { @@ -279,13 +284,17 @@ func (rs RequestService) DereferenceResourceData(c echo.Context) error { if err != nil { return types.NewInvalidDIDUrlError(c.Param("did"), requestedContentType, err, true) } - resourceId := c.Param("resource") didMethod, _, identifier, _ := types.TrySplitDID(did) if didMethod != rs.didDocService.didMethod { return types.NewMethodNotSupportedError(did, requestedContentType, nil, false) } + resourceId := c.Param("resource") + if !utils.IsValidUUID(resourceId) { + return types.NewInvalidDIDUrlError(c.Param("resource"), requestedContentType, err, true) + } + if !utils.IsValidDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) { err := utils.ValidateDID(did, "", rs.didDocService.ledgerService.GetNamespaces()) if err.Error() == types.NewInvalidIdentifierError().Error() && utils.IsMigrationNeeded(identifier) { @@ -373,3 +382,19 @@ func prepareQueries(c echo.Context) (rawQuery string, flag *string) { func getDidParam(c echo.Context) (string, error) { return url.QueryUnescape(c.Param("did")) } + +func getQuery(queryRaw string) (query string) { + if queryRaw != "" { + query += fmt.Sprintf("?%s", queryRaw) + } + + return query +} + +func getFragment(fragmentId string) (fragment string) { + if fragmentId != "" { + fragment += url.PathEscape(fmt.Sprintf("#%s", fragmentId)) + } + + return fragment +} diff --git a/tests/pytest/test_resolution.py b/tests/pytest/test_resolution.py index b59a61c5..cc40b51b 100644 --- a/tests/pytest/test_resolution.py +++ b/tests/pytest/test_resolution.py @@ -207,7 +207,7 @@ def test_dereferencing_content_type_resource(accept, expected_header, expected_s (helpers.FAKE_TESTNET_FRAGMENT_1, 404), (helpers.FAKE_TESTNET_FRAGMENT_2, 404), (helpers.FAKE_TESTNET_RESOURCE, 404), - ("did:wrong_method:MTMxDQKMTMxDQKMT", 406), + ("did:wrong_method:MTMxDQKMTMxDQKMT", 501), (helpers.TESTNET_DID + "/", 400), (helpers.TESTNET_DID + "invalidDID", 400), ] diff --git a/types/did_doc_metadata.go b/types/did_doc_metadata.go index 87674afc..1dca86bb 100644 --- a/types/did_doc_metadata.go +++ b/types/did_doc_metadata.go @@ -5,6 +5,7 @@ import ( didTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/did/v2" resourceTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/resource/v2" + "google.golang.org/protobuf/types/known/timestamppb" ) type ResolutionDidDocMetadata struct { @@ -16,11 +17,12 @@ type ResolutionDidDocMetadata struct { } func NewResolutionDidDocMetadata(did string, metadata *didTypes.Metadata, resources []*resourceTypes.Metadata) ResolutionDidDocMetadata { - created := metadata.Created.AsTime() - updated := metadata.Updated.AsTime() + created := toTime(metadata.Created) + updated := toTime(metadata.Updated) + newMetadata := ResolutionDidDocMetadata{ - Created: &created, - Updated: &updated, + Created: created, + Updated: updated, Deactivated: metadata.Deactivated, VersionId: metadata.VersionId, } @@ -41,3 +43,14 @@ func TransformToFragmentMetadata(metadata ResolutionDidDocMetadata) ResolutionDi func (e *ResolutionDidDocMetadata) AddContext(newProtocol string) {} func (e *ResolutionDidDocMetadata) RemoveContext() {} func (e *ResolutionDidDocMetadata) GetBytes() []byte { return []byte{} } + +func toTime(value *timestamppb.Timestamp) (result *time.Time) { + if value.AsTime().IsZero() { + result = nil + } else { + value := value.AsTime() + result = &value + } + + return result +} diff --git a/types/errors.go b/types/errors.go index 25b874a2..b66f3f70 100644 --- a/types/errors.go +++ b/types/errors.go @@ -65,7 +65,7 @@ func NewRepresentationNotSupportedError(did string, contentType ContentType, err } func NewMethodNotSupportedError(did string, contentType ContentType, err error, isDereferencing bool) *IdentityError { - return NewIdentityError(406, "methodNotSupported", isDereferencing, did, contentType, err) + return NewIdentityError(501, "methodNotSupported", isDereferencing, did, contentType, err) } func NewInternalError(did string, contentType ContentType, err error, isDereferencing bool) *IdentityError {