From 983769a944ca484d074ddf09f30b13a3dc927d60 Mon Sep 17 00:00:00 2001 From: Henit Chobisa Date: Tue, 6 Aug 2024 17:26:20 +0530 Subject: [PATCH] feat: added endpoint for creating service tokens (#5312) * feat: added endpoint for creating service tokens * fix: removed filtering of APITokens without being a service token --- apiserver/plane/app/urls/api.py | 7 ++++- apiserver/plane/app/views/__init__.py | 6 ++-- apiserver/plane/app/views/api.py | 44 ++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/app/urls/api.py b/apiserver/plane/app/urls/api.py index b77ea8530..592ff53b5 100644 --- a/apiserver/plane/app/urls/api.py +++ b/apiserver/plane/app/urls/api.py @@ -1,5 +1,5 @@ from django.urls import path -from plane.app.views import ApiTokenEndpoint +from plane.app.views import ApiTokenEndpoint, ServiceApiTokenEndpoint urlpatterns = [ # API Tokens @@ -13,5 +13,10 @@ urlpatterns = [ ApiTokenEndpoint.as_view(), name="api-tokens", ), + path( + "workspaces//service-api-tokens/", + ServiceApiTokenEndpoint.as_view(), + name="service-api-tokens", + ), ## End API Tokens ] diff --git a/apiserver/plane/app/views/__init__.py b/apiserver/plane/app/views/__init__.py index 0babdf5d8..9d8929fda 100644 --- a/apiserver/plane/app/views/__init__.py +++ b/apiserver/plane/app/views/__init__.py @@ -174,8 +174,10 @@ from .module.archive import ( ModuleArchiveUnarchiveEndpoint, ) -from .api import ApiTokenEndpoint - +from .api import ( + ApiTokenEndpoint, + ServiceApiTokenEndpoint, +) from .page.base import ( PageViewSet, diff --git a/apiserver/plane/app/views/api.py b/apiserver/plane/app/views/api.py index 6cd349b07..fe7259fbb 100644 --- a/apiserver/plane/app/views/api.py +++ b/apiserver/plane/app/views/api.py @@ -45,7 +45,7 @@ class ApiTokenEndpoint(BaseAPIView): def get(self, request, slug, pk=None): if pk is None: api_tokens = APIToken.objects.filter( - user=request.user, workspace__slug=slug + user=request.user, workspace__slug=slug, is_service=False ) serializer = APITokenReadSerializer(api_tokens, many=True) return Response(serializer.data, status=status.HTTP_200_OK) @@ -61,6 +61,7 @@ class ApiTokenEndpoint(BaseAPIView): workspace__slug=slug, user=request.user, pk=pk, + is_service=False, ) api_token.delete() return Response(status=status.HTTP_204_NO_CONTENT) @@ -78,3 +79,44 @@ class ApiTokenEndpoint(BaseAPIView): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class ServiceApiTokenEndpoint(BaseAPIView): + permission_classes = [ + WorkspaceOwnerPermission, + ] + + def post(self, request, slug): + workspace = Workspace.objects.get(slug=slug) + + api_token = APIToken.objects.filter( + workspace=workspace, + is_service=True, + ).first() + + if api_token: + return Response( + { + "token": str(api_token.token), + }, + status=status.HTTP_200_OK, + ) + else: + # Check the user type + user_type = 1 if request.user.is_bot else 0 + + api_token = APIToken.objects.create( + label=str(uuid4().hex), + description="Service Token", + user=request.user, + workspace=workspace, + user_type=user_type, + is_service=True, + ) + return Response( + { + "token": str(api_token.token), + }, + status=status.HTTP_201_CREATED, + ) +