From a5cd7e83269352b4bfaae21e54519aae5803131a Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 4 Oct 2023 17:30:17 +0530 Subject: [PATCH 1/3] chore: project covers endpoint --- apiserver/plane/api/urls.py | 6 +++++ apiserver/plane/api/views/__init__.py | 1 + apiserver/plane/api/views/project.py | 33 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/apiserver/plane/api/urls.py b/apiserver/plane/api/urls.py index c10c4a74562..01ebab00b1e 100644 --- a/apiserver/plane/api/urls.py +++ b/apiserver/plane/api/urls.py @@ -70,6 +70,7 @@ ProjectIdentifierEndpoint, ProjectFavoritesViewSet, LeaveProjectEndpoint, + ProjectPublicCoverImagesEndpoint, ## End Projects # Issues IssueViewSet, @@ -573,6 +574,11 @@ LeaveProjectEndpoint.as_view(), name="project", ), + path( + "project-covers/", + ProjectPublicCoverImagesEndpoint.as_view(), + name="project-covers", + ), # End Projects # States path( diff --git a/apiserver/plane/api/views/__init__.py b/apiserver/plane/api/views/__init__.py index c03d6d5b7f9..4475c9e4cb3 100644 --- a/apiserver/plane/api/views/__init__.py +++ b/apiserver/plane/api/views/__init__.py @@ -17,6 +17,7 @@ ProjectMemberEndpoint, WorkspaceProjectDeployBoardEndpoint, LeaveProjectEndpoint, + ProjectPublicCoverImagesEndpoint, ) from .user import ( UserEndpoint, diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index c72b8d42315..156c8161f41 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -1,5 +1,6 @@ # Python imports import jwt +import boto3 from datetime import datetime # Django imports @@ -1209,3 +1210,35 @@ def delete(self, request, slug, project_id): {"error": "Something went wrong please try again later"}, status=status.HTTP_400_BAD_REQUEST, ) + + + +class ProjectPublicCoverImagesEndpoint(BaseAPIView): + + permission_classes = [AllowAny,] + + def get(self, request): + try: + files = [] + s3 = boto3.client( + "s3", + aws_access_key_id=settings.AWS_ACCESS_KEY_ID, + aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, + ) + params = { + 'Bucket': settings.AWS_S3_BUCKET_NAME, + 'Prefix': "static/project-cover/" + } + + response = s3.list_objects_v2(**params) + # Extracting file keys from the response + if 'Contents' in response: + for content in response['Contents']: + if not content['Key'].endswith('/'): # This line ensures we're only getting files, not "sub-folders" + files.append(f"https://{settings.AWS_S3_BUCKET_NAME}.s3.{settings.AWS_REGION}.amazonaws.com/{content['Key']}") + + return Response(files, status=status.HTTP_200_OK) + except Exception as e: + print(e) + capture_exception(e) + return Response([], status=status.HTTP_200_OK) From 99392a426b7fda88047ce18db1b3a45aaa0c4687 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 4 Oct 2023 17:32:36 +0530 Subject: [PATCH 2/3] dev: remove print logs --- apiserver/plane/api/views/project.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 156c8161f41..566958ac9de 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -1239,6 +1239,5 @@ def get(self, request): return Response(files, status=status.HTTP_200_OK) except Exception as e: - print(e) capture_exception(e) return Response([], status=status.HTTP_200_OK) From ae98451759707ac79d2723ebe5e40c94177d8087 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 4 Oct 2023 17:34:26 +0530 Subject: [PATCH 3/3] dev: formatting --- apiserver/plane/api/views/project.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 566958ac9de..0f4fd5594f6 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -618,7 +618,8 @@ def destroy(self, request, slug, project_id, pk): return Response(status=status.HTTP_204_NO_CONTENT) except ProjectMember.DoesNotExist: return Response( - {"error": "Project Member does not exist"}, status=status.HTTP_400_BAD_REQUEST + {"error": "Project Member does not exist"}, + status=status.HTTP_400_BAD_REQUEST, ) except Exception as e: capture_exception(e) @@ -1212,10 +1213,10 @@ def delete(self, request, slug, project_id): ) - class ProjectPublicCoverImagesEndpoint(BaseAPIView): - - permission_classes = [AllowAny,] + permission_classes = [ + AllowAny, + ] def get(self, request): try: @@ -1226,16 +1227,20 @@ def get(self, request): aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, ) params = { - 'Bucket': settings.AWS_S3_BUCKET_NAME, - 'Prefix': "static/project-cover/" + "Bucket": settings.AWS_S3_BUCKET_NAME, + "Prefix": "static/project-cover/", } response = s3.list_objects_v2(**params) # Extracting file keys from the response - if 'Contents' in response: - for content in response['Contents']: - if not content['Key'].endswith('/'): # This line ensures we're only getting files, not "sub-folders" - files.append(f"https://{settings.AWS_S3_BUCKET_NAME}.s3.{settings.AWS_REGION}.amazonaws.com/{content['Key']}") + if "Contents" in response: + for content in response["Contents"]: + if not content["Key"].endswith( + "/" + ): # This line ensures we're only getting files, not "sub-folders" + files.append( + f"https://{settings.AWS_S3_BUCKET_NAME}.s3.{settings.AWS_REGION}.amazonaws.com/{content['Key']}" + ) return Response(files, status=status.HTTP_200_OK) except Exception as e: