1

我正在使用 GitHub API V4 构建一个 cli 应用程序。我需要删除存储库的所有标签。

网址: https ://api.github.com/graphql

标题:

  • 接受:application/vnd.github.bane-preview+json
  • 授权:不记名<GITHUB_TOKEN>

我需要获取GetLabelID查询结果并将其放入突变中idDeleteLabels

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
                }
            ]
        }
    }
}

我可能会创建两个不同的请求并使用它来一一删除每个标签。但我认为这不是一个好主意。我正在寻找替代方案或更好的方法来做到这一点。

感谢您提前提供任何帮助。

参考:

4

0 回答 0