Skip to content

Commit dcd169a

Browse files
committed
Add TeamCreateAPI view
1 parent 9776b9d commit dcd169a

File tree

4 files changed

+106
-1
lines changed

4 files changed

+106
-1
lines changed

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,3 +318,63 @@ def test_team_member_add_api_view__when_adding_a_member__fails_because_user_is_n
318318
.count()
319319
== 0
320320
)
321+
322+
323+
@pytest.mark.django_db
324+
def test_team_create__when_creating_a_team__succeeds(
325+
api_client: APIClient,
326+
user: UserType,
327+
):
328+
api_client.force_authenticate(user)
329+
330+
response = api_client.post(
331+
"/api/cyberstorm/teams/create/",
332+
json.dumps({"name": "CoolestTeamNameEver"}),
333+
content_type="application/json",
334+
)
335+
336+
assert response.status_code == 200
337+
response_json = response.json()
338+
assert response_json["name"] == "CoolestTeamNameEver"
339+
assert (
340+
Team.objects.get(name="CoolestTeamNameEver")
341+
.members.filter(user__username=user.username)
342+
.count()
343+
== 1
344+
)
345+
346+
347+
@pytest.mark.django_db
348+
def test_team_create__when_creating_a_team__fails_because_user_is_not_authenticated(
349+
api_client: APIClient,
350+
user: UserType,
351+
):
352+
response = api_client.post(
353+
"/api/cyberstorm/teams/create/",
354+
json.dumps({"name": "CoolestTeamNameEver"}),
355+
content_type="application/json",
356+
)
357+
358+
assert response.status_code == 401
359+
response_json = response.json()
360+
assert response_json["detail"] == "Authentication credentials were not provided."
361+
assert Team.objects.filter(name="CoolestTeamNameEver").count() == 0
362+
363+
364+
@pytest.mark.django_db
365+
def test_team_create__when_creating_a_team__fails_because_team_with_provided_name_exists(
366+
api_client: APIClient,
367+
user: UserType,
368+
team: Team,
369+
):
370+
api_client.force_authenticate(user)
371+
372+
response = api_client.post(
373+
"/api/cyberstorm/teams/create/",
374+
json.dumps({"name": team.name}),
375+
content_type="application/json",
376+
)
377+
378+
assert response.status_code == 400
379+
response_json = response.json()
380+
assert "A team with the provided name already exists" in response_json["name"]

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .package_version_list import PackageVersionListAPIView
1414
from .team import (
1515
TeamAPIView,
16+
TeamCreateAPIView,
1617
TeamMemberAddAPIView,
1718
TeamMemberListAPIView,
1819
TeamServiceAccountListAPIView,
@@ -36,4 +37,5 @@
3637
"PackageRatingRateAPIView",
3738
"PackageDeprecateAPIView",
3839
"PackageListingEditCategoriesAPIView",
40+
"TeamCreateAPIView",
3941
]

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.db.models import Q, QuerySet
2+
from django.http import HttpRequest
23
from rest_framework import serializers
34
from rest_framework.exceptions import PermissionDenied, ValidationError
45
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
@@ -18,7 +19,7 @@
1819
CyberstormAutoSchemaMixin,
1920
conditional_swagger_auto_schema,
2021
)
21-
from thunderstore.repository.forms import AddTeamMemberForm
22+
from thunderstore.repository.forms import AddTeamMemberForm, CreateTeamForm
2223
from thunderstore.repository.models.team import Team, TeamMember
2324

2425

@@ -46,6 +47,42 @@ def check_permissions(self, request: Request) -> None:
4647
raise PermissionDenied()
4748

4849

50+
class CyberstormTeamCreateRequestSerialiazer(serializers.Serializer):
51+
name = serializers.CharField(
52+
max_length=Team._meta.get_field("name").max_length,
53+
validators=Team._meta.get_field("name").validators,
54+
)
55+
56+
57+
class CyberstormTeamCreateResponseSerialiazer(serializers.Serializer):
58+
name = serializers.CharField()
59+
60+
61+
class TeamCreateAPIView(APIView):
62+
permission_classes = [IsAuthenticated]
63+
64+
@conditional_swagger_auto_schema(
65+
request_body=CyberstormTeamCreateRequestSerialiazer,
66+
responses={200: CyberstormTeamCreateResponseSerialiazer},
67+
operation_id="cyberstorm.teams.create",
68+
tags=["cyberstorm"],
69+
)
70+
def post(self, request: HttpRequest):
71+
serializer = CyberstormTeamCreateRequestSerialiazer(data=request.data)
72+
serializer.is_valid(raise_exception=True)
73+
74+
form = CreateTeamForm(
75+
user=request.user,
76+
data=serializer.validated_data,
77+
)
78+
79+
if form.is_valid():
80+
team = form.save()
81+
return Response(CyberstormTeamCreateResponseSerialiazer(team).data)
82+
else:
83+
raise ValidationError(form.errors)
84+
85+
4986
class TeamMemberListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
5087
serializer_class = CyberstormTeamMemberSerializer
5188
filter_backends = [StrictOrderingFilter]

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
PackageVersionListAPIView,
1616
PackageVersionReadmeAPIView,
1717
TeamAPIView,
18+
TeamCreateAPIView,
1819
TeamMemberAddAPIView,
1920
TeamMemberListAPIView,
2021
TeamServiceAccountListAPIView,
@@ -97,6 +98,11 @@
9798
PackageDeprecateAPIView.as_view(),
9899
name="cyberstorm.package.deprecate",
99100
),
101+
path(
102+
"teams/create/",
103+
TeamCreateAPIView.as_view(),
104+
name="cyberstorm.teams.create",
105+
),
100106
path(
101107
"team/<str:team_id>/",
102108
TeamAPIView.as_view(),

0 commit comments

Comments
 (0)