Skip to content

Commit 4696a44

Browse files
committed
Add endpoints for bulk requesting vulnerabilities and packages
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 9b5f40e commit 4696a44

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

vulnerabilities/api.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323

2424
from urllib.parse import unquote
2525

26+
from django.db.models import Q
2627
from django.urls import reverse
2728
from django_filters import rest_framework as filters
2829
from packageurl import PackageURL
2930
from rest_framework import serializers
3031
from rest_framework import viewsets
32+
from rest_framework.decorators import action
33+
from rest_framework.response import Response
3134

3235
from vulnerabilities.models import Package
3336
from vulnerabilities.models import Vulnerability
@@ -126,6 +129,26 @@ class PackageViewSet(viewsets.ReadOnlyModelViewSet):
126129
filter_backends = (filters.DjangoFilterBackend,)
127130
filterset_class = PackageFilterSet
128131

132+
@action(detail=False, methods=["post"])
133+
def fetch(self, request):
134+
135+
filter_list = Q()
136+
# TODO: Do some validation here
137+
for purl in request.data["packages"]:
138+
filter_list |= Q(
139+
**{k: v for k, v in PackageURL.from_string(purl).to_dict().items() if v}
140+
)
141+
142+
res = Package.objects.filter(filter_list)
143+
response = {}
144+
for purl in request.data["packages"]:
145+
response[purl] = {}
146+
for p in res:
147+
if p.package_url == purl:
148+
response[purl] = PackageSerializer(p, context={"request": request}).data
149+
150+
return Response(response)
151+
129152

130153
class VulnerabilityFilterSet(filters.FilterSet):
131154
vulnerability_id = filters.CharFilter(field_name="cve_id")
@@ -141,3 +164,20 @@ class VulnerabilityViewSet(viewsets.ReadOnlyModelViewSet):
141164
paginate_by = 50
142165
filter_backends = (filters.DjangoFilterBackend,)
143166
filterset_class = VulnerabilityFilterSet
167+
168+
@action(detail=False, methods=["post"])
169+
def fetch(self, request):
170+
filter_list = Q()
171+
# TODO: Do some validation here
172+
for cve_id in request.data["vulnerabilities"]:
173+
filter_list |= Q(cve_id=cve_id)
174+
175+
res = Vulnerability.objects.filter(filter_list)
176+
response = {}
177+
for cve in request.data["vulnerabilities"]:
178+
response[cve] = {}
179+
for vuln in res:
180+
if vuln.cve_id == cve:
181+
response[cve] = VulnerabilitySerializer(vuln, context={"request": request}).data
182+
183+
return Response(response)

0 commit comments

Comments
 (0)