MCPcopy Create free account
hub / github.com/cli/cli / hydrateSessionPullRequestsAndUsers

Method hydrateSessionPullRequestsAndUsers

pkg/cmd/agent-task/capi/sessions.go:429–511  ·  view source on GitHub ↗

hydrateSessionPullRequestsAndUsers hydrates pull request and user information in sessions

(sessions []session)

Source from the content-addressed store, hash-verified

427
428// hydrateSessionPullRequestsAndUsers hydrates pull request and user information in sessions
429func (c *CAPIClient) hydrateSessionPullRequestsAndUsers(sessions []session) ([]*Session, error) {
430 if len(sessions) == 0 {
431 return nil, nil
432 }
433
434 prNodeIds := make([]string, 0, len(sessions))
435 userNodeIds := make([]string, 0, len(sessions))
436 for _, session := range sessions {
437 if session.ResourceType == "pull" {
438 prNodeID := session.ResourceGlobalID
439 // TODO: probably this can be dropped since the API should always
440 // keep returning the resource global ID.
441 if session.ResourceGlobalID == "" {
442 prNodeID = generatePullRequestNodeID(int64(session.RepoID), session.ResourceID)
443 }
444 if !slices.Contains(prNodeIds, prNodeID) {
445 prNodeIds = append(prNodeIds, prNodeID)
446 }
447 }
448
449 userNodeId := generateUserNodeID(session.UserID)
450 if !slices.Contains(userNodeIds, userNodeId) {
451 userNodeIds = append(userNodeIds, userNodeId)
452 }
453 }
454 apiClient := api.NewClientFromHTTP(c.httpClient)
455
456 var resp struct {
457 Nodes []struct {
458 TypeName string `graphql:"__typename"`
459 PullRequest sessionPullRequest `graphql:"... on PullRequest"`
460 User api.GitHubUser `graphql:"... on User"`
461 } `graphql:"nodes(ids: $ids)"`
462 }
463
464 ids := make([]string, 0, len(prNodeIds)+len(userNodeIds))
465 ids = append(ids, prNodeIds...)
466 ids = append(ids, userNodeIds...)
467
468 // TODO handle pagination
469 err := apiClient.Query(c.host, "FetchPRsAndUsersForAgentTaskSessions", &resp, map[string]any{
470 "ids": ids,
471 })
472
473 if err != nil {
474 return nil, err
475 }
476
477 prMap := make(map[string]*api.PullRequest, len(prNodeIds))
478 userMap := make(map[int64]*api.GitHubUser, len(userNodeIds))
479 for _, node := range resp.Nodes {
480 switch node.TypeName {
481 case "User":
482 userMap[node.User.DatabaseID] = &node.User
483 case "PullRequest":
484 prMap[node.PullRequest.FullDatabaseID] = &api.PullRequest{
485 ID: node.PullRequest.ID,
486 FullDatabaseID: node.PullRequest.FullDatabaseID,

Callers 3

GetSessionMethod · 0.95

Calls 6

NewClientFromHTTPFunction · 0.92
generateUserNodeIDFunction · 0.85
fromAPISessionFunction · 0.85
ContainsMethod · 0.80
QueryMethod · 0.65

Tested by

no test coverage detected