Skip to content

Commit 5fddbb0

Browse files
committed
Add fixed by package in V2 API
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 3cee771 commit 5fddbb0

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

vulnerabilities/api_v2.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,21 @@ class Meta:
195195
]
196196

197197
def get_affected_by_vulnerabilities(self, obj):
198-
return [vuln.vulnerability_id for vuln in obj.affected_by_vulnerabilities.all()]
198+
"""
199+
Return a dictionary with vulnerabilities as keys and their details, including fixed_by_packages.
200+
"""
201+
vulnerabilities = obj.affected_by_vulnerabilities.prefetch_related("fixed_by_packages")
202+
result = {}
203+
for vuln in vulnerabilities:
204+
fixed_by_package = vuln.fixed_by_packages.first()
205+
purl = None
206+
if fixed_by_package:
207+
purl = fixed_by_package.package_url
208+
result[vuln.vulnerability_id] = {
209+
"vulnerability_id": vuln.vulnerability_id,
210+
"fixed_by_packages": purl,
211+
}
212+
return result
199213

200214
def get_fixing_vulnerabilities(self, obj):
201215
# Ghost package should not fix any vulnerability.

vulnerabilities/tests/test_api_v2.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,10 @@ def test_package_serializer_fields(self):
266266
self.assertIn("next_non_vulnerable_version", data)
267267
self.assertIn("latest_non_vulnerable_version", data)
268268
self.assertEqual(data["purl"], "pkg:pypi/django@3.2")
269-
self.assertEqual(data["affected_by_vulnerabilities"], ["VCID-1234"])
269+
self.assertEqual(
270+
data["affected_by_vulnerabilities"],
271+
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
272+
)
270273
self.assertEqual(data["fixing_vulnerabilities"], [])
271274

272275
def test_list_packages_pagination(self):
@@ -321,7 +324,10 @@ def test_get_affected_by_vulnerabilities(self):
321324
package = Package.objects.get(package_url="pkg:pypi/django@3.2")
322325
serializer = PackageV2Serializer()
323326
vulnerabilities = serializer.get_affected_by_vulnerabilities(package)
324-
self.assertEqual(vulnerabilities, ["VCID-1234"])
327+
self.assertEqual(
328+
vulnerabilities,
329+
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
330+
)
325331

326332
def test_get_fixing_vulnerabilities(self):
327333
"""
@@ -523,7 +529,10 @@ def test_lookup_with_valid_purl(self):
523529
self.assertIn("next_non_vulnerable_version", response.data[0])
524530
self.assertIn("latest_non_vulnerable_version", response.data[0])
525531
self.assertEqual(response.data[0]["purl"], "pkg:pypi/django@3.2")
526-
self.assertEqual(response.data[0]["affected_by_vulnerabilities"], ["VCID-1234"])
532+
self.assertEqual(
533+
response.data[0]["affected_by_vulnerabilities"],
534+
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
535+
)
527536
self.assertEqual(response.data[0]["fixing_vulnerabilities"], [])
528537

529538
def test_lookup_with_invalid_purl(self):

0 commit comments

Comments
 (0)