Skip to content

Commit 369d278

Browse files
authored
feat: annotate endpoint responses for auto documentation (#104)
1 parent b0820ad commit 369d278

File tree

2 files changed

+94
-10
lines changed

2 files changed

+94
-10
lines changed

src/baby_serverlist/api/serializers.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,41 @@ class ServerStatusSerializer(serializers.Serializer):
2222
GoodFileVersion = serializers.CharField()
2323

2424

25-
class ActiveServersSerializer(serializers.Serializer):
26-
CashDateTime = serializers.DateTimeField()
27-
servers = ServerStatusSerializer(many=True)
25+
class CachedServerStatusSerializer(serializers.Serializer):
26+
Passworded = serializers.BooleanField()
27+
ServerName = serializers.CharField()
28+
ForkName = serializers.CharField()
29+
BuildVersion = serializers.IntegerField()
30+
CurrentMap = serializers.CharField()
31+
GameMode = serializers.CharField()
32+
IngameTime = serializers.CharField()
33+
RoundTime = serializers.CharField()
34+
PlayerCount = serializers.IntegerField()
35+
PlayerCountMax = serializers.IntegerField()
36+
ServerIP = serializers.CharField()
37+
ServerPort = serializers.IntegerField()
38+
WinDownload = serializers.CharField()
39+
OSXDownload = serializers.CharField()
40+
LinuxDownload = serializers.CharField()
41+
fps = serializers.IntegerField()
42+
GoodFileVersion = serializers.CharField()
43+
44+
45+
class OwnedBabyServerSerializer(serializers.Serializer):
46+
id = serializers.UUIDField()
47+
whitelisted = serializers.BooleanField()
48+
live = serializers.BooleanField()
49+
status = CachedServerStatusSerializer(allow_null=True)
50+
51+
52+
class BabyServerTokenSerializer(serializers.Serializer):
53+
id = serializers.UUIDField()
54+
serverlist_token = serializers.CharField()
55+
whitelisted = serializers.BooleanField()
56+
57+
58+
class BabyServerStatusListSerializer(serializers.Serializer):
59+
servers = CachedServerStatusSerializer(many=True)
2860

2961

3062
class RegenerateServerlistTokenSerializer(serializers.Serializer):

src/baby_serverlist/api/views.py

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import cast
55

66
from django.core import signing
7+
from drf_spectacular.utils import OpenApiResponse, extend_schema, extend_schema_view
78
from rest_framework import status
89
from rest_framework.generics import GenericAPIView, ListAPIView
910
from rest_framework.permissions import AllowAny
@@ -12,19 +13,38 @@
1213
from accounts.models import Account
1314
from baby_serverlist.models import SERVERLIST_TOKEN_SALT, BabyServer
1415
from commons.cache import (
16+
get_baby_server_status,
1517
get_many_baby_server_statuses,
1618
set_baby_server_heartbeat,
1719
set_baby_server_status,
1820
)
1921
from commons.error_response import ErrorResponse
2022

21-
from .serializers import RegenerateServerlistTokenSerializer, ServerStatusSerializer
23+
from .serializers import (
24+
BabyServerStatusListSerializer,
25+
BabyServerTokenSerializer,
26+
OwnedBabyServerSerializer,
27+
RegenerateServerlistTokenSerializer,
28+
ServerStatusSerializer,
29+
)
2230

2331
logger = logging.getLogger(__name__)
2432

2533

34+
@extend_schema_view(
35+
post=extend_schema(
36+
request=ServerStatusSerializer,
37+
responses={
38+
200: OpenApiResponse(description="Status accepted and cached"),
39+
400: OpenApiResponse(description="Invalid payload or signature"),
40+
},
41+
)
42+
)
2643
class PostServerStatusView(GenericAPIView):
27-
"""Accepts signed status payloads from baby servers and stores the latest state in cache."""
44+
"""Accepts signed status payloads from baby servers and stores the latest state in cache.
45+
46+
*** Public Endpoint ***
47+
"""
2848

2949
serializer_class = ServerStatusSerializer
3050
permission_classes = (AllowAny,)
@@ -59,14 +79,21 @@ def post(self, request, *args, **kwargs):
5979
return Response(status=status.HTTP_200_OK)
6080

6181

82+
@extend_schema_view(
83+
post=extend_schema(
84+
responses={201: BabyServerTokenSerializer},
85+
)
86+
)
6287
class CreateBabyServerView(GenericAPIView):
63-
"""Creates a new baby server for the authenticated user and returns the freshly minted token."""
88+
"""Creates a new baby server for the authenticated user and returns the freshly minted token.
89+
90+
*** Requires Token Authentication. ***
91+
"""
6492

6593
queryset = BabyServer.objects.all()
6694

6795
def post(self, request, *args, **kwargs):
6896
user = cast(Account, request.user)
69-
7097
baby_server = BabyServer.objects.create(owner=user)
7198

7299
return Response(
@@ -79,8 +106,16 @@ def post(self, request, *args, **kwargs):
79106
)
80107

81108

109+
@extend_schema_view(
110+
list=extend_schema(
111+
responses={200: OwnedBabyServerSerializer(many=True)},
112+
)
113+
)
82114
class ListOwnedBabyServersView(ListAPIView):
83-
"""Lists the caller's baby servers with a derived `live` flag based on recent heartbeats."""
115+
"""Lists the caller's baby servers with a derived `live` flag based on recent heartbeats.
116+
117+
*** Requires Token Authentication. ***
118+
"""
84119

85120
def get_queryset(self):
86121
user = cast(Account, self.request.user)
@@ -94,14 +129,23 @@ def list(self, request, *args, **kwargs):
94129
"id": str(server.id),
95130
"whitelisted": server.whitelisted,
96131
"live": server.is_live(),
132+
"status": get_baby_server_status(server.id),
97133
}
98134
for server in queryset
99135
]
100136
return Response(data, status=status.HTTP_200_OK)
101137

102138

139+
@extend_schema_view(
140+
list=extend_schema(
141+
responses={200: BabyServerStatusListSerializer},
142+
)
143+
)
103144
class ListBabyServersView(ListAPIView):
104-
"""Return cached status payloads for all baby servers that have reported recently."""
145+
"""Return cached status payloads for all baby servers that have reported recently.
146+
147+
*** Public Endpoint ***
148+
"""
105149

106150
permission_classes = (AllowAny,)
107151

@@ -117,8 +161,16 @@ def list(self, request, *args, **kwargs):
117161
return Response({"servers": data}, status=status.HTTP_200_OK)
118162

119163

164+
@extend_schema_view(
165+
post=extend_schema(
166+
responses={200: BabyServerTokenSerializer},
167+
)
168+
)
120169
class RegenerateServerlistTokenView(GenericAPIView):
121-
"""Regenerates a server's signed token after validating ownership."""
170+
"""Regenerates a server's signed token after validating ownership.
171+
172+
*** Requires Token Authentication. ***
173+
"""
122174

123175
serializer_class = RegenerateServerlistTokenSerializer
124176
queryset = BabyServer.objects.all()

0 commit comments

Comments
 (0)