diff --git a/pkg/metadatastorage/attestationcollection/parser_registry.go b/pkg/metadatastorage/attestationcollection/parser_registry.go new file mode 100644 index 00000000..e031f984 --- /dev/null +++ b/pkg/metadatastorage/attestationcollection/parser_registry.go @@ -0,0 +1,35 @@ +// Copyright 2024 The Archivista Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package attestationcollection + +import ( + "context" + "encoding/json" + "github.com/in-toto/archivista/ent" + "log" +) + +var registeredParsers map[string]AttestationParser + +func init() { + registeredParsers = make(map[string]AttestationParser) +} + +func Register(attestationType string, parser AttestationParser) { + registeredParsers[attestationType] = parser + log.Printf("parser registered: %s", attestationType) +} + +type AttestationParser func(ctx context.Context, tx *ent.Tx, attestation *ent.Attestation, attestationType string, message json.RawMessage) error diff --git a/pkg/metadatastorage/attestationcollection/parserstorer.go b/pkg/metadatastorage/attestationcollection/parserstorer.go index e456940e..01b10c48 100644 --- a/pkg/metadatastorage/attestationcollection/parserstorer.go +++ b/pkg/metadatastorage/attestationcollection/parserstorer.go @@ -17,11 +17,11 @@ package attestationcollection import ( "context" "encoding/json" - "github.com/google/uuid" "github.com/in-toto/archivista/ent" "github.com/in-toto/archivista/pkg/metadatastorage" "github.com/in-toto/go-witness/attestation" + "github.com/in-toto/go-witness/log" ) const ( @@ -58,12 +58,22 @@ func (parsedCollection ParsedCollection) Store(ctx context.Context, tx *ent.Tx, } for _, a := range parsedCollection.Attestations { - if err := tx.Attestation.Create(). + newAttestation, err := tx.Attestation.Create(). SetAttestationCollectionID(collection.ID). SetType(a.Type). - Exec(ctx); err != nil { + Save(ctx) + if err != nil { return err } + + if parser, exists := registeredParsers[a.Type]; exists { + if err := parser(ctx, tx, newAttestation, a.Type, a.Attestation); err != nil { + log.Errorf("failed to parse attestation of type %s: %w", a.Type, err) + return err + } + } else { + // parser doesn't exist, so just ignore and proceed + } } return nil