addProjectItem adds an item to a project by resolving the issue/PR number to a node ID
(ctx context.Context, gqlClient *githubv4.Client, owner, ownerType string, projectNumber int, itemOwner, itemRepo string, itemNumber int, itemType string)
| 1181 | |
| 1182 | // addProjectItem adds an item to a project by resolving the issue/PR number to a node ID |
| 1183 | func addProjectItem(ctx context.Context, gqlClient *githubv4.Client, owner, ownerType string, projectNumber int, itemOwner, itemRepo string, itemNumber int, itemType string) (*mcp.CallToolResult, any, error) { |
| 1184 | if itemType != "issue" && itemType != "pull_request" { |
| 1185 | return utils.NewToolResultError("item_type must be either 'issue' or 'pull_request'"), nil, nil |
| 1186 | } |
| 1187 | |
| 1188 | // Resolve the item number to a node ID |
| 1189 | var nodeID githubv4.ID |
| 1190 | var err error |
| 1191 | if itemType == "issue" { |
| 1192 | nodeID, err = resolveIssueNodeID(ctx, gqlClient, itemOwner, itemRepo, itemNumber) |
| 1193 | } else { |
| 1194 | nodeID, err = resolvePullRequestNodeID(ctx, gqlClient, itemOwner, itemRepo, itemNumber) |
| 1195 | } |
| 1196 | if err != nil { |
| 1197 | return utils.NewToolResultError(fmt.Sprintf("failed to resolve %s: %v", itemType, err)), nil, nil |
| 1198 | } |
| 1199 | |
| 1200 | // Use GraphQL to add the item to the project |
| 1201 | var mutation struct { |
| 1202 | AddProjectV2ItemByID struct { |
| 1203 | Item struct { |
| 1204 | ID githubv4.ID |
| 1205 | FullDatabaseID string `graphql:"fullDatabaseId"` |
| 1206 | } |
| 1207 | } `graphql:"addProjectV2ItemById(input: $input)"` |
| 1208 | } |
| 1209 | |
| 1210 | // Resolve the project number to a node ID |
| 1211 | projectID, err := resolveProjectNodeID(ctx, gqlClient, owner, ownerType, projectNumber) |
| 1212 | if err != nil { |
| 1213 | return utils.NewToolResultError(err.Error()), nil, nil |
| 1214 | } |
| 1215 | |
| 1216 | // Add the item to the project |
| 1217 | input := githubv4.AddProjectV2ItemByIdInput{ |
| 1218 | ProjectID: projectID, |
| 1219 | ContentID: nodeID, |
| 1220 | } |
| 1221 | |
| 1222 | err = gqlClient.Mutate(ctx, &mutation, input, nil) |
| 1223 | if err != nil { |
| 1224 | return utils.NewToolResultError(fmt.Sprintf(ProjectAddFailedError+": %v", err)), nil, nil |
| 1225 | } |
| 1226 | |
| 1227 | result := map[string]any{ |
| 1228 | "id": mutation.AddProjectV2ItemByID.Item.ID, |
| 1229 | "message": fmt.Sprintf("Successfully added %s %s/%s#%d to project %s/%d", itemType, itemOwner, itemRepo, itemNumber, owner, projectNumber), |
| 1230 | } |
| 1231 | if fullDatabaseID := mutation.AddProjectV2ItemByID.Item.FullDatabaseID; fullDatabaseID != "" { |
| 1232 | result["full_database_id"] = fullDatabaseID |
| 1233 | if itemID, err := strconv.ParseInt(fullDatabaseID, 10, 64); err == nil { |
| 1234 | result["item_id"] = itemID |
| 1235 | } |
| 1236 | } |
| 1237 | |
| 1238 | r, err := json.Marshal(result) |
| 1239 | if err != nil { |
| 1240 | return nil, nil, fmt.Errorf("failed to marshal response: %w", err) |
no test coverage detected