@@ -29,7 +29,7 @@ use petgraph::{
2929 visit:: { VisitMap , Visitable } ,
3030} ;
3131use sea_orm:: {
32- ColumnTrait , EntityOrSelect , EntityTrait , PaginatorTrait , QueryFilter , QuerySelect ,
32+ ColumnTrait , EntityOrSelect , EntityTrait , PaginatorTrait , QueryFilter , QueryOrder , QuerySelect ,
3333 RelationTrait , prelude:: ConnectionTrait ,
3434} ;
3535use sea_query:: JoinType ;
@@ -103,9 +103,15 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
103103 node_id : & str ,
104104 connection : & C ,
105105) -> Result < Option < ResolvedSbom > , Error > {
106- // we first lookup in sbom_external_node
106+ // 1. Lookup in sbom_external_node.
107+ // TIE-BREAKER: Join with Sbom to pick the latest published version of this node mapping.
107108 let Some ( sbom_external_node) = sbom_external_node:: Entity :: find ( )
109+ . join (
110+ JoinType :: InnerJoin ,
111+ sbom_external_node:: Relation :: Sbom . def ( ) ,
112+ )
108113 . filter ( sbom_external_node:: Column :: NodeId . eq ( node_id) )
114+ . order_by_desc ( trustify_entity:: sbom:: Column :: Published )
109115 . one ( connection)
110116 . await ?
111117 else {
@@ -139,18 +145,18 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
139145 DiscriminatorType :: Sha256 => {
140146 query = query. filter ( source_document:: Column :: Sha256 . eq ( & discriminator_value) )
141147 }
142- _ => {
143- return Ok ( None ) ;
144- }
148+ _ => return Ok ( None ) ,
145149 } ;
146150
147- Ok ( match query. one ( connection) . await ? {
148- Some ( entity) => Some ( ResolvedSbom {
151+ // TIE-BREAKER: Order by published date to ensure we get the latest SPDX doc
152+ Ok ( query
153+ . order_by_desc ( sbom:: Column :: Published )
154+ . one ( connection)
155+ . await ?
156+ . map ( |entity| ResolvedSbom {
149157 sbom_id : entity. sbom_id ,
150158 node_id : sbom_external_node. external_node_ref ,
151- } ) ,
152- _ => None ,
153- } )
159+ } ) )
154160 }
155161 ExternalType :: CycloneDx => {
156162 // For cyclonedx, sbom_external_node discriminator_type and discriminator_value are used
@@ -170,6 +176,7 @@ async fn resolve_external_sbom<C: ConnectionTrait>(
170176
171177 Ok ( sbom:: Entity :: find ( )
172178 . filter ( sbom:: Column :: DocumentId . eq ( external_doc_id) )
179+ . order_by_desc ( sbom:: Column :: Published )
173180 . one ( connection)
174181 . await ?
175182 . map ( |entity| ResolvedSbom {
0 commit comments