Я создаю приложение cli, используя GitHub API V4. Мне нужно удалить все метки, которые есть в репозитории.
URL: https://api.github.com/graphql
HEADERS:
- Принять: application / vnd.github.bane-preview + json
- Авторизация: предъявитель
<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
}
]
}
}
}
Я мог бы создать два разных запроса и использовать их для удаления каждого тега один за другим. Но я думаю, что это плохая идея. Я ищу альтернативу или лучший способ сделать это.
Заранее благодарим за любую помощь.
Ссылки: