Skip to content

Commit a5fa14c

Browse files
committed
Update DeleteServiceAccountAPIView to use delete
- Inherit DestroyAPIView in DeleteServiceAccountAPIView. - Use delete() instead of post() for deleting service accounts. - Add uuid to URL instead of sending a payload to the DELETE endpoint. - Update tests accordingly. Refs. TS-2320
1 parent 0981e8a commit a5fa14c

File tree

4 files changed

+23
-42
lines changed

4 files changed

+23
-42
lines changed

django/thunderstore/api/cyberstorm/serializers/service_account.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,3 @@ class CreateServiceAccountSerializer(serializers.Serializer):
55
nickname = serializers.CharField(max_length=32)
66
team_name = serializers.CharField(read_only=True)
77
api_token = serializers.CharField(read_only=True)
8-
9-
10-
class DeleteServiceAccountSerializer(serializers.Serializer):
11-
uuid = serializers.UUIDField()

django/thunderstore/api/cyberstorm/tests/test_delete_service_account.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import json
2-
31
import pytest
42
from django.contrib.auth import get_user_model
53
from rest_framework.test import APIClient
@@ -10,14 +8,13 @@
108
User = get_user_model()
119

1210

13-
def get_delete_service_account_url(team_name: str) -> str:
14-
return f"/api/cyberstorm/team/{team_name}/service-account/delete/"
11+
def get_delete_service_account_url(team_name: str, uuid: str) -> str:
12+
return f"/api/cyberstorm/team/{team_name}/service-account/delete/{uuid}/"
1513

1614

1715
def make_request(api_client: APIClient, team_name: str, account: ServiceAccount):
18-
return api_client.post(
19-
path=get_delete_service_account_url(team_name),
20-
data=json.dumps({"uuid": str(account.uuid)}),
16+
return api_client.delete(
17+
path=get_delete_service_account_url(team_name, account.uuid),
2118
content_type="application/json",
2219
)
2320

@@ -46,8 +43,10 @@ def test_delete_service_account_fail_user_is_not_authenticated(
4643
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
4744

4845
response = make_request(api_client, team.name, service_account)
49-
assert response.status_code == 401
46+
expected_response = {"detail": "Authentication credentials were not provided."}
5047

48+
assert response.status_code == 401
49+
assert response.json() == expected_response
5150
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
5251

5352

@@ -63,8 +62,10 @@ def test_delete_service_account_fails_because_user_is_not_team_member(
6362
api_client.force_authenticate(non_team_user)
6463

6564
response = make_request(api_client, team.name, service_account)
66-
assert response.status_code == 403
65+
expected_response = {"detail": "User does not have permission to access this team."}
6766

67+
assert response.status_code == 403
68+
assert response.json() == expected_response
6869
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
6970

7071

@@ -78,8 +79,13 @@ def test_delete_service_account_fail_because_user_is_not_team_owner(
7879
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
7980

8081
api_client.force_authenticate(team_member.user)
81-
8282
response = make_request(api_client, team.name, service_account)
83-
assert response.status_code == 403
8483

84+
error_message = (
85+
"User does not have permission to delete service accounts for this team."
86+
)
87+
expected_response = {"detail": error_message}
88+
89+
assert response.status_code == 403
90+
assert response.json() == expected_response
8591
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1

django/thunderstore/api/cyberstorm/views/service_account.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
from django.http import HttpRequest
22
from rest_framework import status
33
from rest_framework.exceptions import PermissionDenied
4-
from rest_framework.generics import CreateAPIView, GenericAPIView, get_object_or_404
4+
from rest_framework.generics import CreateAPIView, DestroyAPIView, get_object_or_404
55
from rest_framework.permissions import IsAuthenticated
66
from rest_framework.response import Response
77

88
from thunderstore.account.models import ServiceAccount
99
from thunderstore.api.cyberstorm.serializers.service_account import (
1010
CreateServiceAccountSerializer,
11-
DeleteServiceAccountSerializer,
1211
)
1312
from thunderstore.api.utils import conditional_swagger_auto_schema
1413
from thunderstore.repository.models import Team
@@ -69,9 +68,9 @@ def post(self, request, *args, **kwargs) -> Response:
6968
return super().post(request, *args, **kwargs)
7069

7170

72-
class DeleteServiceAccountAPIView(TeamPermissionMixin, GenericAPIView):
71+
class DeleteServiceAccountAPIView(TeamPermissionMixin, DestroyAPIView):
7372
queryset = ServiceAccount.objects.all()
74-
serializer_class = DeleteServiceAccountSerializer
73+
lookup_field = "uuid"
7574

7675
def check_permissions(self, request: HttpRequest) -> None:
7776
super().check_permissions(request)
@@ -81,30 +80,10 @@ def check_permissions(self, request: HttpRequest) -> None:
8180
"for this team."
8281
)
8382

84-
def get_object(self, uuid: str) -> ServiceAccount:
85-
team_name = self.kwargs.get("team_name")
86-
obj = get_object_or_404(
87-
ServiceAccount,
88-
owner__name__iexact=team_name,
89-
uuid=uuid,
90-
)
91-
return obj
92-
93-
def perform_delete(self, request, *args, **kwargs) -> Response:
94-
serializer = self.get_serializer(data=request.data)
95-
serializer.is_valid(raise_exception=True)
96-
uuid = serializer.validated_data["uuid"]
97-
98-
service_account = self.get_object(uuid=uuid)
99-
service_account.delete()
100-
101-
return Response(status=status.HTTP_204_NO_CONTENT)
102-
10383
@conditional_swagger_auto_schema(
104-
request_body=serializer_class,
10584
responses={status.HTTP_204_NO_CONTENT: ""},
10685
operation_id="cyberstorm.team.service-account.delete",
10786
tags=["cyberstorm"],
10887
)
109-
def post(self, request, *args, **kwargs) -> Response:
110-
return self.perform_delete(request, *args, **kwargs)
88+
def delete(self, request, *args, **kwargs) -> Response:
89+
return super().delete(request, *args, **kwargs)

django/thunderstore/api/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
name="cyberstorm.team.service-account.create",
119119
),
120120
path(
121-
"team/<str:team_name>/service-account/delete/",
121+
"team/<str:team_name>/service-account/delete/<uuid:uuid>/",
122122
DeleteServiceAccountAPIView.as_view(),
123123
name="cyberstorm.team.service-account.delete",
124124
),

0 commit comments

Comments
 (0)