44from typing import cast
55
66from django .core import signing
7+ from drf_spectacular .utils import OpenApiResponse , extend_schema , extend_schema_view
78from rest_framework import status
89from rest_framework .generics import GenericAPIView , ListAPIView
910from rest_framework .permissions import AllowAny
1213from accounts .models import Account
1314from baby_serverlist .models import SERVERLIST_TOKEN_SALT , BabyServer
1415from 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)
1921from 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
2331logger = 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+ )
2643class 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+ )
6287class 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+ )
82114class 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+ )
103144class 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+ )
120169class 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