| 155 | } |
| 156 | |
| 157 | func MetadataSurvey(p Prompt, io *iostreams.IOStreams, baseRepo ghrepo.Interface, fetcher RepoMetadataFetcher, state *IssueMetadataState, projectsV1Support gh.ProjectsV1Support, reviewerSearchFunc func(string) prompter.MultiSelectSearchResult, assigneeSearchFunc func(string) prompter.MultiSelectSearchResult) error { |
| 158 | isChosen := func(m string) bool { |
| 159 | for _, c := range state.Metadata { |
| 160 | if m == c { |
| 161 | return true |
| 162 | } |
| 163 | } |
| 164 | return false |
| 165 | } |
| 166 | |
| 167 | allowReviewers := state.Type == PRMetadata |
| 168 | |
| 169 | extraFieldsOptions := []string{} |
| 170 | if allowReviewers { |
| 171 | extraFieldsOptions = append(extraFieldsOptions, "Reviewers") |
| 172 | } |
| 173 | extraFieldsOptions = append(extraFieldsOptions, "Assignees", "Labels", "Projects", "Milestone") |
| 174 | |
| 175 | selected, err := p.MultiSelect("What would you like to add?", nil, extraFieldsOptions) |
| 176 | if err != nil { |
| 177 | return err |
| 178 | } |
| 179 | for _, i := range selected { |
| 180 | state.Metadata = append(state.Metadata, extraFieldsOptions[i]) |
| 181 | } |
| 182 | |
| 183 | // Retrieve and process data for survey prompts based on the extra fields selected. |
| 184 | // When search-based selection is available, skip the expensive assignable-users |
| 185 | // and teams fetch since they are found dynamically via the search function. |
| 186 | // TODO ApiActorsSupported |
| 187 | useReviewerSearch := state.ApiActorsSupported && reviewerSearchFunc != nil |
| 188 | useAssigneeSearch := state.ApiActorsSupported && assigneeSearchFunc != nil |
| 189 | metadataInput := api.RepoMetadataInput{ |
| 190 | Reviewers: isChosen("Reviewers") && !useReviewerSearch, |
| 191 | TeamReviewers: isChosen("Reviewers") && !useReviewerSearch, |
| 192 | Assignees: isChosen("Assignees") && !useAssigneeSearch, |
| 193 | ApiActorsSupported: state.ApiActorsSupported, |
| 194 | Labels: isChosen("Labels"), |
| 195 | ProjectsV1: isChosen("Projects") && projectsV1Support == gh.ProjectsV1Supported, |
| 196 | ProjectsV2: isChosen("Projects"), |
| 197 | Milestones: isChosen("Milestone"), |
| 198 | } |
| 199 | metadataResult, err := fetcher.RepoMetadataFetch(metadataInput) |
| 200 | if err != nil { |
| 201 | return fmt.Errorf("error fetching metadata options: %w", err) |
| 202 | } |
| 203 | |
| 204 | var reviewers []string |
| 205 | if !useReviewerSearch { |
| 206 | for _, u := range metadataResult.AssignableUsers { |
| 207 | if u.Login() != metadataResult.CurrentLogin { |
| 208 | reviewers = append(reviewers, u.DisplayName()) |
| 209 | } |
| 210 | } |
| 211 | for _, t := range metadataResult.Teams { |
| 212 | reviewers = append(reviewers, fmt.Sprintf("%s/%s", baseRepo.RepoOwner(), t.Slug)) |
| 213 | } |
| 214 | } |