Fix metadata resolver query

This commit is contained in:
Mislav Marohnić 2020-05-12 16:48:30 +02:00
parent 3abc2be0f7
commit 386a53c34a
4 changed files with 64 additions and 69 deletions

View file

@ -623,6 +623,7 @@ func RepoResolveMetadataIDs(client *Client, repo ghrepo.Interface, input RepoRes
} }
query := &bytes.Buffer{} query := &bytes.Buffer{}
fmt.Fprint(query, "{\n")
for i, u := range users { for i, u := range users {
fmt.Fprintf(query, "u%03d: user(login:%q){id,login}\n", i, u) fmt.Fprintf(query, "u%03d: user(login:%q){id,login}\n", i, u)
} }
@ -640,6 +641,7 @@ func RepoResolveMetadataIDs(client *Client, repo ghrepo.Interface, input RepoRes
} }
fmt.Fprint(query, "}\n") fmt.Fprint(query, "}\n")
} }
fmt.Fprint(query, "}\n")
response := make(map[string]json.RawMessage) response := make(map[string]json.RawMessage)
err = client.GraphQL(query.String(), nil, &response) err = client.GraphQL(query.String(), nil, &response)

View file

@ -188,7 +188,8 @@ func Test_RepoResolveMetadataIDs(t *testing.T) {
Labels: []string{"bug", "help wanted"}, Labels: []string{"bug", "help wanted"},
} }
expectedQuery := `u000: user(login:"monalisa"){id,login} expectedQuery := `{
u000: user(login:"monalisa"){id,login}
u001: user(login:"hubot"){id,login} u001: user(login:"hubot"){id,login}
u002: user(login:"octocat"){id,login} u002: user(login:"octocat"){id,login}
repository(owner:"OWNER",name:"REPO"){ repository(owner:"OWNER",name:"REPO"){
@ -199,6 +200,7 @@ organization(login:"OWNER"){
t000: team(slug:"core"){id,slug} t000: team(slug:"core"){id,slug}
t001: team(slug:"robots"){id,slug} t001: team(slug:"robots"){id,slug}
} }
}
` `
responseJSON := ` responseJSON := `
{ "data": { { "data": {

View file

@ -471,25 +471,9 @@ func issueCreate(cmd *cobra.Command, args []string) error {
"body": body, "body": body,
} }
if tb.HasMetadata() { err = addMetadataToIssueParams(apiClient, baseRepo, params, &tb)
if tb.MetadataResult == nil { if err != nil {
resolveInput := api.RepoResolveInput{ return err
Assignees: tb.Assignees,
Labels: tb.Labels,
Projects: tb.Projects,
Milestones: tb.Milestones,
}
tb.MetadataResult, err = api.RepoResolveMetadataIDs(apiClient, baseRepo, resolveInput)
if err != nil {
return err
}
}
err = addMetadataToIssueParams(params, tb.MetadataResult, tb.Assignees, tb.Labels, tb.Projects, tb.Milestones)
if err != nil {
return err
}
} }
newIssue, err := api.IssueCreate(apiClient, repo, params) newIssue, err := api.IssueCreate(apiClient, repo, params)
@ -505,33 +489,79 @@ func issueCreate(cmd *cobra.Command, args []string) error {
return nil return nil
} }
func addMetadataToIssueParams(params map[string]interface{}, metadata *api.RepoMetadataResult, assignees, labelNames, projectNames, milestoneTitles []string) error { func addMetadataToIssueParams(client *api.Client, baseRepo ghrepo.Interface, params map[string]interface{}, tb *issueMetadataState) error {
assigneeIDs, err := metadata.MembersToIDs(assignees) if !tb.HasMetadata() {
return nil
}
if tb.MetadataResult == nil {
resolveInput := api.RepoResolveInput{
Reviewers: tb.Reviewers,
Assignees: tb.Assignees,
Labels: tb.Labels,
Projects: tb.Projects,
Milestones: tb.Milestones,
}
var err error
tb.MetadataResult, err = api.RepoResolveMetadataIDs(client, baseRepo, resolveInput)
if err != nil {
return err
}
}
assigneeIDs, err := tb.MetadataResult.MembersToIDs(tb.Assignees)
if err != nil { if err != nil {
return fmt.Errorf("could not assign user: %w", err) return fmt.Errorf("could not assign user: %w", err)
} }
params["assigneeIds"] = assigneeIDs params["assigneeIds"] = assigneeIDs
labelIDs, err := metadata.LabelsToIDs(labelNames) labelIDs, err := tb.MetadataResult.LabelsToIDs(tb.Labels)
if err != nil { if err != nil {
return fmt.Errorf("could not add label: %w", err) return fmt.Errorf("could not add label: %w", err)
} }
params["labelIds"] = labelIDs params["labelIds"] = labelIDs
projectIDs, err := metadata.ProjectsToIDs(projectNames) projectIDs, err := tb.MetadataResult.ProjectsToIDs(tb.Projects)
if err != nil { if err != nil {
return fmt.Errorf("could not add to project: %w", err) return fmt.Errorf("could not add to project: %w", err)
} }
params["projectIds"] = projectIDs params["projectIds"] = projectIDs
if len(milestoneTitles) > 0 { if len(tb.Milestones) > 0 {
milestoneID, err := metadata.MilestoneToID(milestoneTitles[0]) milestoneID, err := tb.MetadataResult.MilestoneToID(tb.Milestones[0])
if err != nil { if err != nil {
return fmt.Errorf("could not add to milestone '%s': %w", milestoneTitles[0], err) return fmt.Errorf("could not add to milestone '%s': %w", tb.Milestones[0], err)
} }
params["milestoneId"] = milestoneID params["milestoneId"] = milestoneID
} }
if len(tb.Reviewers) == 0 {
return nil
}
var userReviewers []string
var teamReviewers []string
for _, r := range tb.Reviewers {
if strings.ContainsRune(r, '/') {
teamReviewers = append(teamReviewers, r)
} else {
userReviewers = append(teamReviewers, r)
}
}
userReviewerIDs, err := tb.MetadataResult.MembersToIDs(userReviewers)
if err != nil {
return fmt.Errorf("could not request reviewer: %w", err)
}
params["userReviewerIds"] = userReviewerIDs
teamReviewerIDs, err := tb.MetadataResult.TeamsToIDs(teamReviewers)
if err != nil {
return fmt.Errorf("could not request reviewer: %w", err)
}
params["teamReviewerIds"] = teamReviewerIDs
return nil return nil
} }

View file

@ -325,48 +325,9 @@ func prCreate(cmd *cobra.Command, _ []string) error {
"headRefName": headBranchLabel, "headRefName": headBranchLabel,
} }
if tb.HasMetadata() { err = addMetadataToIssueParams(client, baseRepo, params, &tb)
if tb.MetadataResult == nil { if err != nil {
resolveInput := api.RepoResolveInput{ return err
Reviewers: tb.Reviewers,
Assignees: tb.Assignees,
Labels: tb.Labels,
Projects: tb.Projects,
Milestones: tb.Milestones,
}
tb.MetadataResult, err = api.RepoResolveMetadataIDs(client, baseRepo, resolveInput)
if err != nil {
return err
}
}
err = addMetadataToIssueParams(params, tb.MetadataResult, tb.Assignees, tb.Labels, tb.Projects, tb.Milestones)
if err != nil {
return err
}
var userReviewers []string
var teamReviewers []string
for _, r := range tb.Reviewers {
if strings.ContainsRune(r, '/') {
teamReviewers = append(teamReviewers, r)
} else {
userReviewers = append(teamReviewers, r)
}
}
userReviewerIDs, err := tb.MetadataResult.MembersToIDs(userReviewers)
if err != nil {
return fmt.Errorf("could not request reviewer: %w", err)
}
params["userReviewerIds"] = userReviewerIDs
teamReviewerIDs, err := tb.MetadataResult.TeamsToIDs(teamReviewers)
if err != nil {
return fmt.Errorf("could not request reviewer: %w", err)
}
params["teamReviewerIds"] = teamReviewerIDs
} }
pr, err := api.CreatePullRequest(client, baseRepo, params) pr, err := api.CreatePullRequest(client, baseRepo, params)