Skip to content

Commit 112b630

Browse files
committed
Aggregate SSVCs using qs
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 777f248 commit 112b630

2 files changed

Lines changed: 15 additions & 38 deletions

File tree

vulnerabilities/api_v3.py

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010
from collections import defaultdict
1111
from urllib.parse import urlencode
1212

13+
from django.contrib.postgres.aggregates import JSONBAgg
1314
from django.db.models import Exists
15+
from django.db.models import F
1416
from django.db.models import Max
1517
from django.db.models import OuterRef
1618
from django.db.models import Prefetch
1719
from django.db.models import Q
20+
from django.db.models.functions import JSONObject
1821
from django_filters import rest_framework as filters
1922
from drf_spectacular.utils import extend_schema
2023
from packageurl import PackageURL
@@ -644,24 +647,6 @@ def get_affected_advisories_bulk(packages):
644647
.select_related("primary_advisory")
645648
.prefetch_related(
646649
Prefetch("aliases", queryset=AdvisoryAlias.objects.only("alias")),
647-
Prefetch(
648-
"members",
649-
queryset=AdvisorySetMember.objects.select_related("advisory").prefetch_related(
650-
Prefetch(
651-
"advisory__related_ssvcs",
652-
queryset=SSVC.objects.select_related("source_advisory")
653-
.only(
654-
"id",
655-
"options",
656-
"decision",
657-
"vector",
658-
"source_advisory__url",
659-
)
660-
.distinct("source_advisory__url"),
661-
to_attr="prefetched_ssvc_trees",
662-
)
663-
),
664-
),
665650
)
666651
.annotate(
667652
max_severity=Max(
@@ -670,6 +655,16 @@ def get_affected_advisories_bulk(packages):
670655
max_exploitability=Max(
671656
"members__advisory__exploitability",
672657
),
658+
ssvc_trees=JSONBAgg(
659+
JSONObject(
660+
vector=F("members__advisory__related_ssvcs__vector"),
661+
decision=F("members__advisory__related_ssvcs__decision"),
662+
options=F("members__advisory__related_ssvcs__options"),
663+
source_url=F("members__advisory__related_ssvcs__source_advisory__url"),
664+
),
665+
filter=Q(members__advisory__related_ssvcs__decision__isnull=False),
666+
distinct=True,
667+
),
673668
)
674669
.only(
675670
"id",
@@ -706,22 +701,6 @@ def get_affected_advisories_bulk(packages):
706701
identifier = primary.advisory_id.split("/")[-1]
707702

708703
aliases = [a for a in adv._aliases_cache if a != identifier]
709-
all_ssvc = []
710-
711-
for member in adv.members.all():
712-
all_ssvc.extend(member.advisory.prefetched_ssvc_trees)
713-
714-
ssvcs = []
715-
716-
for ssvc in all_ssvc:
717-
ssvcs.append(
718-
{
719-
"vector": ssvc.vector,
720-
"decision": ssvc.decision,
721-
"options": ssvc.options,
722-
"source_url": ssvc.source_advisory.url,
723-
}
724-
)
725704

726705
grouped.append(
727706
{
@@ -733,7 +712,7 @@ def get_affected_advisories_bulk(packages):
733712
"risk_score": risk_score,
734713
"summary": primary.summary,
735714
"resource_url": primary.get_absolute_url(),
736-
"ssvc_trees": ssvcs,
715+
"ssvc_trees": adv.ssvc_trees or [],
737716
}
738717
)
739718

vulnerabilities/models.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3284,9 +3284,7 @@ class Meta:
32843284
fields=["_all_impacts_unfurled", "id"],
32853285
name="advisory_unfurled_idx",
32863286
),
3287-
models.Index(
3288-
fields=["is_latest", "_all_impacts_unfurled"]
3289-
)
3287+
models.Index(fields=["is_latest", "_all_impacts_unfurled"]),
32903288
]
32913289

32923290
def save(self, *args, **kwargs):

0 commit comments

Comments
 (0)