Skip to content

Commit

Permalink
Merge pull request #106 from DIMO-Network/intg-1461-decouple-cloudeve…
Browse files Browse the repository at this point in the history
…nt-header-from-stored-data

Handle single cloudevent wrapping
  • Loading branch information
KevinJoiner authored Jan 6, 2025
2 parents a159bad + 18676a2 commit c409408
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 16 deletions.
6 changes: 3 additions & 3 deletions e2e/setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,13 @@ func GetTestServices(t *testing.T) *TestServices {
}

func StoreSampleVC(ctx context.Context, idxSrv *indexrepo.Service, bucket string, testVC string) error {
event := cloudevent.CloudEvent[json.RawMessage]{}
err := json.Unmarshal([]byte(testVC), &event)
hdr := cloudevent.CloudEventHeader{}
err := json.Unmarshal([]byte(testVC), &hdr)
if err != nil {
return fmt.Errorf("failed to unmarshal VC: %w", err)
}

err = idxSrv.StoreCloudEvent(ctx, bucket, event)
err = idxSrv.StoreObject(ctx, bucket, &hdr, []byte(testVC))
if err != nil {
return fmt.Errorf("failed to store VC: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/vc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

func TestVINVCLatest(t *testing.T) {
const testVC = `{"id":"2oYEQJDQFRYCI1UIf6QTy92MS3G","source":"0x0000000000000000000000000000000000000000","producer":"did:nft:137:0x9c94C395cBcBDe662235E0A9d3bB87Ad708561BA_31653","specversion":"1.0","subject":"did:nft:137:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF_39718","time":"2024-11-08T03:54:51.291563165Z","type":"dimo.verifiablecredential","datacontenttype":"application/json","dataversion":"VINVCv1.0","data":{"@context":["https://www.w3.org/ns/credentials/v2",{"vehicleIdentificationNumber":"https://schema.org/vehicleIdentificationNumber"},"https://attestation-api.dimo.zone/v1/vc/context"],"id":"urn:uuid:0b74cd3b-5998-4436-ada3-22dd6cfe2b3c","type":["VerifiableCredential","Vehicle"],"issuer":"https://attestation-api.dimo.zone/v1/vc/keys","validFrom":"2024-11-08T03:54:51Z","validTo":"2024-11-10T00:00:00Z","credentialSubject":{"id":"did:nft:137_erc721:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF_39718","vehicleTokenId":39718,"vehicleContractAddress":"eth:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF","vehicleIdentificationNumber":"3eMCZ5AN5PM647548","recordedBy":"did:nft:137:0x9c94C395cBcBDe662235E0A9d3bB87Ad708561BA_31653","recordedAt":"2024-11-08T00:40:29Z"},"credentialStatus":{"id":"https://attestation-api.dimo.zone/v1/vc/status/39718","type":"BitstringStatusListEntry","statusPurpose":"revocation","statusListIndex":0,"statusListCredential":"https://attestation-api.dimo.zone/v1/vc/status"},"proof":{"type":"DataIntegrityProof","cryptosuite":"ecdsa-rdfc-2019","verificationMethod":"https://attestation-api.dimo.zone/v1/vc/keys#key1","created":"2024-11-08T03:54:51Z","proofPurpose":"assertionMethod","proofValue":"381yXZFRShe2rrr9A3VFGeXS9izouz7Gor1GTb6Mwjkpge8eEn814QivzssEogoLKrzGN6WPKWBQrFLgfcsUhuaAWhS421Dn"}}}`
const testVC = `{"id":"2oYEQJDQFRYCI1UIf6QTy92MS3G","source":"0x0000000000000000000000000000000000000000","producer":"did:nft:137:0x9c94C395cBcBDe662235E0A9d3bB87Ad708561BA_31653","specversion":"1.0","subject":"did:nft:137:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF_39718","time":"2024-11-08T03:54:51Z","type":"dimo.verifiablecredential","datacontenttype":"application/json","dataversion":"VINVCv1.0","data":{"@context":["https://www.w3.org/ns/credentials/v2",{"vehicleIdentificationNumber":"https://schema.org/vehicleIdentificationNumber"},"https://attestation-api.dimo.zone/v1/vc/context"],"id":"urn:uuid:0b74cd3b-5998-4436-ada3-22dd6cfe2b3c","type":["VerifiableCredential","Vehicle"],"issuer":"https://attestation-api.dimo.zone/v1/vc/keys","validFrom":"2024-11-08T03:54:51Z","validTo":"2024-11-10T00:00:00Z","credentialSubject":{"id":"did:nft:137_erc721:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF_39718","vehicleTokenId":39718,"vehicleContractAddress":"eth:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF","vehicleIdentificationNumber":"3eMCZ5AN5PM647548","recordedBy":"did:nft:137:0x9c94C395cBcBDe662235E0A9d3bB87Ad708561BA_31653","recordedAt":"2024-11-08T00:40:29Z"},"credentialStatus":{"id":"https://attestation-api.dimo.zone/v1/vc/status/39718","type":"BitstringStatusListEntry","statusPurpose":"revocation","statusListIndex":0,"statusListCredential":"https://attestation-api.dimo.zone/v1/vc/status"},"proof":{"type":"DataIntegrityProof","cryptosuite":"ecdsa-rdfc-2019","verificationMethod":"https://attestation-api.dimo.zone/v1/vc/keys#key1","created":"2024-11-08T03:54:51Z","proofPurpose":"assertionMethod","proofValue":"381yXZFRShe2rrr9A3VFGeXS9izouz7Gor1GTb6Mwjkpge8eEn814QivzssEogoLKrzGN6WPKWBQrFLgfcsUhuaAWhS421Dn"}}}`

services := GetTestServices(t)

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/DIMO-Network/attestation-api v0.0.11
github.com/DIMO-Network/clickhouse-infra v0.0.3
github.com/DIMO-Network/model-garage v0.4.5
github.com/DIMO-Network/nameindexer v0.1.0
github.com/DIMO-Network/nameindexer v0.1.2
github.com/DIMO-Network/shared v0.12.6
github.com/Khan/genqlient v0.7.0
github.com/auth0/go-jwt-middleware/v2 v2.2.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ github.com/DIMO-Network/clickhouse-infra v0.0.3 h1:B6/4IY9IxLcyydET14IjHUT+A5SDE
github.com/DIMO-Network/clickhouse-infra v0.0.3/go.mod h1:NtpQ1btkPzebDvpYYygeqiiBmJ/q5oJb/T/JWzUVRlk=
github.com/DIMO-Network/model-garage v0.4.5 h1:YWzsNjLJtWgw2n2aXy07fnGG8gQd94O0v2VuPGK3M98=
github.com/DIMO-Network/model-garage v0.4.5/go.mod h1:n+6Yrh3EewjgBX+AFx45aJso8pnhgJRRcaTjW5Sak38=
github.com/DIMO-Network/nameindexer v0.1.0 h1:OZi3mmZ+v4PDw89quAy6/Ty0O31ngB1Ouo+Ng+bMdM0=
github.com/DIMO-Network/nameindexer v0.1.0/go.mod h1:BmonIrd69A4Whe+7WHiyTP6RJf3KQiooOLBISqkeyII=
github.com/DIMO-Network/nameindexer v0.1.2 h1:xar3D+fe7RFy887BVWh+B1qhUo/K6tIzK3Ld1NTuRgo=
github.com/DIMO-Network/nameindexer v0.1.2/go.mod h1:BmonIrd69A4Whe+7WHiyTP6RJf3KQiooOLBISqkeyII=
github.com/DIMO-Network/shared v0.12.6 h1:vAnhmYnk21hBjFaSY1bA+oGJZENCsK7OmtSwF4O1Zqg=
github.com/DIMO-Network/shared v0.12.6/go.mod h1:dtoa/pN19FFR/ghTsUWJynQClwvc+cIlf2mPDaUBDsE=
github.com/DIMO-Network/yaml v0.1.0 h1:KQ3oKHUZETchR6Pxbmmol3e4ewrPv/q8cEwqxfwyZbU=
Expand Down
12 changes: 8 additions & 4 deletions internal/repositories/vc/vc.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,11 @@ func (r *Repository) GetLatestVINVC(ctx context.Context, vehicleTokenID uint32)
r.logger.Error().Err(err).Msg("failed to get latest VIN VC data")
return nil, errors.New("internal error")
}
credEvent := cloudevent.CloudEvent[verifiable.Credential]{}
if err := json.Unmarshal(dataObj.Data, &credEvent); err != nil {
cred := verifiable.Credential{}
if err := json.Unmarshal(dataObj.Data, &cred); err != nil {
r.logger.Error().Err(err).Msg("failed to unmarshal VIN VC")
return nil, errors.New("internal error")
}
cred := credEvent.Data

var expiresAt *time.Time
if expirationDate, err := time.Parse(time.RFC3339, cred.ValidTo); err == nil {
Expand Down Expand Up @@ -103,11 +102,16 @@ func (r *Repository) GetLatestVINVC(ctx context.Context, vehicleTokenID uint32)
if credSubject.VehicleContractAddress != "" {
vehicleContractAddress = &credSubject.VehicleContractAddress
}
rawVc, err := json.Marshal(dataObj)
if err != nil {
r.logger.Error().Err(err).Msg("failed to marshal VIN VC")
return nil, errors.New("internal error")
}
tokenIDInt := int(credSubject.VehicleTokenID)
return &model.Vinvc{
ValidFrom: createdAt,
ValidTo: expiresAt,
RawVc: string(dataObj.Data),
RawVc: string(rawVc),
Vin: vin,
RecordedBy: recordedBy,
RecordedAt: recordedAt,
Expand Down
12 changes: 7 additions & 5 deletions internal/repositories/vc/vc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,15 @@ func TestGetLatestVC(t *testing.T) {
"vehicleTokenID": 123
}`),
}
emptyEvent := cloudevent.CloudEvent[json.RawMessage]{}
event := cloudevent.CloudEvent[verifiable.Credential]{
Data: defaultVC,
credData, err := json.Marshal(defaultVC)
require.NoError(t, err, "failed to marshal defaultVC")
defaultEvent := cloudevent.CloudEvent[json.RawMessage]{
Data: credData,
}
defaultData, err := json.Marshal(event)
defaultData, err := json.Marshal(defaultEvent)
require.NoError(t, err, "failed to marshal defaultVC")

emptyEvent := cloudevent.CloudEvent[json.RawMessage]{}
// Test cases
tests := []struct {
name string
Expand All @@ -94,7 +96,7 @@ func TestGetLatestVC(t *testing.T) {
name: "Success",
mockSetup: func() {
// Create a mock verifiable credential
mockService.EXPECT().GetLatestCloudEvent(gomock.Any(), gomock.Any(), gomock.Any()).Return(cloudevent.CloudEvent[json.RawMessage]{Data: defaultData}, nil)
mockService.EXPECT().GetLatestCloudEvent(gomock.Any(), gomock.Any(), gomock.Any()).Return(defaultEvent, nil)
},
expectedVC: &model.Vinvc{
Vin: ref("VIN123"),
Expand Down

0 comments on commit c409408

Please sign in to comment.