github.com/khulnasoft-lab/tunnel-db@v0.0.0-20231117205118-74e1113bd007/pkg/db/advisory.go (about)

     1  package db
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	bolt "go.etcd.io/bbolt"
     7  	"golang.org/x/xerrors"
     8  
     9  	"github.com/khulnasoft-lab/tunnel-db/pkg/types"
    10  )
    11  
    12  func (dbc Config) PutAdvisory(tx *bolt.Tx, bktNames []string, key string, advisory interface{}) error {
    13  	if err := dbc.put(tx, bktNames, key, advisory); err != nil {
    14  		return xerrors.Errorf("failed to put advisory: %w", err)
    15  	}
    16  	return nil
    17  }
    18  
    19  func (dbc Config) ForEachAdvisory(sources []string, pkgName string) (map[string]Value, error) {
    20  	return dbc.forEach(append(sources, pkgName))
    21  }
    22  
    23  func (dbc Config) GetAdvisories(source, pkgName string) ([]types.Advisory, error) {
    24  	advisories, err := dbc.ForEachAdvisory([]string{source}, pkgName)
    25  	if err != nil {
    26  		return nil, xerrors.Errorf("advisory foreach error: %w", err)
    27  	}
    28  	if len(advisories) == 0 {
    29  		return nil, nil
    30  	}
    31  
    32  	var results []types.Advisory
    33  	for vulnID, v := range advisories {
    34  		var advisory types.Advisory
    35  		if err = json.Unmarshal(v.Content, &advisory); err != nil {
    36  			return nil, xerrors.Errorf("failed to unmarshal advisory JSON: %w", err)
    37  		}
    38  
    39  		advisory.VulnerabilityID = vulnID
    40  		if v.Source != (types.DataSource{}) {
    41  			advisory.DataSource = &types.DataSource{
    42  				ID:   v.Source.ID,
    43  				Name: v.Source.Name,
    44  				URL:  v.Source.URL,
    45  			}
    46  		}
    47  
    48  		results = append(results, advisory)
    49  	}
    50  	return results, nil
    51  }