@@ -10,24 +10,24 @@ import (
1010 "sort"
1111 "time"
1212
13- license2 "github.com/eclipse-disuko/disuko/domain/license"
14- "github.com/eclipse-disuko/disuko/helper/hash"
15- "github.com/eclipse-disuko/disuko/infra/repository/licenserules"
16- "github.com/eclipse-disuko/disuko/infra/repository/policydecisions"
17-
1813 "github.com/eclipse-disuko/disuko/domain/approval"
1914 "github.com/eclipse-disuko/disuko/domain/audit"
15+ license2 "github.com/eclipse-disuko/disuko/domain/license"
2016 "github.com/eclipse-disuko/disuko/domain/project"
17+ "github.com/eclipse-disuko/disuko/domain/project/approvable"
2118 "github.com/eclipse-disuko/disuko/domain/project/components"
2219 "github.com/eclipse-disuko/disuko/domain/project/sbomlist"
2320 user2 "github.com/eclipse-disuko/disuko/domain/user"
2421 auditHelper "github.com/eclipse-disuko/disuko/helper/audit"
2522 "github.com/eclipse-disuko/disuko/helper/exception"
23+ "github.com/eclipse-disuko/disuko/helper/hash"
2624 "github.com/eclipse-disuko/disuko/helper/message"
2725 "github.com/eclipse-disuko/disuko/infra/repository/approvallist"
2826 "github.com/eclipse-disuko/disuko/infra/repository/auditloglist"
2927 "github.com/eclipse-disuko/disuko/infra/repository/labels"
3028 "github.com/eclipse-disuko/disuko/infra/repository/license"
29+ "github.com/eclipse-disuko/disuko/infra/repository/licenserules"
30+ "github.com/eclipse-disuko/disuko/infra/repository/policydecisions"
3131 "github.com/eclipse-disuko/disuko/infra/repository/policyrules"
3232 projectRepo "github.com/eclipse-disuko/disuko/infra/repository/project"
3333 sbomListRepo "github.com/eclipse-disuko/disuko/infra/repository/sbomlist"
@@ -91,8 +91,8 @@ func (s *ApprovalService) ProcessRandomApprovalUpdate(pr *project.Project, appId
9191 return targetApproval
9292}
9393
94- func (s * ApprovalService ) GetApprovalInfo (targetProject * project.Project ) approval.Info {
95- return s .getApprovalInfo (targetProject , nil , false )
94+ func (s * ApprovalService ) GetApprovalInfo (targetProject * project.Project , takeLatestSbom bool ) approval.Info {
95+ return s .getApprovalInfo (targetProject , nil , false , takeLatestSbom )
9696}
9797
9898func (s * ApprovalService ) AdminAbortRandomApproval (pr * project.Project , app * approval.Approval ) {
@@ -106,7 +106,7 @@ func (s *ApprovalService) AdminAbortRandomApproval(pr *project.Project, app *app
106106 }
107107}
108108
109- func (s * ApprovalService ) getApprovalInfo (targetProject * project.Project , projectFilter * []string , includeNoFOSS bool ) approval.Info {
109+ func (s * ApprovalService ) getApprovalInfo (targetProject * project.Project , projectFilter * []string , includeNoFOSS bool , takeLatestSbom bool ) approval.Info {
110110 res := approval.Info {
111111 CompStats : & components.ComponentStats {},
112112 }
@@ -143,22 +143,47 @@ func (s *ApprovalService) getApprovalInfo(targetProject *project.Project, projec
143143 logy .Warnf (s .RequestSession , "Child project is marked as deprecated, uuid: %s parent: %s" , prKey , pr .Key )
144144 continue
145145 }
146- if pr .ApprovableSPDX .SpdxKey == "" || pr .ApprovableSPDX .VersionKey == "" || (! includeNoFOSS && pr .IsNoFoss ) {
146+
147+ var supplier * project.ProjectMemberEntity
148+ for _ , u := range pr .UserManagement .Users {
149+ if u .UserType == project .SUPPLIER {
150+ supplier = u
151+ break
152+ }
153+ }
154+ var supplierUserId * string
155+ if supplier != nil {
156+ supplierUserId = & supplier .UserId
157+ }
158+
159+ approvableSPDX := pr .ApprovableSPDX
160+ var sbomList * sbomlist.SbomList
161+ var sbom * project.SpdxFileBase
162+
163+ if takeLatestSbom {
164+ approvableSPDX , sbomList , sbom = s .findLatestSpdx (pr )
165+ }
166+
167+ if approvableSPDX .SpdxKey == "" || approvableSPDX .VersionKey == "" || (! includeNoFOSS && pr .IsNoFoss ) {
147168 res .Projects = append (res .Projects , approval.ProjectApprovable {
148169 ProjectKey : pr .Key ,
149170 ProjectName : pr .Name ,
150171 CustomerDiffers : pr .CustomerMeta .Diff (targetProject .CustomerMeta ),
151172 SupplierDiffers : pr .DocumentMeta .Diff (targetProject .DocumentMeta ),
173+ Supplier : supplierUserId ,
152174 })
153175 continue
154176 }
155- sbomList , sbom := s .SpdxRetriever .RetrieveSbomListAndFile (s .RequestSession , pr .ApprovableSPDX .VersionKey , pr .ApprovableSPDX .SpdxKey )
156- if sbom == nil {
177+ if ! takeLatestSbom {
178+ sbomList , sbom = s .SpdxRetriever .RetrieveSbomListAndFile (s .RequestSession , approvableSPDX .VersionKey , approvableSPDX .SpdxKey )
179+ }
180+ if sbom == nil || sbomList == nil {
157181 res .Projects = append (res .Projects , approval.ProjectApprovable {
158182 ProjectKey : pr .Key ,
159183 ProjectName : pr .Name ,
160184 CustomerDiffers : pr .CustomerMeta .Diff (targetProject .CustomerMeta ),
161185 SupplierDiffers : pr .DocumentMeta .Diff (targetProject .DocumentMeta ),
186+ Supplier : supplierUserId ,
162187 })
163188 continue
164189 }
@@ -192,7 +217,7 @@ func (s *ApprovalService) getApprovalInfo(targetProject *project.Project, projec
192217 if sbom .TotalStatsHash != nil && * sbom .TotalStatsHash == * currentTotalStatsHash {
193218 sbomStats = sbom .Stats
194219 } else {
195- compsInfo := s .SpdxService .GetComponentInfos (s .RequestSession , pr , pr . ApprovableSPDX .VersionKey , sbom )
220+ compsInfo := s .SpdxService .GetComponentInfos (s .RequestSession , pr , approvableSPDX .VersionKey , sbom )
196221 isVehicle := s .ProjectLabelService .HasVehiclePlatformLabel (s .RequestSession , pr )
197222 evalRes := compsInfo .EvaluatePolicyRules (rules , policyDecisions , isVehicle , sbom .Uploaded , sbom .Key )
198223
@@ -208,7 +233,8 @@ func (s *ApprovalService) getApprovalInfo(targetProject *project.Project, projec
208233 ProjectName : pr .Name ,
209234 CustomerDiffers : pr .CustomerMeta .Diff (targetProject .CustomerMeta ),
210235 SupplierDiffers : pr .DocumentMeta .Diff (targetProject .DocumentMeta ),
211- ApprovableSPDX : pr .ApprovableSPDX ,
236+ Supplier : supplierUserId ,
237+ ApprovableSPDX : approvableSPDX ,
212238 SpdxName : sbom .MetaInfo .Name ,
213239 SpdxTag : sbom .Tag ,
214240 ApprovableStats : sbomStats ,
@@ -219,6 +245,44 @@ func (s *ApprovalService) getApprovalInfo(targetProject *project.Project, projec
219245 return res
220246}
221247
248+ func (s * ApprovalService ) findLatestSpdx (pr * project.Project ) (approvable.ApprovableSPDX , * sbomlist.SbomList , * project.SpdxFileBase ) {
249+ var latest * project.SpdxFileBase
250+ var latestSBOMList * sbomlist.SbomList
251+ var latestVersionKey string
252+ var latestVersionName string
253+
254+ for _ , version := range pr .Versions {
255+ if version .Deleted {
256+ continue
257+ }
258+
259+ sbomList := s .SBOMListRepo .FindByKey (s .RequestSession , version .Key , false )
260+ if sbomList == nil {
261+ continue
262+ }
263+
264+ for _ , spdx := range sbomList .SpdxFileHistory {
265+ if latest == nil || spdx .Uploaded .After (* latest .Uploaded ) {
266+ latest = spdx
267+ latestSBOMList = sbomList
268+ latestVersionKey = version .Key
269+ latestVersionName = version .Name
270+ }
271+ }
272+ }
273+
274+ if latest == nil {
275+ return approvable.ApprovableSPDX {}, nil , nil
276+ }
277+
278+ approvableSpdx := approvable.ApprovableSPDX {
279+ SpdxKey : latest .Key ,
280+ VersionKey : latestVersionKey ,
281+ VersionName : latestVersionName ,
282+ }
283+ return approvableSpdx , latestSBOMList , latest
284+ }
285+
222286func (s * ApprovalService ) setTaskDone (username string , app * approval.Approval , taskType user2.TaskType , taskStatus user2.TaskStatus ) {
223287 targetUser := s .UserRepo .FindByUserId (s .RequestSession , username )
224288 targetBefore := targetUser .ToUserAudit ()
0 commit comments