2323
2424from urllib .parse import unquote
2525
26+ from django .db .models import Q
2627from django .urls import reverse
2728from django_filters import rest_framework as filters
2829from packageurl import PackageURL
2930from rest_framework import serializers
3031from rest_framework import viewsets
32+ from rest_framework .decorators import action
33+ from rest_framework .response import Response
3134
3235from vulnerabilities .models import Package
3336from 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
130153class 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