@@ -458,35 +458,71 @@ def create_issue(self, repo_name: str, title: str, body: Optional[str] = NotSet)
458458 logger .error (f"Error creating issue: { e } " )
459459 return json .dumps ({"error" : str (e )})
460460
461- def list_issues (self , repo_name : str , state : str = "open" , limit : int = 20 ) -> str :
462- """List issues for a repository.
461+ def list_issues (self , repo_name : str , state : str = "open" , page : int = 1 , per_page : int = 20 ) -> str :
462+ """List issues for a repository with pagination .
463463
464464 Args:
465465 repo_name (str): The full name of the repository (e.g., 'owner/repo').
466466 state (str, optional): The state of issues to list ('open', 'closed', 'all'). Defaults to 'open'.
467- limit (int, optional): The maximum number of issues to return. Defaults to 20.
467+ page (int, optional): Page number of results to return, counting from 1. Defaults to 1.
468+ per_page (int, optional): Number of results per page. Defaults to 20.
468469 Returns:
469- A JSON-formatted string containing a list of issues.
470+ A JSON-formatted string containing a list of issues with pagination metadata .
470471 """
471- log_debug (f"Listing issues for repository: { repo_name } with state: { state } " )
472+ log_debug (f"Listing issues for repository: { repo_name } with state: { state } , page: { page } , per_page: { per_page } " )
472473 try :
473474 repo = self .g .get_repo (repo_name )
475+
474476 issues = repo .get_issues (state = state )
477+
475478 # Filter out pull requests after fetching issues
476- logger .info (f"Issues: { issues } " )
477- filtered_issues = [issue for issue in issues if not issue .pull_request ]
479+ total_issues = 0
480+ all_issues = []
481+ for issue in issues :
482+ if not issue .pull_request :
483+ all_issues .append (issue )
484+ total_issues += 1
485+
486+ # Calculate pagination metadata
487+ total_pages = (total_issues + per_page - 1 ) // per_page
488+
489+ # Validate page number
490+ if page < 1 :
491+ page = 1
492+ elif page > total_pages and total_pages > 0 :
493+ page = total_pages
494+
495+ # Get the specified page of results
478496 issue_list = []
479- for issue in filtered_issues [:limit ]:
480- issue_info = {
481- "number" : issue .number ,
482- "title" : issue .title ,
483- "user" : issue .user .login ,
484- "created_at" : issue .created_at .isoformat (),
485- "state" : issue .state ,
486- "url" : issue .html_url ,
487- }
488- issue_list .append (issue_info )
489- return json .dumps (issue_list , indent = 2 )
497+ page_start = (page - 1 ) * per_page
498+ page_end = page_start + per_page
499+
500+ for i in range (page_start , min (page_end , total_issues )):
501+ if i < len (all_issues ):
502+ issue = all_issues [i ]
503+ issue_info = {
504+ "number" : issue .number ,
505+ "title" : issue .title ,
506+ "user" : issue .user .login ,
507+ "created_at" : issue .created_at .isoformat (),
508+ "state" : issue .state ,
509+ "url" : issue .html_url ,
510+ }
511+ issue_list .append (issue_info )
512+
513+ meta = {
514+ "current_page" : page ,
515+ "per_page" : per_page ,
516+ "total_items" : total_issues ,
517+ "total_pages" : total_pages
518+ }
519+
520+ response = {
521+ "data" : issue_list ,
522+ "meta" : meta
523+ }
524+
525+ return json .dumps (response , indent = 2 )
490526 except GithubException as e :
491527 logger .error (f"Error listing issues: { e } " )
492528 return json .dumps ({"error" : str (e )})
0 commit comments