Skip to content

Commit

Permalink
feat: return numbers
Browse files Browse the repository at this point in the history
  • Loading branch information
StefanFl committed Jan 22, 2025
1 parent 935609e commit 465e854
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 15 deletions.
8 changes: 7 additions & 1 deletion backend/application/import_observations/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class ApiImportObservationsByNameRequestSerializer(Serializer):
kubernetes_cluster = CharField(max_length=255, required=False)


class ImportObservationsResponseSerializer(Serializer):
class FileImportObservationsResponseSerializer(Serializer):
observations_new = IntegerField()
observations_updated = IntegerField()
observations_resolved = IntegerField()
Expand All @@ -72,6 +72,12 @@ class ImportObservationsResponseSerializer(Serializer):
license_components_deleted = IntegerField()


class APIImportObservationsResponseSerializer(Serializer):
observations_new = IntegerField()
observations_updated = IntegerField()
observations_resolved = IntegerField()


class ApiConfigurationSerializer(ModelSerializer):
product_data = NestedProductSerializer(source="product", read_only=True)
test_connection = BooleanField(write_only=True, required=False, default=False)
Expand Down
28 changes: 20 additions & 8 deletions backend/application/import_observations/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from rest_framework.parsers import MultiPartParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND
from rest_framework.status import HTTP_404_NOT_FOUND
from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ModelViewSet

Expand All @@ -30,9 +30,10 @@
ApiConfigurationSerializer,
ApiImportObservationsByIdRequestSerializer,
ApiImportObservationsByNameRequestSerializer,
APIImportObservationsResponseSerializer,
FileImportObservationsResponseSerializer,
FileUploadObservationsByIdRequestSerializer,
FileUploadObservationsByNameRequestSerializer,
ImportObservationsResponseSerializer,
ParserSerializer,
VulnerabilityCheckSerializer,
)
Expand Down Expand Up @@ -61,7 +62,7 @@
class ApiImportObservationsById(APIView):
@extend_schema(
request=ApiImportObservationsByIdRequestSerializer,
responses={status.HTTP_200_OK: ImportObservationsResponseSerializer},
responses={status.HTTP_200_OK: APIImportObservationsResponseSerializer},
)
def post(self, request):
request_serializer = ApiImportObservationsByIdRequestSerializer(
Expand Down Expand Up @@ -125,7 +126,7 @@ def post(self, request):
class ApiImportObservationsByName(APIView):
@extend_schema(
request=ApiImportObservationsByNameRequestSerializer,
responses={status.HTTP_200_OK: ImportObservationsResponseSerializer},
responses={status.HTTP_200_OK: APIImportObservationsResponseSerializer},
)
def post(self, request):
request_serializer = ApiImportObservationsByNameRequestSerializer(
Expand Down Expand Up @@ -193,7 +194,7 @@ class FileUploadObservationsById(APIView):

@extend_schema(
request=FileUploadObservationsByIdRequestSerializer,
responses={status.HTTP_200_OK: ImportObservationsResponseSerializer},
responses={status.HTTP_200_OK: FileImportObservationsResponseSerializer},
)
def post(self, request): # pylint: disable=too-many-locals
# not too much we can do about this
Expand Down Expand Up @@ -277,7 +278,7 @@ class FileUploadObservationsByName(APIView):

@extend_schema(
request=FileUploadObservationsByNameRequestSerializer,
responses={status.HTTP_200_OK: ImportObservationsResponseSerializer},
responses={status.HTTP_200_OK: FileImportObservationsResponseSerializer},
)
def post(self, request): # pylint: disable=too-many-locals
# not too much we can do about this
Expand Down Expand Up @@ -386,6 +387,10 @@ class ParserViewSet(GenericViewSet, ListModelMixin, RetrieveModelMixin):


class ScanOSVProductView(APIView):
@extend_schema(
request=None,
responses={status.HTTP_200_OK: APIImportObservationsResponseSerializer},
)
@action(detail=True, methods=["post"])
def post(self, request, product_id: int):
product = get_product_by_id(product_id)
Expand All @@ -394,5 +399,12 @@ def post(self, request, product_id: int):

user_has_permission_or_403(product, Permissions.Product_Scan_OSV)

scan_product(product)
return Response(status=HTTP_204_NO_CONTENT)
observations_new, observations_updated, observations_resolved = scan_product(
product
)
response_data = {
"observations_new": observations_new,
"observations_updated": observations_updated,
"observations_resolved": observations_resolved,
}
return Response(response_data)
28 changes: 23 additions & 5 deletions backend/application/import_observations/services/osv_scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,28 @@ class Request_Queries:
queries: list[Request_Package]


def scan_product(product: Product) -> None:
def scan_product(product: Product) -> Tuple[int, int, int]:
numbers: Tuple[int, int, int] = (0, 0, 0)

branches = Branch.objects.filter(product=product)
for branch in branches:
license_components = get_license_components_for_branch(branch)
scan_license_components(license_components)
new, updated, resolved = scan_license_components(license_components)
numbers = (
numbers[0] + new,
numbers[1] + updated,
numbers[2] + resolved,
)

license_components = get_license_components_no_branch(product)
scan_license_components(license_components)
new, updated, resolved = scan_license_components(license_components)
numbers = (
numbers[0] + new,
numbers[1] + updated,
numbers[2] + resolved,
)

return numbers


def get_license_components_for_branch(branch: Branch) -> list[License_Component]:
Expand All @@ -56,9 +70,11 @@ def get_license_components_no_branch(product: Product) -> list[License_Component
)


def scan_license_components(license_components: list[License_Component]) -> None:
def scan_license_components(
license_components: list[License_Component],
) -> Tuple[int, int, int]:
if not license_components:
return
return 0, 0, 0

jsonpickle.set_encoder_options("json", ensure_ascii=False)

Expand Down Expand Up @@ -141,3 +157,5 @@ def scan_license_components(license_components: list[License_Component]) -> None
"scanner": numbers[3],
},
)

return numbers[0], numbers[1], numbers[2]
2 changes: 1 addition & 1 deletion backend/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
),
path("api/purl_types/<str:purl_type_id>/", PURLTypeOneView.as_view()),
path("api/purl_types/", PURLTypeManyView.as_view()),
path("api/products/scan_osv/<int:product_id>/", ScanOSVProductView.as_view()),
path("api/products/<int:product_id>/scan_osv/", ScanOSVProductView.as_view()),
path(
"api/import/api_import_observations_by_name/",
ApiImportObservationsByName.as_view(),
Expand Down

0 comments on commit 465e854

Please sign in to comment.