From 32df1270c4e0cfa12f5f40d7850b9a7ac85ee176 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Sun, 3 Aug 2025 20:15:12 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[#72]=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=EC=97=90=20total?= =?UTF-8?q?=5Fpage=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/services.py | 7 ++++-- users/views.py | 63 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/users/services.py b/users/services.py index d81e6e6..efb5053 100644 --- a/users/services.py +++ b/users/services.py @@ -1,4 +1,4 @@ -import requests +import requests, math from .models import * from projects.models import * @@ -133,4 +133,7 @@ class GithubTokenService: "scope": data.get("scope", ""), "token_type": data.get("token_type", "bearer"), }, - ) \ No newline at end of file + ) + + def cal_github_total_page(list_count, page_size): + return math.ceil(list_count / page_size) \ No newline at end of file diff --git a/users/views.py b/users/views.py index 8e7f569..b3b3684 100644 --- a/users/views.py +++ b/users/views.py @@ -1,3 +1,5 @@ +import math + from django.conf import settings from django.shortcuts import get_object_or_404 @@ -36,7 +38,7 @@ from google.auth.transport import requests from github import Github, GithubException CACHE_TIMEOUT = 60 * 60 -COMMIT_PAGE_SIZE = 20 +PAGE_SIZE = 20 class RefreshAPIView(APIView): permission_classes = [AllowAny] @@ -129,7 +131,7 @@ class GithubAPIViewSet(viewsets.ViewSet): token = self.request.user.github_token.access_token cache.set(cache_key, token, timeout=CACHE_TIMEOUT) - return Github(token, per_page=COMMIT_PAGE_SIZE) + return Github(token, per_page=PAGE_SIZE) @cached_property def github(self): @@ -158,11 +160,17 @@ class GithubAPIViewSet(viewsets.ViewSet): return Response({"is_page_gte_1": False, "detail": "page and page_size must be >= 1"}, status=status.HTTP_400_BAD_REQUEST) user = self.github.get_user() - data = [ - {'full_name': r.full_name} - for r in user.get_repos().get_page(page-1) - ] - return Response(data, status=status.HTTP_200_OK) + repo_list = user.get_repos() + total_page = GithubTokenService.cal_github_total_page(repo_list.totalCount, PAGE_SIZE) + repos = repo_list.get_page(page - 1) + data = [{'full_name': r.full_name} for r in repos] + + return Response({ + "page": page, + "page_size": PAGE_SIZE, + "total_page": total_page, + "results": data + }, status=status.HTTP_200_OK) @action(detail=False, methods=["get"], url_path="commits") def commits(self, request): @@ -180,7 +188,9 @@ class GithubAPIViewSet(viewsets.ViewSet): try: repo = self.github.get_repo(repo_full_name) - commits = repo.get_commits().get_page(page-1) + commit_list = repo.get_commits() + total_page = GithubTokenService.cal_github_total_page(commit_list.totalCount, PAGE_SIZE) + commits = commit_list.get_page(page - 1) except Exception as e: return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) @@ -191,7 +201,8 @@ class GithubAPIViewSet(viewsets.ViewSet): return Response({ "page": page, - "page_size": COMMIT_PAGE_SIZE, + "page_size": PAGE_SIZE, + "total_page": total_page, "results": data }, status=status.HTTP_200_OK) @@ -233,9 +244,17 @@ class GithubAPIViewSet(viewsets.ViewSet): return Response({"is_page_gte_1": False, "detail": "page and page_size must be >= 1"}, status=status.HTTP_400_BAD_REQUEST) user = self.github.get_user() - orgs = user.get_orgs().get_page(page-1) - data = {"org_login": [org.login for org in orgs]} - return Response(data, status=status.HTTP_200_OK) + org_list = user.get_orgs() + total_page = GithubTokenService.cal_github_total_page(org_list.totalCount, PAGE_SIZE) + orgs = org_list.get_page(page - 1) + data = [{'org_login': org.login} for org in orgs] + + return Response({ + "page": page, + "page_size": PAGE_SIZE, + "total_page": total_page, + "results": data + }, status=status.HTTP_200_OK) @action(detail=False, methods=["get"], url_path="organization-repos") def organization_repos(self, request): @@ -248,13 +267,21 @@ class GithubAPIViewSet(viewsets.ViewSet): return Response({"is_page_gte_1": False, "detail": "page and page_size must be >= 1"}, status=status.HTTP_400_BAD_REQUEST) org_login = request.query_params.get("org") - repos = self.github.get_organization(org_login).get_repos().get_page(page-1) - data = [ - {'full_name': r.full_name} - for r in repos - ] - return Response(data, status=status.HTTP_200_OK) + if not org_login: + return Response({"is_query_param": False, "detail": "org parameter is required"}, status=status.HTTP_400_BAD_REQUEST) + + repo_list = self.github.get_organization(org_login).get_repos() + total_page = GithubTokenService.cal_github_total_page(repo_list.totalCount, PAGE_SIZE) + repos = repo_list.get_page(page - 1) + data = [{'full_name': r.full_name} for r in repos] + + return Response({ + "page": page, + "page_size": PAGE_SIZE, + "total_page": total_page, + "results": data + }, status=status.HTTP_200_OK) class JoinAPIView(APIView):