fetchExistingIssueFieldValues retrieves the current field values for an issue as IssueRequestFieldValue entries, ready to be merged before an update.
(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueNumber int)
| 400 | // fetchExistingIssueFieldValues retrieves the current field values for an issue |
| 401 | // as IssueRequestFieldValue entries, ready to be merged before an update. |
| 402 | func fetchExistingIssueFieldValues(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueNumber int) ([]*github.IssueRequestFieldValue, error) { |
| 403 | ctxWithFeatures := ghcontext.WithGraphQLFeatures(ctx, "issue_fields", "repo_issue_fields") |
| 404 | |
| 405 | var query struct { |
| 406 | Repository struct { |
| 407 | Issue struct { |
| 408 | IssueFieldValues struct { |
| 409 | Nodes []IssueFieldValueFragment |
| 410 | } `graphql:"issueFieldValues(first: 25)"` |
| 411 | } `graphql:"issue(number: $number)"` |
| 412 | } `graphql:"repository(owner: $owner, name: $repo)"` |
| 413 | } |
| 414 | |
| 415 | vars := map[string]any{ |
| 416 | "owner": githubv4.String(owner), |
| 417 | "repo": githubv4.String(repo), |
| 418 | "number": githubv4.Int(issueNumber), // #nosec G115 - issue numbers are always small positive integers |
| 419 | } |
| 420 | |
| 421 | if err := gqlClient.Query(ctxWithFeatures, &query, vars); err != nil { |
| 422 | return nil, fmt.Errorf("failed to fetch existing issue field values: %w", err) |
| 423 | } |
| 424 | |
| 425 | var result []*github.IssueRequestFieldValue |
| 426 | for _, node := range query.Repository.Issue.IssueFieldValues.Nodes { |
| 427 | var fieldIDStr string |
| 428 | var value any |
| 429 | |
| 430 | switch node.TypeName { |
| 431 | case "IssueFieldDateValue": |
| 432 | fieldIDStr = node.DateValue.Field.FullDatabaseIDStr() |
| 433 | value = string(node.DateValue.Value) |
| 434 | case "IssueFieldNumberValue": |
| 435 | fieldIDStr = node.NumberValue.Field.FullDatabaseIDStr() |
| 436 | value = float64(node.NumberValue.Value) |
| 437 | case "IssueFieldSingleSelectValue": |
| 438 | fieldIDStr = node.SingleSelectValue.Field.FullDatabaseIDStr() |
| 439 | value = string(node.SingleSelectValue.Value) |
| 440 | case "IssueFieldTextValue": |
| 441 | fieldIDStr = node.TextValue.Field.FullDatabaseIDStr() |
| 442 | value = string(node.TextValue.Value) |
| 443 | default: |
| 444 | continue |
| 445 | } |
| 446 | |
| 447 | fieldID := parseFullDatabaseID(fieldIDStr) |
| 448 | if fieldID == 0 { |
| 449 | continue |
| 450 | } |
| 451 | |
| 452 | result = append(result, &github.IssueRequestFieldValue{ |
| 453 | FieldID: fieldID, |
| 454 | Value: value, |
| 455 | }) |
| 456 | } |
| 457 | |
| 458 | return result, nil |
| 459 | } |
no test coverage detected