Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions internal/api/confluence.go
Original file line number Diff line number Diff line change
Expand Up @@ -702,9 +702,39 @@ func (s *ConfluenceService) GetPageChildren(ctx context.Context, pageID string,
return nil, err
}

// v2 API returns empty Type for pages — set it explicitly
for _, child := range result.Results {
if child.Type == "" {
child.Type = "page"
}
}

return &result, nil
}

// GetChildFolders gets immediate child folders of a page using CQL search.
// The v2 /pages/{id}/children endpoint only returns pages, not folders.
// This uses v1 CQL search with "parent = {id} AND type = folder" as a workaround.
// Limited to 100 results (no pagination) — sufficient for practical use.
func (s *ConfluenceService) GetChildFolders(ctx context.Context, pageID string) ([]*PageChild, error) {
cql := fmt.Sprintf("parent = %s AND type = folder", pageID)
searchResult, err := s.SearchWithCQL(ctx, cql, 100, "")
if err != nil {
return nil, err
}

folders := make([]*PageChild, 0, len(searchResult.Results))
for _, r := range searchResult.Results {
folders = append(folders, &PageChild{
ID: r.ID,
Title: r.Title,
Status: r.Status,
Type: "folder",
})
}
return folders, nil
}

// GetPageDescendants gets all descendants of a page (children, grandchildren, etc.).
func (s *ConfluenceService) GetPageDescendants(ctx context.Context, pageID string, limit int, cursor string) (*ChildrenResponse, error) {
path := fmt.Sprintf("%s/pages/%s/descendants", s.baseURL(), pageID)
Expand Down
10 changes: 10 additions & 0 deletions internal/cmd/confluence/page/children.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,16 @@ func runChildren(opts *ChildrenOptions) error {
return fmt.Errorf("failed to get children: %w", err)
}
children = result.Results

// Also fetch child folders (v2 API only returns pages, not folders)
if opts.Type == "" || opts.Type == "folder" {
folders, folderErr := confluence.GetChildFolders(ctx, opts.PageID)
if folderErr != nil {
fmt.Fprintf(opts.IO.ErrOut, "Warning: could not fetch child folders: %v\n", folderErr)
} else {
children = append(children, folders...)
}
}
}

if err != nil {
Expand Down
Loading