Add pagination support to search_comments

- Add page parameter to search_comments method
- Return dict with pagination metadata (total_count, next_page)
- Update return type from list to dict for consistency

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
George Antonopoulos
2026-01-14 19:36:45 +00:00
parent 43aa595433
commit ad6075629e

View File

@@ -452,7 +452,7 @@ class BasecampSearch:
logger.error(f"Error searching schedule entries: {str(e)}") logger.error(f"Error searching schedule entries: {str(e)}")
return [] return []
def search_comments(self, query=None, recording_id=None, bucket_id=None): def search_comments(self, query=None, recording_id=None, bucket_id=None, page=1):
""" """
Search for comments across resources or for a specific resource. Search for comments across resources or for a specific resource.
@@ -460,23 +460,35 @@ class BasecampSearch:
query (str, optional): Search term to filter comments query (str, optional): Search term to filter comments
recording_id (int, optional): ID of the recording (todo, message, etc.) to search in recording_id (int, optional): ID of the recording (todo, message, etc.) to search in
bucket_id (int, optional): Project/bucket ID bucket_id (int, optional): Project/bucket ID
page (int, optional): Page number for pagination (default: 1)
Returns: Returns:
list: Matching comments dict: Contains 'comments' list (filtered if query provided) and pagination metadata:
- comments: list of matching comments
- total_count: total number of comments (from API)
- next_page: next page number if available, None otherwise
""" """
try: try:
# If both recording_id and bucket_id are provided, get comments for that specific recording # If both recording_id and bucket_id are provided, get comments for that specific recording
if recording_id and bucket_id: if recording_id and bucket_id:
result = self.client.get_comments(bucket_id, recording_id) result = self.client.get_comments(bucket_id, recording_id, page)
comments = result["comments"] comments = result["comments"]
pagination = {
"total_count": result["total_count"],
"next_page": result["next_page"]
}
# Otherwise we can't search across all comments as there's no endpoint for that # Otherwise we can't search across all comments as there's no endpoint for that
else: else:
logger.warning("Cannot search all comments across Basecamp - both recording_id and bucket_id are required") logger.warning("Cannot search all comments across Basecamp - both recording_id and bucket_id are required")
return [{ return {
"content": "To search comments, you need to specify both a recording ID (todo, message, etc.) and a bucket ID. Comments cannot be searched globally in Basecamp.", "comments": [{
"api_limitation": True, "content": "To search comments, you need to specify both a recording ID (todo, message, etc.) and a bucket ID. Comments cannot be searched globally in Basecamp.",
"title": "Comment Search Limitation" "api_limitation": True,
}] "title": "Comment Search Limitation"
}],
"total_count": None,
"next_page": None
}
# Filter by query if provided # Filter by query if provided
if query and comments: if query and comments:
@@ -500,12 +512,18 @@ class BasecampSearch:
if content_matched: if content_matched:
filtered_comments.append(comment) filtered_comments.append(comment)
return filtered_comments return {
"comments": filtered_comments,
**pagination
}
return comments return {
"comments": comments,
**pagination
}
except Exception as e: except Exception as e:
logger.error(f"Error searching comments: {str(e)}") logger.error(f"Error searching comments: {str(e)}")
return [] return {"comments": [], "total_count": None, "next_page": None}
def search_campfire_lines(self, query=None, project_id=None, campfire_id=None): def search_campfire_lines(self, query=None, project_id=None, campfire_id=None):
""" """