@@ -50,7 +50,34 @@ class Meta:
5050 fields = ["url" , "purl" ]
5151
5252
53- class MinimalVulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
53+ class FilteredPackageListSerializer (serializers .ListSerializer ):
54+ def to_representation (self , data ):
55+ params = self .context ["request" ].query_params
56+ name = params .get ("name" )
57+ if name :
58+ data = data .filter (name = name )
59+ namespace = params .get ("namespace" )
60+ if namespace :
61+ data = data .filter (namespace = namespace )
62+ type = params .get ("type" )
63+ if type :
64+ data = data .filter (type = type )
65+ return super (FilteredPackageListSerializer , self ).to_representation (data )
66+
67+
68+ class FixedPackageSerializer (serializers .ModelSerializer ):
69+
70+ purl = serializers .CharField (source = "package_url" )
71+
72+ class Meta :
73+ list_serializer_class = FilteredPackageListSerializer
74+ model = Package
75+ fields = ["url" , "purl" ]
76+
77+
78+ class MinimalVulnerabilitySerializerWithReferencesAndSummary (
79+ serializers .HyperlinkedModelSerializer
80+ ):
5481 """
5582 Used for nesting inside package focused APIs.
5683 """
@@ -62,6 +89,31 @@ class Meta:
6289 fields = ["url" , "vulnerability_id" , "summary" , "references" ]
6390
6491
92+ class MinimalVulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
93+ """
94+ Used for nesting inside package focused APIs.
95+ """
96+
97+ class Meta :
98+ model = Vulnerability
99+ fields = ["url" , "vulnerability_id" ]
100+
101+
102+ class MinimalPackageSerializerWithFixedVulnerabilities (serializers .HyperlinkedModelSerializer ):
103+ """
104+ Used for nesting inside vulnerability focused APIs.
105+ """
106+
107+ purl = serializers .CharField (source = "package_url" )
108+ fixing_vulnerabilities = MinimalVulnerabilitySerializer (
109+ many = True , source = "resolved_to" , read_only = True
110+ )
111+
112+ class Meta :
113+ model = Package
114+ fields = ["url" , "purl" , "fixing_vulnerabilities" ]
115+
116+
65117class AliasSerializer (serializers .HyperlinkedModelSerializer ):
66118 """
67119 Used for nesting inside package focused APIs.
@@ -74,7 +126,7 @@ class Meta:
74126
75127class VulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
76128
77- fixed_packages = MinimalPackageSerializer (many = True , source = "resolved_to" , read_only = True )
129+ fixed_packages = FixedPackageSerializer (many = True , source = "resolved_to" , read_only = True )
78130 affected_packages = MinimalPackageSerializer (many = True , source = "vulnerable_to" , read_only = True )
79131
80132 references = VulnerabilityReferenceSerializer (many = True , source = "vulnerabilityreference_set" )
@@ -100,13 +152,13 @@ def to_representation(self, instance):
100152 return data
101153
102154 purl = serializers .CharField (source = "package_url" )
103- affected_by_vulnerabilities = MinimalVulnerabilitySerializer (
155+ affected_by_vulnerabilities = MinimalVulnerabilitySerializerWithReferencesAndSummary (
104156 many = True , source = "vulnerable_to" , read_only = True
105157 )
106- fixing_vulnerabilities = MinimalVulnerabilitySerializer (
158+ fixing_vulnerabilities = MinimalVulnerabilitySerializerWithReferencesAndSummary (
107159 many = True , source = "resolved_to" , read_only = True
108160 )
109- fixed_packages = MinimalPackageSerializer (many = True , read_only = True )
161+ fixed_packages = MinimalPackageSerializerWithFixedVulnerabilities (many = True , read_only = True )
110162
111163 class Meta :
112164 model = Package
0 commit comments