我正在使用GitHub API V4构建cli应用程序。我需要删除存储库中所有的标签。
URL: https://api.github.com/graphql
标题:
<GITHUB_TOKEN>
我需要获取GetLabelID
查询的结果并将其放入id
突变处的DeleteLabels
中。
query GetLabelID {
repository(owner: "erdaltsksn", name: "playground") {
labels(first:100) {
nodes {
id
}
}
}
}
mutation DeleteLabels {
deleteLabel(input: {
id: "<ID_SHOULD_BE_HERE>"
}) {
clientMutationId
}
}
输出:
{
"data": {
"repository": {
"labels": {
"nodes": [
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDgy"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDg0"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDg2"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDg4"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDkw"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDkz"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDk1"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDk3"
},
{
"id": "MDU6TGFiZWwyMDg5MzQ0MDk5"
}
]
}
}
}
}
手动输入DeleteLabels
时ID
突变的输出。
{
"data": {
"deleteLabel": {
"clientMutationId": null
}
}
}
在客户端,我将Golang与machinebox / graphql一起使用。一种可能的解决方案是通过在客户端发送两个不同的请求并获得结果来解决此问题。我不确定是否是最佳解决方案。
我的GO代码:
package main
import (
"context"
"fmt"
"os"
"strings"
"github.com/gookit/color"
"github.com/machinebox/graphql"
)
func main() {
RemoveLabels("erdaltsksn/playground")
}
func RemoveLabels(repository string) {
repo := strings.Split(repository, "/")
data := graphqlQuery(fmt.Sprintf(`
query {
repository(owner: "%s", name: "%s") {
labels(first:100) {
totalCount
nodes {
id
}
}
}
}
`, repo[0], repo[1]))
fmt.Println(data)
}
type graphqlQueryResponse struct {
Repository struct {
ID string `json:"id,omitempty"`
Labels struct {
TotalCount int `json:"totalCount,omitempty"`
Nodes []struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Color string `json:"color,omitempty"`
Description string `json:"description,omitempty"`
} `json:"nodes,omitempty"`
} `json:"labels,omitempty"`
} `json:"repository,omitempty"`
}
var graphqlClient = graphql.NewClient("https://api.github.com/graphql")
func graphqlQuery(q string) graphqlQueryResponse {
graphqlRequest := graphql.NewRequest(q)
graphqlRequest.Header.Set("Authorization", "bearer MY_GITHUB_API")
graphqlRequest.Header.Set("Accept", "application/vnd.github.bane-preview+json")
var data graphqlQueryResponse
if err := graphqlClient.Run(context.Background(), graphqlRequest, &data); err != nil {
color.Danger.Println("There is a problem while querying GitHub API v4")
color.Warn.Prompt(err.Error())
os.Exit(1)
}
return data
}
GO的输出:
{
{
{
8
[
{
MDU6TGFiZWwyMDg5MzQ0MDgy
}
{
MDU6TGFiZWwyMDg5MzQ0MDg0
}
{
MDU6TGFiZWwyMDg5MzQ0MDg2
}
{
MDU6TGFiZWwyMDg5MzQ0MDg4
}
{
MDU6TGFiZWwyMDg5MzQ0MDkw
}
{
MDU6TGFiZWwyMDg5MzQ0MDkz
}
{
MDU6TGFiZWwyMDg5MzQ0MDk1
}
{
MDU6TGFiZWwyMDg5MzQ0MDk3
}
]
}
}
}
我可能会创建两个不同的请求,并使用它来删除每个标签。但是我认为这不是一个好主意。我正在寻找替代方法或更好的方法。
谢谢您的帮助。
参考: