@@ -238,32 +238,26 @@ def bulk_search(self, request):
238238 """
239239 Lookup for vulnerable packages using many Package URLs at once.
240240 """
241- response = []
241+
242242 purls = request .data .get ("purls" , []) or []
243+ purl_only = request .data .get ("purl_only" , False )
243244 if not purls or not isinstance (purls , list ):
244245 return Response (
245246 status = 400 ,
246- data = {"Error" : "A non-empty 'purls' list of package URLs is required." },
247+ data = {"Error" : "A non-empty 'purls' list of PURLs is required." },
247248 )
248- for purl in request .data ["purls" ]:
249- try :
250- purl_string = purl
251- purl = PackageURL .from_string (purl )
252- except ValueError :
253- return Response (status = 400 , data = {"Error" : f"Invalid Package URL: { purl } " })
254- lookups = get_purl_query_lookups (purl )
255- purl_data = Package .objects .filter (** lookups )
256- purl_response = {}
257- if purl_data :
258- purl_response = PackageSerializer (purl_data [0 ], context = {"request" : request }).data
259- else :
260- purl_response = purl .to_dict ()
261- purl_response ["unresolved_vulnerabilities" ] = []
262- purl_response ["resolved_vulnerabilities" ] = []
263- purl_response ["purl" ] = purl_string
264- response .append (purl_response )
265-
266- return Response (response )
249+
250+ query = Package .objects .filter (package__in = purls )
251+
252+ if not purl_only :
253+ return Response (
254+ PackageSerializer (query .distinct (), many = True , context = {"request" : request }).data
255+ )
256+
257+ vulnerable_purls = (
258+ query .filter (packagerelatedvulnerability__fix = False ).only ("package" ).distinct ()
259+ )
260+ return Response (data = vulnerable_purls )
267261
268262 @action (detail = False , methods = ["get" ], throttle_scope = "vulnerable_packages" )
269263 def all (self , request ):
0 commit comments