@@ -52,41 +52,69 @@ class Meta:
5252 fields = ["url" , "purl" ]
5353
5454
55- class VulnSerializerRefsAndSummary (serializers .HyperlinkedModelSerializer ):
55+ class FilteredPackageListSerializer (serializers .ListSerializer ):
56+ def to_representation (self , data ):
57+ request = self .context ["request" ]
58+ value = request .query_params .get ("purl" )
59+ if value :
60+ purl = unquote (value )
61+ try :
62+ purl = PackageURL .from_string (purl )
63+
64+ except ValueError as ve :
65+ raise serializers .ValidationError (
66+ detail = {"error" : f'"{ purl } " is not a valid Package URL: { ve } ' },
67+ )
68+
69+ attrs = {k : v for k , v in purl .to_dict ().items () if v }
70+ data = data .filter (** attrs )
71+ return data
72+ package_filter_data = {}
73+ query_params = request .query_params
74+
75+ for field_name in query_params :
76+ value = query_params .get (field_name )
77+ if value :
78+ package_filter_data [field_name ] = value
79+ data = data .filter (** package_filter_data )
80+ return data
81+
82+
83+ class FilteredPackageSerializer (serializers .HyperlinkedModelSerializer ):
5684 """
57- Used for nesting inside package focused APIs.
85+ Used for nesting inside vulnerability focused APIs.
5886 """
5987
60- references = VulnerabilityReferenceSerializer ( many = True , source = "vulnerabilityreference_set " )
88+ purl = serializers . CharField ( source = "package_url " )
6189
6290 class Meta :
63- model = Vulnerability
64- fields = ["url" , "vulnerability_id" , "summary" , "references" ]
91+ list_serializer_class = FilteredPackageListSerializer
92+ model = Package
93+ fields = ["url" , "purl" ]
6594
6695
67- class MinimalVulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
96+ class VulnSerializerRefsAndSummary (serializers .HyperlinkedModelSerializer ):
6897 """
6998 Used for nesting inside package focused APIs.
7099 """
71100
101+ fixed_packages = MinimalPackageSerializer (many = True , source = "resolved_to" , read_only = True )
102+
103+ references = VulnerabilityReferenceSerializer (many = True , source = "vulnerabilityreference_set" )
104+
72105 class Meta :
73106 model = Vulnerability
74- fields = ["url" , "vulnerability_id" ]
107+ fields = ["url" , "vulnerability_id" , "summary" , "references" , "fixed_packages" ]
75108
76109
77- class PackageSerializerFixedVulns (serializers .HyperlinkedModelSerializer ):
110+ class MinimalVulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
78111 """
79- Used for nesting inside vulnerability focused APIs.
112+ Used for nesting inside package focused APIs.
80113 """
81114
82- purl = serializers .CharField (source = "package_url" )
83- fixing_vulnerabilities = MinimalVulnerabilitySerializer (
84- many = True , source = "resolved_to" , read_only = True
85- )
86-
87115 class Meta :
88- model = Package
89- fields = ["url" , "purl" , "fixing_vulnerabilities " ]
116+ model = Vulnerability
117+ fields = ["url" , "vulnerability_id " ]
90118
91119
92120class AliasSerializer (serializers .HyperlinkedModelSerializer ):
@@ -135,7 +163,6 @@ def to_representation(self, instance):
135163 fixing_vulnerabilities = VulnSerializerRefsAndSummary (
136164 many = True , source = "resolved_to" , read_only = True
137165 )
138- fixed_packages = PackageSerializerFixedVulns (many = True , read_only = True )
139166
140167 class Meta :
141168 model = Package
@@ -149,7 +176,6 @@ class Meta:
149176 "qualifiers" ,
150177 "subpath" ,
151178 "affected_by_vulnerabilities" ,
152- "fixed_packages" ,
153179 "fixing_vulnerabilities" ,
154180 ]
155181
0 commit comments