Unify subgroups and projects pagination on the backend
### **Problem Statement** Right now, we show **subgroups** and **projects** together on one page in [**Security Inventory**](https://gitlab.com/groups/gitlab-org/-/security/inventory), but: * They come from **two separate GraphQL connections**: * `group.descendantGroups` * `group.projects` * Each has its **own cursor-based pagination** (`pageInfo.after`, `before`, `endCursor`). The frontend merges both lists and handles paging manually. This causes several issues: * Complex state management (traversing two cursors, and maintaining their states). * Difficult to keep a consistent page size * Back navigation (`before` pagination) is technically possible but unreliable. * Future implementation of sorting / filtering may increase complexity #### **Proposal** Move pagination and merging logic to the **backend** by introducing a new GraphQL field: `group {`\ ` subgroupsAndProjects(first: Int, after: String, before: String): GroupItemsConnection!`\ `}` This field would: * Fetch both descendant groups and projects internally. * Return them in order: **all groups first**, then **projects**. * Use a single **unified cursor** (`pageInfo` with one `endCursor`, `hasNextPage`, `hasPreviousPage`). * Maintain a stable page size and consistent pagination boundaries. --- #### **References** GitLab supports both cursor-based pagination and offset-based pagination through GraphQL - prefers cursor-based * https://docs.gitlab.com/development/graphql_guide/pagination/ * https://docs.gitlab.com/development/database/pagination_guidelines/ --- #### **Next Steps** * Confirm feasibility of new `subgroupsAndProjects` resolver. * Implement and test pagination in both directions. * Update frontend to use new single connection. * Remove frontend merge and “Load more” workaround.
issue