MCPcopy
hub / github.com/cli/cli / hydrateSessionPullRequestsAndUsers

Method hydrateSessionPullRequestsAndUsers

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

hydrateSessionPullRequestsAndUsers hydrates pull request and user information in sessions

(sessions []session)

Source from the content-addressed store, hash-verified

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